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语句优化
    1. if(foo)bar();else baz();==>;foo?bar():baz();
    2. 如果(!)foo)bar();else baz();==>;foo?baz():bar();
    3. 如果(foo)bar();==>;foo&;bar();
    4. 如果(!)foo)bar();==>;foo bar();
    5. if(foo)return bar();else return baz();=>;返回foo?bar():baz();
    6. if(foo)返回条();else something();==>;{if(foo)返回条();something()}
  • 删除返回、抛出、中断或 Continue语句,但函数/变量声明除外
  • 分析速度提高

致谢

  • lexer和解析器是用ply构建的。
  • 来自jslex的几个测试用例和regex
  • 一些访问者的想法- pycparser
  • 许多语法规则取自
  • 名称管理和不同的优化思想- uglifyjs
  • asi实现的灵感来自于pyjsparser

许可证

麻省理工学院许可证(MIT)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
hbm中的java异常。xml   java如何扩展JavaDoc5.0标准doclet?   java将所有非字母数字更改为+   java如何使用JSP从URL获取参数   把java学校的程序员变成C或C++程序员有多难?   java使用HTML获取表内容   java在JPanel中使用repaint()方法而不删除已绘制的内容   rest如何在Java中动态映射同一父类的子对象列表   如果协议不是http或https,java如何解析URL?   java删除文本时如何在eclipse中隐藏建议框?   java代码名1 GPS跟踪器   java寻找骑士所有独特的可能动作   从一个管道到另一个进程的java InputStream仍然被阻塞   java在阶段后将子项添加到窗格。show()   java如何确保在子对象中调用超级方法?   java从json对象获取值   java使用多线程读取文件   java Struts 1.1+Hibernate 3.2集成