slimit-javascript小型化程序
slimit的Python项目详细描述
欢迎来到Slimit
slimit 是一个用python编写的javascript小型化程序。 它将javascript编译成更紧凑的代码,以便下载 跑得更快。
slimit还提供了一个包含javascript解析器的库, 雷克瑟,漂亮的打印机和一个树访客。
http://slimit.readthedocs.org/
安装
$ [sudo] pip install slimit
或者git master分支的出血边缘版本:
$ [sudo] pip install git+https://github.com/rspivak/slimit.git#egg=slimit
还有一个官方的deb套餐可以在 http://packages.debian.org/sid/slimit
让我们缩小一些代码
从命令行:
$ slimit -h Usage: slimit [options] [input file] If no input file is provided STDIN is used by default. Minified JavaScript code is printed to STDOUT. Options: -h, --help show this help message and exit -m, --mangle mangle names -t, --mangle-toplevel mangle top level scope (defaults to False) $ cat test.js var foo = function( obj ) { for ( var name in obj ) { return false; } return true; }; $ $ slimit --mangle < test.js var foo=function(a){for(var b in a)return false;return true;};
或者使用库api:
>>> from slimit import minify >>> text = """ ... var foo = function( obj ) { ... for ( var name in obj ) { ... return false; ... } ... return true; ... }; ... """ >>> print minify(text, mangle=True, mangle_toplevel=True) var a=function(a){for(var b in a)return false;return true;};
迭代、修改javascript ast并漂亮地打印它
>>> from slimit.parser import Parser >>> from slimit.visitors import nodevisitor >>> from slimit import ast >>> >>> parser = Parser() >>> tree = parser.parse('for(var i=0; i<10; i++) {var x=5+i;}') >>> for node in nodevisitor.visit(tree): ... if isinstance(node, ast.Identifier) and node.value == 'i': ... node.value = 'hello' ... >>> print tree.to_ecma() # print awesome javascript :) for (var hello = 0; hello < 10; hello++) { var x = 5 + hello; } >>>
编写自定义节点访问者
>>> from slimit.parser import Parser >>> from slimit.visitors.nodevisitor import ASTVisitor >>> >>> text = """ ... var x = { ... "key1": "value1", ... "key2": "value2" ... }; ... """ >>> >>> class MyVisitor(ASTVisitor): ... def visit_Object(self, node): ... """Visit object literal.""" ... for prop in node: ... left, right = prop.left, prop.right ... print 'Property key=%s, value=%s' % (left.value, right.value) ... # visit all children in turn ... self.visit(prop) ... >>> >>> parser = Parser() >>> tree = parser.parse(text) >>> visitor = MyVisitor() >>> visitor.visit(tree) Property key="key1", value="value1" Property key="key2", value="value2"
在项目中使用Lexer
>>> from slimit.lexer import Lexer >>> lexer = Lexer() >>> lexer.input('a = 1;') >>> for token in lexer: ... print token ... LexToken(ID,'a',1,0) LexToken(EQ,'=',1,2) LexToken(NUMBER,'1',1,4) LexToken(SEMI,';',1,5)
您可以使用 令牌 方法一次获得一个令牌:
>>> lexer.input('a = 1;') >>> while True: ... token = lexer.token() ... if not token: ... break ... print token ... LexToken(ID,'a',1,0) LexToken(EQ,'=',1,2) LexToken(NUMBER,'1',1,4) LexToken(SEMI,';',1,5)
lextoken 实例具有不同的属性:
_____ _ _____ __ __ _____ _______ / ____| | |_ _| \/ |_ _|__ __| | (___ | | | | | \ / | | | | | \___ \| | | | | |\/| | | | | | ____) | |____ _| |_| | | |_| |_ | | |_____/|______|_____|_| |_|_____| |_|0
基准
sam -以字节为单位缩小后的jquery大小(数字越小越好)
<表> < COLGROUP > < COL/> < COL/> < COL/> < COL/> <广告> 原始jquery 1.6.1(字节) 瘦山姆 Rjsmin萨姆 jsmin sam < /广告> <正文> 234995 94290 134215 134819 < > <表>路线图
- 当使用"eval"和"with"进行名称分类处理案例时
- foo["bar"]==>;foo.bar
- 连续声明:var a=10;var b=20;==>;var a=10,b=20;
- 如果结果占用较少的空间,请减少简单常量表达式: 1+2*3==>;7
-
if语句优化
- if(foo)bar();else baz();==>;foo?bar():baz(); 如果(!)foo)bar();else baz();==>;foo?baz():bar();
- 如果(foo)bar();==>;foo&;bar(); 如果(!)foo)bar();==>;foo bar();
- if(foo)return bar();else return baz();=>;返回foo?bar():baz();
- if(foo)返回条();else something();==>;{if(foo)返回条();something()}
- 删除返回、抛出、中断或 Continue语句,但函数/变量声明除外
- 分析速度提高
致谢
许可证
麻省理工学院许可证(MIT)