zoukankan      html  css  js  c++  java
  • grunt压缩代码插件

    Uglify是一个通用的JavaScript分析器/检查机/美化工具。

    This package implements a general-purpose JavaScript parser/compressor/beautifier toolkit.

    编译器或解析器(tokenizer/parser)从JS代码生成一个抽象的语法树。你能遍历这个ASTabstract syntax tree)以了解更多有关的代码,或做不同的操作。这部分由parse-js.js实现。

    Process.js检查和操作由分析器(parser)生成的AST,提供一下功能:

    l 从AST重新生成JavaScript代码。可选自动缩进,你可以使用这个如果你想美化一个已经被检查的程序,这样你就可以检查源码了。

    l 缩短变量名(通常缩成单个字符)。我们的检查机(mangler)将会对代码进行分析,并生成正确的变量名。

    l 各种小的优化可能会导致更快的代码,但是一定会导致更少的代码量。在可能的情况下,我们做到以下几点:

    ² foo[""bar] => foo.bar

    ² 删除块括号{}

    ² 合并连续的var声明

    ² 解决简单的常量表达式:1+2*3 => 7。我们只在能占用更少字节的情况下做替换;例如 1/3将会转换为0.333333333333,所以在这种情况下我们不会取代它。

    ² 块中的连续的陈述将会合并成一个序列。

    ² 各种if语句优化:

    if(foo) bar();else baz(); ==>  foo ? bar():  baz();

    if(foo) bar(); ==> foo&&bar();

    if(!foo) bar(); ==> foo||bar();

    if(foo) return bar(); else return baz(); ==> return foo?bar():baz();

    ² 删除一些不可达的代码(跟在returnthrowbreakcontinue语句后的代码,除了函数/变量声明)。

    ² 扮演一个限制版的预处理器,让你安全地用给出的值替换指定的全局符号。当结合这上面的优化可以让UglifyJS操作更像一个编译的过程,当某些符号被常量代替,整个代码块可能被优化掉。

     

     

    安装:npm install uglify-js   -g

     

    检查(compressjs,命令uglifyjs + 文件名 -o 输出文件名

    若不加-o参数,则检查后内容输出到屏幕

    美化(beautifyjs,和检查相反的过程,也就是解检查。命令:uglifyjs + 文件名 + -b

    使用方法:

    uglifyjs [input files] [options]

    uglifyjs -help 帮助信息

    常用参数:

    -o, --output 指定输出的文件,默认情况下为命令行

    -b, --beautify 美化代码

    -m, --mangle 改变变量名称(默认不改变变量名称)

    -r, --reserved 保留变量名称,不需要被-m参数改变的变量名

    -c, --compress 检查参数

    -d, --define 全局定义

    --comments 用来控制注释的代码

     

    Mangler options 变量名检查器选项(用逗号分开)

    sort 给最常使用的变量分配较短的名称。(默认不可用)

    toplevel 检查在顶级范围声明的变量(默认不可用)

    eval 在使用evalwhen的链检查名称

    当使用检查选项时(-m),但是你想让几个变量名不被检查,你可以声明这些变量用--reserved-r)传递一个逗号分隔的名称列表。例如:

    uglifyjs ... -m -r '$,require,exports'

    require, exports, $ 三个变量不会被改变

     

    Compressor options

    传递--compress-c时才能使用下面的选项

    dead_code 删除死代码

    properties 重写属性用点标的形式,foo["bar"] => foo.bar

    warnings 显示warning当删除不可达的代码或这没用的声明等情况时。

    ……

     

    Conditional compilation

    你可以使用--define-d),以声明uglify假定是常量的全局变量。

    if(DEBUG){

    console.log("hehe");

    }

    在开发过程中使用如上所示的调试代码,完成开发时一条一条删除比较费功夫,而且不一定删除干净。在uglifyjs中传递--define DEBUG=false后,if条件句的花括号{}内的代码就不会被执行,就成了死代码(dead code),uglifyjs会删除死代码,这样的话,文件中所有的调试代码就会被删除。如下图:

    这样使用要求DEBUG不能在文件中定义过。可以在调试时将DEBUG定义为全局变量

    var DEBUG=true,调试完毕后将这条定义语句删除或注释掉,这样就可以使用上面方法去除调试语句了。

     

    Beautifier options 美化选项

    indent-level 缩进长度,默认为4

    indent-start 代码缩进开始的位置,默认为0,即对代码整体进行缩进

    inline-script 转义js代码字符串变量中的script标签

    ……

     

    Keeping copyright notices or other comments 保留版权提示或其他注释

    传递--comments默认会保留JSDoc风格的注释它包含“@preserve,"@license"或者

    @cc_on”。传递--comments all 保留所有的注释,或者用一个JavaScript正则表达式来值保留匹配正则的注释。例如,--comments '/foo|bar/' 将会只保留包含“foo”或“bar”的注释。

     

     

    https://npmjs.org/package/grunt-contrib-uglify

    js-contrib-uglify的使用

    Basic compression 常规压缩

    这个配置将会压缩和碾压(mangle压缩变量名)输入的文件用默认的选项

    grunt.initConfig({

    uglify: {

    my_target: {

    files: {

    'dest/output.min.js' : ['src/input1.js','src/input2.js']

    }

    }

    }

    });

    No mangling 不碾压

    指定 mangle: false阻止改变你的变量和函数名。

    grunt.initConfig({

    uglify: {

    options: {

    mangle: false

    },

    my_target: {

    fiels: {

    'dest/output.min.js': ['src/input.js']

    }

    }

    }

    })

    Reserved identifiers 保留标识符

    grunt.iniConfig({

    uglify: {

    options: {

    mangle: {

    except: ['jQuery','Backbone']

    }

    },

    my_target: {

    fiels: {

    'dest/output.min.js': ['src/input.js']

    }

    }

    }

    });

    Beautify 美化

    指定beautifytrue来美化你的代码用来调试和修改目的。你可以传递一个对象手动的配置任何输出选项。

     1 grunt.initConfit({
     2     uglify: {
     3     my_target: {
     4     options: {
     5     Beautify: true
     6     },
     7     files: {
     8     'dest/output.min.js': ['src/input.js']
     9     }
    10     },
    11     my_advanced_target: {
    12     options: {
    13     beautify: {
    14      80,
    15     beautify: true
    16     }
    17     },
    18     files: {
    19     'dest/output.min.js': ['src/input.js']
    20     }
    21     }
    22     }
    23 });

    Banner comments 标识信息

    在这个例子中,运行grunt uglify: my_target 将会在文件头插入一个标识,这个标识是通过将配置对象内嵌到banner模板字符串。这里,这些属性是从package.json文件引入的,再加上今天的日期。

    提示:你不必用外部的json文件。在config中创建pkg对象也是可以的。

    grunt.initConfit({

    uglify: {

    options: {

    Banner: '/* <%= pkg.name %> -v <%= pkg.version %> - */' + '<%= grunt.template.today("yyyy-mm-dd")%>';

    },

    my_target: {

    files: {

    'dest/output.min.js': ['src/input.js']

    }

    }

    }

    });

    Conditional compilation 条件编译

    uglifyjs的条件编译通常用来移除调试代码块。

     1 grunt.initConfig({
     2     uglify: {
     3     options:{
     4     compress: {
     5     Global_defs: {
     6     "DEBUG": false
     7     },
     8     dead_code: true
     9     }
    10     },
    11     my_target: {
    12     files: {
    13     'dest/output.min.js': ['src/input.js']
    14     }
    15     }
    16     
    17     }
    18 });

     

     

     

     

     

     

     

    Grunt-contirb-jshint的使用

    Wildcards 通配符

    grunt.initConfig({

    jshint: {

    all: ['Gruntfile.js','lib/**/*.js','test/**/*.js']

    }

    });

    用默认的jshint选项,运行grunt jshintall 将会检查工程的Gruntfilelib目录、test目录及其子目录的所有js文件。

    Linting before and after concatenating 在连接的前/后检查

    下面的例子中,运行grunt jshint 将会检查“beforeconcat”项和“afterconcat”项的文件。dist/output.js可能被检查时还没有被创建出来(通过grunt-contrib-concat插件concat任务)。

    这种情况下,你应该先检查“beforecaocat”文件,接着执行concat任务,然后检查“afterconcat”文件靠运行grunt jshintbeforeconcat concat jshintafterconcat

    grunt.initConfig({

    concat: {

    dist: {

    src: ['src/foo.js','src/bar.js'],

    dest: 'dist/output.js'

    }

    },

    jshint: {

    beforeconcat: ['src/foo.js','src/bar.js'],

    afterconcat: ['dist/output.js']

    }

    });

     

     

  • 相关阅读:
    WebCollector2.7爬虫框架——在Eclipse项目中配置
    JavaScript 输出
    CSS3 页面中展示邮箱列表点击弹出发送邮件界面
    CSS3 Flex Box(弹性盒子)
    CSS 分页实例
    CSS 图片
    CSS3 用户界面
    CSS3 动画
    CSS3 过渡
    CSS3 3D转换
  • 原文地址:https://www.cnblogs.com/kaixinbocai/p/3672698.html
Copyright © 2011-2022 走看看