精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

UglifyJS有個超贊的JavaScript解析器

開發 前端
UglifyJS是個JavaScript壓縮器,效果和Google Closure Compiler相比有過之而無不及。對于現代化的JavaScript壓縮器來說,簡單的去除空白和壓縮局部變量是遠遠不夠的,同時需要理解代碼的語義,將其替換成提及更小的形式(Uglify的說明頁上有許多描述)。

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

UglifyJS是個JavaScript壓縮器,效果和Google Closure Compiler相比有過之而無不及。對于現代化的JavaScript壓縮器來說,簡單的去除空白和壓縮局部變量是遠遠不夠的,同時需要理解代碼的語義,將其替換成提及更小的形式(Uglify的說明頁上有許多描述)。這顯然需要一個JavaScript解析器。UglifyJS基于NodeJS開發,不過可以在各種支持CommonJS模塊系統的JavaScript引擎/平臺上運行。如果沒有CommonJS,也只需將exports相關的代碼去掉即可。

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

UglifyJS的JavaScript分詞器和解析器存放在源代碼的parse-js.js文件中,移植于parse-js項目,后者是一個用Common Lisp實現的類庫?,F在您應該可以猜到它輸出的AST是什么表現形式了吧。沒錯,就是個“表”,用JavaScript來表示,就是個數組套數組。我寫了點簡單的代碼對其進行格式化輸出,您可以在這里簡單嘗試一下UglifyJS的解析器。這個輸出雖然簡單,但對于Jscex來說也已經完全夠用了。

使用

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

  1. /* -----[ Tokenizer (constants) ]----- */ 
  2.  
  3. var KEYWORDS = array_to_hash([  
  4.     ...  
  5. ]);  
  6.  
  7. var RESERVED_WORDS = array_to_hash([  
  8.     ...  
  9. ]);  
  10.  
  11. ...  
  12.  
  13. function parse($TEXT, exigent_mode, embed_tokens) {  
  14.     ...  
  15. }  
  16.  
  17. /* -----[ Exports ]----- */ 
  18.  
  19. exports.tokenizer = tokenizer;  
  20. exports.parse = parse;  
  21. exports.slice = slice;  
  22. exports.curry = curry;  
  23. exports.member = member;  
  24. exports.array_to_hash = array_to_hash;  
  25. exports.PRECEDENCE = PRECEDENCE;  
  26. exports.KEYWORDS_ATOM = KEYWORDS_ATOM;  
  27. exports.RESERVED_WORDS = RESERVED_WORDS;  
  28. exports.KEYWORDS = KEYWORDS;  
  29. exports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN;  
  30. exports.OPERATORS = OPERATORS;  
  31. exports.is_alphanumeric_char = is_alphanumeric_char;  
  32. exports.set_logger = function(logger) {  
  33.         warn = logger;  
  34. }; 

UglifyJS是基于CommonJS模塊機制編寫的,這一個文件其實就是個模塊,它對外的方法通過exports暴露出來。如果我們將其作為普通的JavaScript文件引入到瀏覽器中,顯然會報“export未定義”異常。理論上說,如果定義一個exports對象,甚至去除和exports有關的代碼就能正常使用parse方法了。不過這么做也有個嚴重的問題,那就是對根對象的“污染”實在是太嚴重了,例如在瀏覽器中所有的函數,定義都出現在window上,再引入一些其他類庫,造成沖突的可能性相當高。

因此,我們必須對代碼進行一些修改。幸運的是,在JavaScript中解決這類“作用域”問題十分容易,例如我這樣將parse-js.js的代碼包圍了起來:

  1. var UglifyJS = {};  
  2.  
  3. (function (exports) {  
  4.  
  5. /* original code here */ 
  6.  
  7. })(UglifyJS); 

這樣就解決了作用域問題,如今我們就能訪問UglifyJS對象上的KEYWORDS集合以及parse等成員了。

性能

然后再說說性能。JavaScript一直被認為是一門執行效率低下的語言——這其實是個錯誤的觀點。其實從語言設計上說,JavaScript比Python和Ruby都要快,只不過由于歷史原因各大瀏覽器對它都不太重視而已。不過如今情況早就有所改變,在V8的帶領下,現代的JavaScript引擎執行速度都已經超過了目前最快的Python和Ruby實現。話不多說,現在我們就來比較一下UglifyJS的解析器與Narcissus在各瀏覽器下的表現吧。

