天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

UglifyJS有個(gè)不錯(cuò)的JavaScript解析器

  我一直在為Jscex尋找好用的JavaScript解析器,之前我用的是Narcissus,也寫過(guò)相關(guān)文章。不過(guò)可惜的是,Narcissus使用了SpiderMonkey的擴(kuò)展,因此它并不是用ECMAScript 3實(shí)現(xiàn)的,無(wú)法在IE 8等瀏覽器中使用。目前Jscex使用的是NarrativeJS中舊版的Narcissus,但是我并不喜歡它輸出的AST結(jié)構(gòu),使用中也發(fā)現(xiàn)高級(jí)功能里的一些bug,有些食之無(wú)味棄之可惜的感覺(jué),而改寫新版Narcissus又必須大動(dòng)干戈。最近我接觸到了UglifyJS,發(fā)現(xiàn)它的解析器相當(dāng)不錯(cuò),性能也比Narcissus高出許多,在此介紹給大家。

  介紹

  UglifyJS是個(gè)JavaScript壓縮器,效果和Google Closure Compiler相比有過(guò)之而無(wú)不及。對(duì)于現(xiàn)代化的JavaScript壓縮器來(lái)說(shuō),簡(jiǎn)單的去除空白和壓縮局部變量是遠(yuǎn)遠(yuǎn)不夠的,同時(shí)需要理解代碼的語(yǔ)義,將其替換成提及更小的形式(Uglify的說(shuō)明頁(yè)上有許多描述)。這顯然需要一個(gè)JavaScript解析器。UglifyJS基于NodeJS開發(fā),不過(guò)可以在各種支持CommonJS模塊系統(tǒng)的JavaScript引擎/平臺(tái)上運(yùn)行。如果沒(méi)有CommonJS,也只需將exports相關(guān)的代碼去掉即可。

  JavaScript解析器的作用自然是將JavaScript代碼分解成AST,然后根據(jù)AST便可以做到許多有趣的事情。相同的AST可以在內(nèi)存中有不同的表現(xiàn)形式,例如之前提到我不太喜歡Jscex目前使用的舊版Narcissus,一個(gè)重要的原因便是它的AST結(jié)構(gòu)不夠友好(最新的Narcissus倒不錯(cuò))。此外,雖然它提供了一些高級(jí)功能,例如標(biāo)注了每個(gè)元素在源代碼中的位置,這樣使用者就可以直接根據(jù)getSource方法獲得它對(duì)應(yīng)的源代碼——只可惜經(jīng)試驗(yàn)這個(gè)功能有bug,這迫使我還得遍歷完整的AST。

  UglifyJS的JavaScript分詞器和解析器存放在源代碼的parse-js.js文件中,移植于parse-js項(xiàng)目,后者是一個(gè)用Common Lisp實(shí)現(xiàn)的類庫(kù)。現(xiàn)在您應(yīng)該可以猜到它輸出的AST是什么表現(xiàn)形式了吧。沒(méi)錯(cuò),就是個(gè)“表”,用JavaScript來(lái)表示,就是個(gè)數(shù)組套數(shù)組。我寫了點(diǎn)簡(jiǎn)單的代碼對(duì)其進(jìn)行格式化輸出,您可以在這里簡(jiǎn)單嘗試一下UglifyJS的解析器。這個(gè)輸出雖然簡(jiǎn)單,但對(duì)于Jscex來(lái)說(shuō)也已經(jīng)完全夠用了。

  使用

  打開parse-js.js文件,您會(huì)看到這樣一些代碼:

/* -----[ Tokenizer (constants) ]----- */var KEYWORDS = array_to_hash([
...
]);

var RESERVED_WORDS = array_to_hash([
...
]);

...

function parse($TEXT, exigent_mode, embed_tokens) {
...
}

/* -----[ Exports ]----- */

exports.tokenizer
= tokenizer;
exports.parse
= parse;
exports.slice
= slice;
exports.curry
= curry;
exports.member
= member;
exports.array_to_hash
= array_to_hash;
exports.PRECEDENCE
= PRECEDENCE;
exports.KEYWORDS_ATOM
= KEYWORDS_ATOM;
exports.RESERVED_WORDS
= RESERVED_WORDS;
exports.KEYWORDS
= KEYWORDS;
exports.ATOMIC_START_TOKEN
= ATOMIC_START_TOKEN;
exports.OPERATORS
= OPERATORS;
exports.is_alphanumeric_char
= is_alphanumeric_char;
exports.set_logger
= function(logger) {
warn
= logger;
};

it知識(shí)庫(kù)UglifyJS有個(gè)不錯(cuò)的JavaScript解析器,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产婷婷午夜无码A片 | 国产精品亚洲一区二区三区久久 | 亚洲 欧美 制服 校园 动漫 | 久久视频这里只精品99re8久 | 精品极品三大极久久久久 | 久久视频这里只精品99re8久 | 一级片mp4| 成人毛片免费观看视频大全 | 国产色婷婷精品人妻蜜桃成熟时 | 久久亚洲精品永久网站 | 国产精品99精品无码视亚 | 免费毛片视频网站 | 黑人巨茎大战白人女40CMO | 5G在线观看免费年龄确认18 | 一个人的HD高清在线观看 | 免费人妻AV无码专区五月 | 久久国产一区二区三区 | 无码AV动漫精品一区二区免费 | 嗯呐啊唔高H兽交 | 亚洲乱码高清午夜理论电影 | 熟妇久久无码人妻AV蜜桃 | 1000部做羞羞事禁片免费视频网站 | 一本道在线综合久久88 | 国产成人精品免费视频大 | 亚欧免费观看在线观看更新 | 99精品网站| 国产亚洲精品久久孕妇呦呦你懂 | 福利片福利一区二区三区 | 久久精品电影久久电影大全 | 男生J桶进女人P又色又爽又黄 | black大战chinese周晓琳 | 国产成人在线观看网站 | 秋霞在线观看视频一区二区三区 | 秋霞伦理电影在2017韩国在线伦 | 少妇被阴内射XXXB少妇BB | 嗯好舒服嗯好大好猛好爽 | 久久成人伊人欧洲精品AV | 草民电影网午夜伦理电影网 | 久久精品麻豆国产天美传媒果冻 | 538在线视频一区二区视视频 | 熟女理发厅 |