zoukankan      html  css  js  c++  java
  • 自动化构建工具 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

     

    --------小尾巴 ________一个人欣赏-最后一朵颜色的消逝-忠诚于我的是·一颗叫做野的心.决不受人奴役.怒火中生的那一刻·终将结束...
  • 相关阅读:
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & ManacherK
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher J
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher I
    pat 1065 A+B and C (64bit)(20 分)(大数, Java)
    pat 1069 The Black Hole of Numbers(20 分)
    pat 1077 Kuchiguse(20 分) (字典树)
    pat 1084 Broken Keyboard(20 分)
    pat 1092 To Buy or Not to Buy(20 分)
    pat 1046 Shortest Distance(20 分) (线段树)
    pat 1042 Shuffling Machine(20 分)
  • 原文地址:https://www.cnblogs.com/tianxiaxuange/p/11012116.html
Copyright © 2011-2022 走看看