測試頁面在此(http://files.zhaojie.me/demos/js-parsers/benchmark.html),您也可以自行嘗試,測試場景是使用兩者分別解析十次Narcissus的實現——大約1500行未壓縮的JavaScript代碼(值得一提的是,我試了許多壓縮后的代碼,如jquery-min.js,它們用UgilifyJS可以正常解析,而Narcissus卻解析失敗)。我使用兩臺公司配置的標準工作機,測試了IE、Chrome和Firefox各兩個版本共6種瀏覽器。每個瀏覽器我都會運行多遍測試,去處偏差大的結果,取中游數值。遺憾的是,由于條件所限,兩臺機器的操作系統有所不同,雖然我認為并不會對結果有什么影響,但如果您足夠頂真,也不妨再自行評測一把。

首先我在Win 7下測試了Chrome 10、FireFox 3和IE9,結果如下:

UglifyJS有個不錯的JavaScript解析器

對于UglifyJS來說,Chrome 10的表現***,IE 9相比略慢少許,而Firefox 3耗時則是前兩者的數倍。對于Narcissus來說,則是IE 9表現***,僅為Chrome 10的五分之一,和Firefox 3相比更是數量級上的領先。有趣的是,Chrome 10和Firefox 3下兩個解析器的耗時都是一比十左右,而IE 9下則相差無幾。

然后是Win XP下Chromium 12、Firefox 4及IE 8,結果如下:

UglifyJS有個不錯的JavaScript解析器

對于UglifyJS來說,Chromium 12的表現依舊搶眼,勝過Firefox 4不少,不過使用Narcissus的情況則正好相反。同樣可以看出,IE 8在JavaScript引擎的性能方面已經落后于這個時代了,不過它和IE 9、Firefox 4(以及后文的Safari)的情況類似,即UglifyJS和Narcissus的耗時并沒有太大差別。

為了便于觀察,我將兩次測試的結果放在一起(除了非正式版本的Chromium 12):

UglifyJS有個不錯的JavaScript解析器

總體而言,Chrome 10、IE 9和Firefox 4為***軍團。IE 9在UglifyJS上小負于Chrome 10,但在Narcissus上優勢明顯;Chrome 10在UglifyJS上表現***,但在Narcissus卻落后較多;Firefox 4雖然都不是“***”,但差距也并不太大。至于IE 8和Firefox 3,在JavaScript的執行效率方面的確已經落后于這個時代了。必須承認,如今的瀏覽器大戰的確大大提高了各方的質量。

此外我還測試了公司iMac上的Chrome 10、Firefox 3以及Safari 5,在此列出結果:

UglifyJS有個不錯的JavaScript解析器

雖然瀏覽器的表現各有高低,差距也有所不同,但可以確定的是,UglifyJS解析器的性能的確比Narcissus要高。因此,我打算在接下來幾天里用UglifyJS替換掉目前Jscex里使用的Narcissus。

總結

由于前端開發和JavaScirpt的流行,越來越多的人開始用JavaScript做一些有趣的事情。我很不喜歡如今許多所謂的前端實踐,糾纏于大量的hack以及各種瀏覽器的表現,甚至是JavaScript里某種特定寫法的性能更高——例如,居然有消息稱,對于字符串連接操作來說,a += b的性能比a = a + b要高(或反之)。在我看來這些東西是最無用的,知道了又如何?隨著瀏覽器更新換代,這些“經驗”瞬間就毫無作用了。

這也是我為什么喜歡玩JavaScript,卻死也不愿去做前端開發,尤其是HTML、CSS。同樣,如IE 6這種瀏覽器在我眼中也是必須消滅的東西。
 

原文鏈接:http://blog.zhaojie.me/2011/04/uglifyjs-has-a-good-javascript-parser.html

【編輯推薦】

  1. 對JavaScript中call和apply的理解
  2. 16款***的JavaScript框架
  3. 8個令人驚嘆的JavaScript效果的網站
  4. JavaScript學習筆記 有問有答
  5. JavaScript代碼優化新工具UglifyJS
責任編輯:陳貽新 來源: 老趙的博客
相關推薦

2022-10-20 11:00:52

SQL解析器

2011-03-01 16:08:46

2009-03-19 09:26:05

RSS解析器MagpieRSS

2019-07-05 08:39:39

GoSQL解析器

2012-03-19 16:50:03

jQuery插件

2016-01-25 09:49:20

jQuery圖片滑塊動畫

2023-06-27 06:56:32

2014-05-06 09:27:54

2022-02-14 13:58:32

操作系統JSON格式鴻蒙

2011-11-28 15:40:52

wiresharkRDP解析器

2020-10-10 09:19:58

JavaScript開發技術

2011-01-21 07:22:48

jQuerywebJavaScript

2017-02-14 10:20:43

Java Class解析器

2010-02-22 13:38:50

Python解析器

2018-09-13 21:56:26

深度學習機器學習神經網絡

2010-02-22 16:51:03

Python 解析器

2020-12-02 10:13:45

JacksonJDK解析器

2022-06-28 08:17:10

JSON性能反射

2023-12-30 13:33:36

Python解析器JSON

2014-05-15 09:45:58

Python解析器
點贊
收藏

51CTO技術棧公眾號

福利在线视频导航| 神马午夜精品91| 日本成人片在线| 国产精品久久久一区麻豆最新章节| 国产日韩视频在线观看| 永久av免费网站| 久久久久高潮毛片免费全部播放| 精品久久久视频| 特级毛片在线免费观看| 国产爆乳无码一区二区麻豆| 狠狠噜天天噜日日噜| 免费看国产片在线观看| 日韩国产在线一| www.xxxx精品| 国产网站无遮挡| 国产精品一区二区精品| 91久久精品国产91性色tv| 日本成人在线不卡| 亚洲视频tv| 成人精品免费视频| 国产情人节一区| 久久一区二区三区视频| 综合av在线| 国产亚洲人成a一在线v站| 师生出轨h灌满了1v1| 99久久精品一区二区成人| 性做久久久久久免费观看| 黑人巨大国产9丨视频| 狠狠狠综合7777久夜色撩人| 成人av电影在线| 91视频免费网站| 伊人成年综合网| 男女精品网站| 4k岛国日韩精品**专区| 精品无码黑人又粗又大又长| 99久久亚洲精品蜜臀| 伊人男人综合视频网| 中文在线永久免费观看| 99精品国产一区二区三区2021 | 一级特黄录像免费播放全99| 欧美少妇另类| 99久久免费视频.com| av噜噜色噜噜久久| av中文在线观看| 精品亚洲aⅴ乱码一区二区三区| 国产极品jizzhd欧美| 亚洲视频 欧美视频| 国产精品夜夜夜| 18久久久久久| 最新中文字幕一区| 性感少妇一区| 国产999精品| 天天爱天天做天天爽| 久久精品天堂| 国产精品久久二区| 在线观看中文字幕码| 美女爽到高潮91| 成人欧美一区二区三区黑人| 在线电影中文日韩| 欧美美女一级片| 在线日韩三级| 日韩一区二区三区电影在线观看 | 免费看的黄色大片| 精品三级久久| 欧美日韩在线一区| 成人一级片网站| 欧美123区| 5月丁香婷婷综合| 日本少妇一级片| 国产精品毛片视频| 亚洲欧美日韩直播| 长河落日免费高清观看| 欧美 日韩 国产 一区| 久久久中精品2020中文| xxxx 国产| 久久久天天操| 国产区精品在线观看| 亚洲AV无码乱码国产精品牛牛| 成人免费视频网站在线观看| 裸模一区二区三区免费| 亚洲成人三级| 亚洲一区二区视频| 北条麻妃在线视频观看| 草莓视频成人appios| 日韩精品一区二区在线| 欧美成人三级伦在线观看| 欧美在线电影| 欧美黑人视频一区| 免费观看日批视频| 国产一区二区视频在线播放| 精品一区国产| 免费成人黄色| 欧美日韩国产在线看| 最新中文字幕2018| jizz18欧美18| 色偷偷噜噜噜亚洲男人的天堂| 精国产品一区二区三区a片| 久久国产成人| 高清日韩一区| 中国日本在线视频中文字幕| 午夜精品一区二区三区三上悠亚| 亚洲一区二区三区四区五区xx| 亚洲一区二区三区在线免费| 有码中文亚洲精品| 国产午夜精品无码| 国产综合成人久久大片91| 久久综合精品一区| 青青青草视频在线| 欧美日韩夫妻久久| 日本高清www| 国产精品99免费看| 国产精品你懂得| 午夜一区在线观看| 亚洲精品你懂的| 欧美激情精品久久久久久小说| 久久久国产精品入口麻豆| 国产亚洲a∨片在线观看| 国产亚洲小视频| 国产一区二区三区久久久| 日韩欧美精品一区二区三区经典| heyzo高清在线| 日韩一级黄色大片| 老司机成人免费视频| 视频在线观看一区| 老司机精品福利在线观看| 丁香花在线影院| 91麻豆精品国产91| 毛片久久久久久| 日本亚洲天堂网| 日本午夜精品一区二区| 台湾佬中文娱乐网欧美电影| 亚洲电影中文字幕| 国产精品16p| 国产成人亚洲精品青草天美| 公共露出暴露狂另类av| 亚洲tv在线| 久久亚洲精品中文字幕冲田杏梨| 欧美一级做a爰片免费视频| 99国内精品久久| 免费在线观看视频a| 超碰一区二区三区| 久久久噜噜噜久久久| 午夜美女福利视频| 亚洲午夜精品在线| 亚洲美女精品视频| 精品1区2区3区4区| 国产欧美日韩亚洲| av免费不卡| 亚洲精品一区久久久久久| 在线精品免费视| 国产清纯白嫩初高生在线观看91 | 久久精品99国产精品酒店日本| 中文字幕免费观看| 国产日本欧美一区二区| 免费一级特黄录像| 99久久久国产精品美女| 成人在线播放av| 成人免费高清| 亚洲精品在线一区二区| 欧美日韩精品区| 久久久久久麻豆| 日本xxxx黄色| 欧美a级一区| 国精产品99永久一区一区| 中文字幕色婷婷在线视频| 国产亚洲精品美女| 国产精品欧美亚洲| 亚洲国产一区二区视频| 人妻少妇精品视频一区二区三区| 丝袜亚洲精品中文字幕一区| 亚洲国产精品久久久久婷婷老年 | 日韩成人免费视频| 亚洲图片欧美日韩| 亚洲色图都市小说| 少妇被狂c下部羞羞漫画| 久久成人免费| 91免费视频黄| 日韩高清电影免费| 国产在线播放91| 搞黄网站在线看| 亚洲无av在线中文字幕| 国产黄色一级大片| 粉嫩老牛aⅴ一区二区三区| 日本美女bbw| 高清日韩电视剧大全免费| 日本xxxxxxx免费视频| 91精品天堂福利在线观看| 国产日韩二区| 日韩五码电影| 欧美在线性爱视频 | 手机看片国产精品| 免费一区视频| 国产人妻人伦精品| 国产一区二区三区四区| 91偷拍精品一区二区三区| 成人软件在线观看| 欧美日韩成人黄色| 国产九色在线| 亚洲国产精品字幕| 国产精品视频一二区| 欧美午夜片在线免费观看| 欧美黑人猛猛猛| 国产女人18毛片水真多成人如厕| jjzzjjzz欧美69巨大| 九九在线精品视频| 日本精品免费在线观看| 欧美日韩视频一区二区三区| 视频一区二区综合| 日韩高清一级| 国产精品一区二区不卡视频| 日韩美香港a一级毛片| 日韩暖暖在线视频| av不卡高清| 久久99久久99精品中文字幕| av网站在线免费观看| 日韩精品在线观看一区| 午夜精品久久久久久久99老熟妇 | 成人中文视频| 久久av一区二区| 91在线一区| 97视频资源在线观看| 一区二区三区日本视频| 国产精品91免费在线| 末成年女av片一区二区下载| 欧美老少配视频| 超碰在线caoporn| 日韩中文视频免费在线观看| 青青国产在线| 日韩精品免费观看| 少妇高潮久久久| 亚洲电影免费观看高清完整版在线观看| 国产免费黄色网址| 欧美精品一卡二卡| 亚洲综合视频在线播放| 欧美自拍偷拍午夜视频| 精品国产一区二区三区四| 福利精品视频在线| 日本一区二区不卡在线| 亚洲综合一二三区| 国产一级做a爱免费视频| 一区二区三区.www| 精品少妇久久久| 亚洲福利视频三区| 91在线看视频| 日韩欧美a级成人黄色| 国产精品久免费的黄网站| 欧美性猛交xxxx乱大交极品| 精品美女久久久久| 欧美午夜激情视频| 中文字幕免费观看视频| 欧美调教femdomvk| 国产精品国产三级国产aⅴ| 欧美人xxxx| 国产a级免费视频| 精品久久久久久久久久久久久久久 | 国产精品18在线| 亚洲视频在线一区二区| 岛国毛片在线观看| 亚洲成年人网站在线观看| 可以免费在线观看的av| 色菇凉天天综合网| 国产老妇伦国产熟女老妇视频| 欧美一卡2卡3卡4卡| 亚洲国产综合一区| 日韩精品中文字幕在线| av网页在线| 蜜月aⅴ免费一区二区三区| 国产亚av手机在线观看| 97精品一区二区三区| 欧美中文字幕精在线不卡| 国产欧美精品日韩精品| 51精品国产| 欧美一进一出视频| 久久精品国内一区二区三区水蜜桃| 蜜桃网站在线观看| 亚洲欧美日本国产专区一区| 91看片在线免费观看| 国产精品性做久久久久久| 天天插天天射天天干| 国产精品另类一区| 久久精品久久国产| 欧美系列在线观看| 亚洲av无码一区二区三区dv| 亚洲乱码av中文一区二区| 美女免费久久| 88国产精品欧美一区二区三区| 992tv国产精品成人影院| 风间由美一区二区三区| 成人免费看片39| 欧美视频在线观看视频| 免费观看在线综合色| 日韩精品视频一区二区| 国产精品妹子av| 中日韩黄色大片| 91精品国产综合久久久久久久| 无码国精品一区二区免费蜜桃| 中文字幕久久久av一区| caoporn视频在线| 成人高h视频在线| 久草在线成人| 欧美中日韩在线| 九九视频精品免费| 国产av自拍一区| 午夜影院在线观看欧美| 一二三四区在线| 亚洲欧美日韩精品久久亚洲区| av免费网站在线| 国产精品久久久久久超碰| 国产伦精品一区二区三区免费优势| 亚洲一二三区在线| 亚洲欧美大片| 国产精品九九视频| 亚洲精品国产精品乱码不99| 在线免费观看一区二区| 亚洲免费一在线| xxxx视频在线| 亚洲一区二区三区777| 成人在线视频免费观看| 日本一本二本在线观看| www.av亚洲| 久久久久久久九九九九| 欧美一区午夜精品| 在线免费看黄| 国产精品视频网址| 视频精品在线观看| 日本三级免费网站| av在线不卡电影| 五月天婷婷网站| 日韩精品中文字幕在线一区| av软件在线观看| 亚洲综合日韩在线| 99久久夜色精品国产亚洲狼| 一级黄色特级片| 国产精品欧美经典| 中国黄色一级视频| 中文字幕亚洲二区| 国产成人免费精品| 欧美日韩成人一区二区三区| 国产欧美午夜| 色无极影院亚洲| 色噜噜狠狠成人中文综合| 美女毛片在线看| 国产盗摄xxxx视频xxx69| 国产在线日韩精品| 五月婷婷激情久久| 国产精品理伦片| 国产精品国产一区二区三区四区| 波霸ol色综合久久| 国产不卡精品| 91亚洲精品国产| 99精品国产91久久久久久| 久久中文字幕免费| 宅男66日本亚洲欧美视频| 日韩黄色碟片| www.99riav| av亚洲精华国产精华| 久久久久久久久黄色| 一本色道久久综合亚洲精品小说| 成人激情视屏| 一道本在线观看视频| 成人在线视频一区二区| 日韩激情在线播放| 亚洲欧美日韩一区二区在线 | 欧美日韩国产一区二区三区地区| 婷婷视频在线| 99精品在线直播| 亚洲少妇在线| 很污很黄的网站| 精品国产凹凸成av人网站| 乡村艳史在线观看| 亚洲精品欧洲精品| 国产91丝袜在线播放九色| 久久亚洲天堂网| 最近更新的2019中文字幕| 欧美9999| 日韩视频在线免费看| 中文字幕一区二区三区不卡在线| www日本高清视频| 欧美在线免费视频| 91tv官网精品成人亚洲| 日本国产在线视频| 欧美色图片你懂的| 国产精品偷拍| 亚洲精品中文字幕乱码三区不卡| 国产精品一区二区你懂的| 国产一级18片视频| 久久伊人精品天天| 亚洲香蕉视频| 下面一进一出好爽视频| 色欧美片视频在线观看在线视频| www久久日com| 日韩三级在线播放| 成人蜜臀av电影| 伊人久久成人网| 91精品国产高清久久久久久| 婷婷六月综合| 国产三级av在线播放| 精品美女一区二区三区| 国内精品伊人| 日本三级免费观看|