iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >如何使用JavaScript解析器UglifyJS
  • 298
分享到

如何使用JavaScript解析器UglifyJS

2024-04-02 19:04:59 298人浏览 独家记忆
摘要

本篇文章给大家分享的是有关如何使用javascript解析器Uglifyjs,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我一直在为Jscex

本篇文章给大家分享的是有关如何使用javascript解析器Uglifyjs,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

我一直在为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实现的类库。现在您应该可以猜到它输出的AST是什么表现形式了吧。没错,就是个“表”,用JavaScript来表示,就是个数组套数组。我写了点简单的代码对其进行格式化输出,您可以在这里简单尝试一下UglifyJS的解析器。这个输出虽然简单,但对于Jscex来说也已经完全够用了。

使用

打开parse-js.js文件,您会看到这样一些代码:

  var KEYWordS = array_to_hash([      ...  ]);   var RESERVED_WORDS = array_to_hash([      ...  ]);   ...   function parse($TEXT, exigent_mode, embed_tokens) {      ...  }     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;  };

UglifyJS是基于CommonJS模块机制编写的,这一个文件其实就是个模块,它对外的方法通过exports暴露出来。如果我们将其作为普通的JavaScript文件引入到浏览器中,显然会报“export未定义”异常。理论上说,如果定义一个exports对象,甚至去除和exports有关的代码就能正常使用parse方法了。不过这么做也有个严重的问题,那就是对根对象的“污染”实在是太严重了,例如在浏览器中所有的函数,定义都出现在window上,再引入一些其他类库,造成冲突的可能性相当高。

因此,我们必须对代码进行一些修改。幸运的是,在JavaScript中解决这类“作用域”问题十分容易,例如我这样将parse-js.js的代码包围了起来:

var UglifyJS = {};   (function (exports) {     })(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,结果如下:

如何使用JavaScript解析器UglifyJS

对于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,结果如下:

如何使用JavaScript解析器UglifyJS

对于UglifyJS来说,Chromium 12的表现依旧抢眼,胜过Firefox 4不少,不过使用Narcissus的情况则正好相反。同样可以看出,IE 8在JavaScript引擎的性能方面已经落后于这个时代了,不过它和IE 9、Firefox 4(以及后文的Safari)的情况类似,即UglifyJS和Narcissus的耗时并没有太大差别。

为了便于观察,我将两次测试的结果放在一起(除了非正式版本的Chromium 12):

如何使用JavaScript解析器UglifyJS

总体而言,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,在此列出结果:

如何使用JavaScript解析器UglifyJS

虽然浏览器的表现各有高低,差距也有所不同,但可以确定的是,UglifyJS解析器的性能的确比Narcissus要高。因此,我打算在接下来几天里用UglifyJS替换掉目前Jscex里使用的Narcissus。

总结

由于前端开发和JavaScirpt的流行,越来越多的人开始用JavaScript做一些有趣的事情。我很不喜欢如今许多所谓的前端实践,纠缠于大量的hack以及各种浏览器的表现,甚至是JavaScript里某种特定写法的性能更高——例如,居然有消息称,对于字符串连接操作来说,a += b的性能比a = a + b要高(或反之)。在我看来这些东西是最无用的,知道了又如何?随着浏览器更新换代,这些“经验”瞬间就毫无作用了。

这也是我为什么喜欢玩JavaScript,却死也不愿去做前端开发,尤其是HTML、CSS。同样,如IE 6这种浏览器在我眼中也是必须消灭的东西。

以上就是如何使用JavaScript解析器UglifyJS,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网node.js频道。

--结束END--

本文标题: 如何使用JavaScript解析器UglifyJS

本文链接: https://www.lsjlt.com/news/86507.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用JavaScript解析器UglifyJS
    本篇文章给大家分享的是有关如何使用JavaScript解析器UglifyJS,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我一直在为Jscex...
    99+
    2024-04-02
  • 如何使用来解析JavaScript
    本篇文章为大家展示了如何使用来解析JavaScript,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Talk因为最近工作上有需要使用解析 JavaScript &n...
    99+
    2024-04-02
  • 如何使用JavaScript+Node.js写一款markdown解析器
    这篇文章主要介绍了如何使用JavaScript+Node.js写一款markdown解析器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 准备工作首先编写getHtml函...
    99+
    2023-06-29
  • 浏览器如何解析javascript
    随着互联网技术的不断发展,JavaScript语言已经成为了前端开发的必备技能。JavaScript是一种脚本语言,它可以在浏览器中执行,以实现网页的交互效果,如表单验证、动态加载内容、异步请求等等。那么浏览器是如何解析JavaScript...
    99+
    2023-05-14
  • 如何在PHP中使用NumPy和JavaScript解析文件?
    在现代web开发中,PHP是一种非常流行的编程语言。但是,PHP本身并不能很好地处理科学计算和数据分析的任务。为了解决这个问题,我们可以使用NumPy和JavaScript来解析文件。这篇文章将会为你介绍如何在PHP中使用NumPy和Jav...
    99+
    2023-08-13
    numpy 文件 javascript
  • 使用cdn如何解析
    使用CDN解析的步骤如下:1. 在域名注册商处将域名解析到CDN提供商的DNS服务器上。这通常涉及将域名的NS记录指向CDN提供商提...
    99+
    2023-09-16
    cdn
  • 详解如何在JavaScript中使用装饰器
    目录安装vite配置webpack配置使用语法: @+函数名类装饰器带参数的修饰器类成员装饰器多个装饰器的执行顺序应用延迟节流防抖Decorator装饰器是ES7的时候提案的特性,目...
    99+
    2022-11-13
    JavaScript使用装饰器 JavaScript 装饰器
  • JavaScript生成器如何使用
    这篇文章主要讲解了“JavaScript生成器如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript生成器...
    99+
    2024-04-02
  • 如何使用 PHP 解析 XML?
    解析 xml 的方法:simplexml:使用对象语法,解析简单 xml 文档。domdocument:提供对 xml 文档的精细控制。 如何在 PHP 中解析 XML 解析 XML ...
    99+
    2024-04-20
    php xml
  • Go语言JSON解析器gjson如何使用
    今天小编给大家分享一下Go语言JSON解析器gjson如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。gjsonGJS...
    99+
    2023-07-04
  • 在JavaScript中如何使用宏详解
    在语言当中,宏常见用途有实现 DSL 。通过宏,开发者可以自定义一些语言的格式,比如实现 JSX 语法。在 WASM 已经实现的今天,用其他语言来写网页其实并不是没有可能。像 Rus...
    99+
    2024-04-02
  • ubuntu如何使用域名解析
    ubuntu使用域名解析的示例:获取域名解析的程序,将以下代码保存为“main.cpp”。#include #include #include #include extern int h_errno;int main(int argc, c...
    99+
    2024-04-02
  • 如何使用jQuery来解析XML
    这篇文章主要介绍了如何使用jQuery来解析XML,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用jQuery来解析XMLfunction parseXml(xm...
    99+
    2023-06-27
  • 如何理解JavaScript预解析及对象
    本篇文章为大家展示了如何理解JavaScript预解析及对象,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、预解析1、变量预解析和函数预解析JavaScript 代码是由浏览器中的 JavaScr...
    99+
    2023-06-25
  • JavaScript 定时器关键点及使用场景解析
    目录正文关于计时器的关键点异步函数setTimeoutsetInterval区别使用场合总结正文 JavaScript 定时器是实现循环行为甚至触发延迟操作的好功能。无论有什么基于...
    99+
    2023-01-30
    JavaScript 定时器 JavaScript 定时器场景
  • javascript中$如何使用
    这篇文章主要介绍了javascript中$如何使用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。javascript $用法:1、【$()】可以是【$(expresion)】...
    99+
    2023-06-14
  • JavaScript如何使用instanceof
    小编给大家分享一下JavaScript如何使用instanceof,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!instanceof原理是递归遍历 right 参数的原型链,每次和 left 参数作比较,遍历到原型链终点时...
    99+
    2023-06-27
  • Javascript如何使用this
    这篇文章给大家分享的是有关Javascript如何使用this的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。this是Javascript语言的一个关键字。它代表函数运行时,自动...
    99+
    2024-04-02
  • JavaScript如何使用Array.unshift()
    小编给大家分享一下JavaScript如何使用Array.unshift(),相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Array.unshift()let&n...
    99+
    2023-06-17
  • javascript filter如何使用
    这篇文章主要讲解了“javascript filter如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript filter如何使用”吧!Javascript中有许多内置函...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作