• 自动化构建工具 grunt [国外使用较多]


    Grunt

    代码: https://github.com/RyenToretto/grunt-gulp-webpack

    环境: node 版本 > 0.8

    特点: 

    自动化: 压缩、合并、编译等等操作,前提是 Gruntfile.js 文件配置好了

    Gruntfile.js 或 Gruntfile.coffee,用来配置或定义任务(task)并加载Grunt插件的

    grunt 插件: grunt 作为大脑,指挥插件们工作

    contrib-官方维护的插件

    项目结构: 

    1. 全局安装 grunt 脚手架 命令行接口 grunt-cli

    sudo npm install -g grunt-cli

    调用与 Gruntfile.js 在同一目录中 Grunt

    2. 局部安装 grunt

    sudo npm install --save-dev grunt

    每次运行grunt 时,他就利用node提供的require()系统查找本地安装的 Grunt。

    正是由于这一机制,你可以在项目的任意子目录中运行 grunt,更多详情请阅读源码

    3. 编辑 Gruntfile.js

    • 在下面列出的这个 Gruntfile.js 中

    package.json 文件中的项目元数据(metadata)被导入到 Grunt 配置中

     grunt-contrib-uglify 插件中的 uglify 任务(task)被配置为压缩(minify)源码文件

    并依据上述元数据动态生成一个文件头注释。

    当在命令行中执行 grunt 命令时,uglify 任务将被默认执行。

    commonJS 模块化语法 暴露

    • module.exports = function(grunt) {
      
        // 初始化配置 grunt 任务.
        grunt.initConfig({
        });
      
        // 当 grunt 执行时,要加载的插件。
        // grunt.loadNpmTasks('');
      
        // 注册 构建任务 列表。
        grunt.registerTask('default', []); // 默认任务,依赖为 []
      };

    4. 加入 合并 js 的插件 grunt-contrib-concat 

    (1) sudo npm install --save-dev grunt-contrib-concat

    (2) 修改 Gruntfile.js

    • module.exports = function(grunt) {
          // 初始化配置 grunt 任务.
          grunt.initConfig({
              concat: {
                  options: {
                      separator: ';', // 连接符, 两个 js 文件之间 以 ; 连接
                  }, // 选项
                  dist: {
                      src: ['src/js/*.js'], // 要合并的 源文件
                      dest: 'dist/built.js', // 输出到的 新文件
                  }, // 合并
              }, // 执行任务的任务名
          });
      
          // 当 grunt 执行时,要加载的插件。
          grunt.loadNpmTasks('grunt-contrib-concat');
      
          // 注册 构建任务 列表。
          grunt.registerTask('default', []); // 默认任务,依赖为 []
      
      };

    (3) 执行 concat 任务

    grunt concat

    (4) 科学的 Gruntfile.js打包路径: 

    (5) index.html 调用下 js 看看效果

    • <!DOCTYPE html>
      <html>
        <head>
          <meta http-equiv="content-type" content="text/html" charset="utf-8">
          <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
          <meta name="viewport" content="width=device-width,initial-scale=1.0">
      
          <link rel="shortcut icon" href="https://img-yunzhi.cdn.bcebos.com/yz-favicon.ico" />
          <link rel="bookmark" href="https://img-yunzhi.cdn.bcebos.com/yz-favicon.ico" type="image/x-icon" />
          <title>自动化构建 - grunt</title>
      
          <script type="text/javascript" src="./static/js/fastclick.js"></script>
        </head>
        <body>
          <div id="app"></div>
      
      
      
      
          <script type="text/javascript">
            if ('addEventListener' in document) {
              document.addEventListener('DOMContentLoaded', function() {
                FastClick.attach(document.body);
              }, false);
            }
            if(!window.Promise) {
              document.writeln('<script src="https://as.alipayobjects.com/g/component/es6-promise/3.2.2/es6-promise.min.js"'+'>'+'<'+'/'+'script>');
            }    /* 解决点击响应延时 0.3s 问题 */
          </script>
          <script type="text/javascript" src="./build/js/build.js"></script>
        </body>
      </html>

    5. 加入 压缩 js 的插件 grunt-contrib-uglify , 注册自动化任务数组

    (1) sudo npm install --save-dev grunt-contrib-uglify 

    (2) 修改 Gruntfile.js

    • module.exports = function(grunt) {
          // 初始化配置 grunt 任务.
          grunt.initConfig({
              pkg: grunt.file.readJSON('package.json'),
              concat: {
                  options: {
                      separator: ';', // 连接符, 两个 js 文件之间 以 ; 连接
                  }, // 选项
                  dist: {
                      src: ['src/js/*.js'], // 要合并的 源文件
                      dest: 'build/js/build.js', // 输出到的 新文件
                  }, // 合并
              }, // concat 执行 合并任务 的任务名
              uglify: {
                  options: {
                      // 压缩文件的 顶部注释
                      banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
                          '<%= grunt.template.today("yyyy-mm-dd") %> */'
                  },
                  build: {
                      files: {
                          'build/js/build.min.js': ['build/js/build.js']
                      }
                  }
              } // uglify 执行 压缩任务 的任务名
          });
      
          // 当 grunt 执行时,要加载的插件。
          grunt.loadNpmTasks('grunt-contrib-concat');
          grunt.loadNpmTasks('grunt-contrib-uglify');
      
          // 注册 构建任务 列表。
          grunt.registerTask('default', [
              'concat',
              'uglify'
          ]); // 默认任务,依赖为 [], 执行 'grunt default' / 'grunt' 后,会顺序执行数组里的任务
      };

    (3) 执行 grunt 

    6. 默认任务的 数组,会同步,顺序执行,所以先后顺序很重要

    7. 加入 js-hint 语法检查插件

    (1) sudo npm install --save-dev grunt-contrib-jshint

    (2) 创建并配置 .jshintrc 文件

    • {
          "curly": true,
          "eqeqeq": true,
          "eqnull": true,
          "expr": true,
          "immed": true,
          "newcap": true,
          "noempty": true,
          "noarg": true,
          "regexp": true,
          "browser": true,
          "devel": true,
          "node": true,
          "boss": false,
      
          "undef": true,
          "asi": false,
          "predef": [ "define", "BMap", "angular", "BMAP_STATUS_SUCCESS"]
      }

    (3) 配置 Gruntfile.js

    • module.exports = function(grunt) {
          // 初始化配置 grunt 任务.
          grunt.initConfig({
              pkg: grunt.file.readJSON('package.json'),
              concat: {
                  options: {
                      separator: ';', // 连接符, 两个 js 文件之间 以 ; 连接
                  }, // 选项
                  dist: {
                      src: ['src/js/*.js'], // 要合并的 源文件
                      dest: 'build/js/build.js', // 输出到的 新文件
                  }, // 合并
              }, // concat 执行 合并任务 的任务名
              uglify: {
                  options: {
                      // 压缩文件的 顶部注释
                      banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
                          '<%= grunt.template.today("yyyy-mm-dd") %> */'
                  },
                  build: {
                      files: {
                          'build/js/build.min.js': ['build/js/build.js']
                      }
                  }
              }, // uglify 执行 压缩任务 的任务名
              jshint : {
                  options: {
                      jshintrc : '.jshintrc' //指定配置文件
                  },
                  build : ['Gruntfile.js', 'src/js/*.js'] //指定检查的文件
              },
          });
      
          // 当 grunt 执行时,要加载的插件。
          grunt.loadNpmTasks('grunt-contrib-concat');
          grunt.loadNpmTasks('grunt-contrib-uglify');
          grunt.loadNpmTasks('grunt-contrib-jshint');
      
          // 注册 构建任务 列表。
          grunt.registerTask('default', [
              'concat',
              'uglify',
              'jshint'
          ]); // 默认任务,依赖为 [], 执行 'grunt default' / 'grunt' 后,会顺序执行数组里的任务
      };

    (4) 构建

    grunt

    8. 加入 合并压缩 css 的插件

    (1) sudo npm install --save-dev grunt-contrib-cssmin

    (2) 配置 Gruntfile.js

    • module.exports = function(grunt) {
          // 初始化配置 grunt 任务.
          grunt.initConfig({
              pkg: grunt.file.readJSON('package.json'),
              concat: {
                  options: {
                      separator: ';', // 连接符, 两个 js 文件之间 以 ; 连接
                  }, // 选项
                  dist: {
                      src: ['src/js/*.js'], // 要合并的 源文件
                      dest: 'build/js/build.js', // 输出到的 新文件
                  }, // 合并
              }, // concat 执行 合并任务 的任务名
              uglify: {
                  options: {
                      // 压缩文件的 顶部注释
                      banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
                          '<%= grunt.template.today("yyyy-mm-dd") %> */'
                  },
                  build: {
                      files: {
                          'build/js/build.min.js': ['build/js/build.js']
                      }
                  }
              }, // uglify 执行 压缩任务 的任务名
              jshint : {
                  options: {
                      jshintrc : '.jshintrc' //指定配置文件
                  },
                  build : ['Gruntfile.js', 'src/js/*.js'] //指定检查的文件
              }, // 语法检查插件
              cssmin: {
                  options: {
                      shorthandCompacting: false,
                      roundingPrecision: -1
                  },
                  build: {
                      files: {
                          'build/css/build.min.css': ['src/css/*.css']
                      }
                  }
              } // css 合并压缩插件
          });
      
          // 当 grunt 执行时,要加载的插件。
          grunt.loadNpmTasks('grunt-contrib-concat');
          grunt.loadNpmTasks('grunt-contrib-uglify');
          grunt.loadNpmTasks('grunt-contrib-jshint');
          grunt.loadNpmTasks('grunt-contrib-cssmin');
      
          // 注册 构建任务 列表。
          grunt.registerTask('default', [
              'concat',
              'uglify',
              'jshint',
              'cssmin'
          ]); // 默认任务,依赖为 [], 执行 'grunt default' / 'grunt' 后,会顺序执行数组里的任务
      };

    (3) 构建

    grunt

    9. 实现 watch 监视文件修改任务,实现自动打包编译

    (1) sudo npm install --save-dev grunt-contrib-watch

    (2) 修改 Gruntfile.js

    • module.exports = function(grunt) {
          // 初始化配置 grunt 任务.
          grunt.initConfig({
              pkg: grunt.file.readJSON('package.json'),
              concat: {
                  options: {
                      separator: ';', // 连接符, 两个 js 文件之间 以 ; 连接
                  }, // 选项
                  dist: {
                      src: ['src/js/*.js'], // 要合并的 源文件
                      dest: 'build/js/build.js', // 输出到的 新文件
                  }, // 合并
              }, // concat 执行 合并任务 的任务名
              uglify: {
                  options: {
                      // 压缩文件的 顶部注释
                      banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
                          '<%= grunt.template.today("yyyy-mm-dd") %> */'
                  },
                  build: {
                      files: {
                          'build/js/build.min.js': ['build/js/build.js']
                      }
                  }
              }, // uglify 执行 压缩任务 的任务名
              jshint : {
                  options: {
                      jshintrc : '.jshintrc' //指定配置文件
                  },
                  build : ['Gruntfile.js', 'src/js/*.js'] //指定检查的文件
              }, // 语法检查插件
              cssmin: {
                  options: {
                      shorthandCompacting: false,
                      roundingPrecision: -1
                  },
                  build: {
                      files: {
                          'build/css/build.min.css': ['src/css/*.css']
                      }
                  }
              }, // css 合并压缩插件
              watch : {
                  scripts : {
                      files : ['src/js/*.js', 'src/css/*.css'],
                      tasks : ['concat', 'jshint', 'uglify', 'cssmin'],
                      options : {spawn : false}//增量更新---全量更新
                  }
              }
          });
      
          // 当 grunt 执行时,要加载的插件。
          grunt.loadNpmTasks('grunt-contrib-concat');
          grunt.loadNpmTasks('grunt-contrib-uglify');
          grunt.loadNpmTasks('grunt-contrib-jshint');
          grunt.loadNpmTasks('grunt-contrib-cssmin');
          grunt.loadNpmTasks('grunt-contrib-watch');
      
          // 注册 构建任务 列表。
          grunt.registerTask('default', [
              'concat',
              'uglify',
              'jshint',
              'cssmin'
          ]); // 默认任务,依赖为 [], 执行 'grunt default' / 'grunt' 后,会顺序执行数组里的任务
          grunt.registerTask('build', ['default']);
          grunt.registerTask('dev', ['default', 'watch']);
      };

    (3) grunt dev

     

    --------小尾巴 ________一个人欣赏-最后一朵颜色的消逝-忠诚于我的是·一颗叫做野的心.决不受人奴役.怒火中生的那一刻·终将结束...
  • 相关阅读:
    利用UncaughtExceptionHandler捕获未try...catch到的异常
    nodejs
    angularjs异步处理 $q.defer()
    springboot集成swagger
    面试相关
    springboot注解
    关于自动拆装箱
    sonar集成搭建
    Predicate 类
    idea快捷键
  • 原文地址:https://www.cnblogs.com/tianxiaxuange/p/11012116.html
Copyright © 2020-2023  润新知