摘要:這是項(xiàng)目相關(guān)的代碼就是把代碼變換成代碼當(dāng)前版本的用的是手工轉(zhuǎn)化代碼是比較亂的雖然也比較有效其中支持導(dǎo)致代碼的復(fù)雜性難以降低而且實(shí)際上我當(dāng)前寫(xiě)的幾個(gè)項(xiàng)目都是沒(méi)有開(kāi)啟因?yàn)樘嵘⒉幻黠@另一個(gè)原因是代碼和幾乎是對(duì)應(yīng)的在對(duì)所有文件都打包的前提下查看源
這是 Cirru 項(xiàng)目相關(guān)的代碼, 就是把 Cirru 代碼變換成 JavaScript 代碼
當(dāng)前版本的 CirruScript 用的是手工轉(zhuǎn)化, 代碼是比較亂的, 雖然也比較有效..
其中, SourceMap 支持導(dǎo)致代碼的復(fù)雜性難以降低,
而且, 實(shí)際上我當(dāng)前寫(xiě)的幾個(gè)項(xiàng)目都是沒(méi)有開(kāi)啟 SourceMap, 因?yàn)樘嵘⒉幻黠@
另一個(gè)原因是 CirruScript 代碼和 JavaScript 幾乎是對(duì)應(yīng)的,
在 Webpack 對(duì)所有文件都打包的前提下, 查看 js 源代碼很正常, 也不容易調(diào)試原文件
綜上, 我開(kāi)始考慮繼續(xù)原先一個(gè) Scirpus 項(xiàng)目, 基于 JavaScript AST 編譯 Cirru
而且在未來(lái)版本的重構(gòu)中我會(huì)去掉 CirruScript 的 SourceMap 支持
主要的原理參考下邊三個(gè)鏈接即可:
https://speakerdeck.com/constellation/escodegen-and-esmangle-using-moz...
http://esprima.org/demo/parse.html
https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
其中與 escodegen 相關(guān)的代碼是這樣的, 其中包含了生成 SourceMap 所需的參數(shù):
coffeefs = require "fs" escodegen = require "escodegen" exports.write = (info, ast) -> opts = sourceMap: info.relativePath sourceMapRoot: info.base sourceMapWithCode: yes {code, map} = escodegen.generate ast, opts <-- 傳入 AST 和選項(xiàng), 調(diào)用即可 jsonMap = JSON.stringify map, null, 2 code += " //# sourceMappingURL=./#{info.mapFile}" fs.writeFileSync info.jsPath, code fs.writeFileSync info.mapPath, jsonMap
具體代碼我應(yīng)該是在官方倉(cāng)庫(kù)的示例當(dāng)中抄的:
https://github.com/estools/escodegen/blob/master/test/source-map.js
啰嗦一下最近看 LLVM, 跟編譯 JavaScript 做了一些對(duì)比..
(還不熟悉)但是看匯編的結(jié)果, 感覺(jué)那確實(shí)是 SourceMap 的用武之地
JS 語(yǔ)法在語(yǔ)義方面還是很接近人類(lèi)閱讀習(xí)慣的, 包括 Cirru 也是, 差別已經(jīng)非常小了
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85563.html
摘要:前言是現(xiàn)在幾乎每個(gè)項(xiàng)目中必備的一個(gè)東西,但是其工作原理避不開(kāi)對(duì)的解析在生成的過(guò)程,有引擎,早期了項(xiàng)目,了解這個(gè)之前我們先來(lái)看看這種引擎解析出來(lái)是什么東西。 前言 babel是現(xiàn)在幾乎每個(gè)項(xiàng)目中必備的一個(gè)東西,但是其工作原理避不開(kāi)對(duì)js的解析在生成的過(guò)程,babel有引擎babylon,早期fork了項(xiàng)目acron,了解這個(gè)之前我們先來(lái)看看這種引擎解析出來(lái)是什么東西。不光是babel還有...
摘要:利用抽象語(yǔ)法樹(shù)可以對(duì)你的源代碼進(jìn)行修改優(yōu)化,甚至可以打造自己的編譯工具。 showImg(https://segmentfault.com/img/bVbnELi);這是一棵樹(shù)嘛 直奔主題 抽象語(yǔ)法樹(shù)是js代碼另一種結(jié)構(gòu)映射,可以將js拆解成AST,也可以把AST轉(zhuǎn)成源代碼。這中間的過(guò)程就是我們的用武之地。 利用 抽象語(yǔ)法樹(shù)(AST) 可以對(duì)你的源代碼進(jìn)行修改、優(yōu)化,甚至可以打造自己的...
摘要:例如會(huì)被分解成解析語(yǔ)法分析這個(gè)過(guò)程是將詞法單元流數(shù)組轉(zhuǎn)換成一個(gè)由元素逐級(jí)嵌套所組成的代表了程序語(yǔ)法結(jié)構(gòu)的樹(shù),這個(gè)樹(shù)就叫抽象語(yǔ)法樹(shù)。常用的有使用生成并使用抽象語(yǔ)法樹(shù)。 一般來(lái)說(shuō),程序中的一段源代碼在執(zhí)行之前會(huì)經(jīng)歷下面三個(gè)步驟1 分詞/詞法分析這個(gè)過(guò)程會(huì)將由字符組成的字符串分解成有意義的代碼快,這些代碼塊被稱為詞法單元。例如 var a = 4;會(huì)被分解成 var、a、=、4、; 2 解析...
摘要:而在編譯過(guò)程中通過(guò)語(yǔ)法和詞法的分析得出一顆語(yǔ)法樹(shù),我們可以將它稱為抽象語(yǔ)法樹(shù)也稱為語(yǔ)法樹(shù),指的是源代碼語(yǔ)法所對(duì)應(yīng)的樹(shù)狀結(jié)構(gòu)。而這個(gè)卻恰恰使我們分析打包工具的重點(diǎn)核心。 概述 眼下wepack似乎已經(jīng)成了前端開(kāi)發(fā)中不可缺少的工具之一,而他的一切皆模塊的思想隨著webpack版本不斷的迭代(webpack 4)使其打包速度更快,效率更高的為我們的前端工程化服務(wù)showImg(https:/...
摘要:在這里,詞法解析器應(yīng)用的規(guī)則即為詞匯語(yǔ)法的定義,語(yǔ)法解釋器應(yīng)用的規(guī)則即為表達(dá)式語(yǔ)句聲明和函數(shù)等的定義。如何編寫(xiě)簡(jiǎn)單的實(shí)踐篇 什么是parser? 簡(jiǎn)單的說(shuō),parser的工作即是將代碼片段轉(zhuǎn)換成計(jì)算機(jī)可讀的數(shù)據(jù)結(jié)構(gòu)的過(guò)程。這個(gè)計(jì)算機(jī)可讀的數(shù)據(jù)結(jié)構(gòu)更專業(yè)的說(shuō)法是抽象語(yǔ)法樹(shù)(abstract syntax tree),簡(jiǎn)稱AST。AST是代碼片段具體語(yǔ)義的抽象表達(dá),它不包含該段代碼的所有細(xì)...
閱讀 3414·2021-10-08 10:15
閱讀 5628·2021-09-23 11:56
閱讀 1479·2019-08-30 15:55
閱讀 457·2019-08-29 16:05
閱讀 2739·2019-08-29 12:34
閱讀 2052·2019-08-29 12:18
閱讀 925·2019-08-26 12:02
閱讀 1661·2019-08-26 12:00