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