Grunt

作者: fb941c99409d | 来源:发表于2020-08-15 03:10 被阅读0次
    • Grunt介绍

    中文主页 : http://www.gruntjs.net
    是一套前端 自动化构建 工具,一个基于nodeJs的命令行工具
    它是一个 任务运行器 , 配合其丰富强大的插件
    常用功能:
    ----------合并文件(js/css)
    ----------压缩文件(js/css)
    ----------语法检查(js)
    ----------less/sass预编译处理
    ----------其它...

    • 安装nodejs, 查看版本

    node -v

    • 创建一个简单的应用grunt_test
    |- build----------构建生成的文件所在的文件夹
        |- src------------源码文件夹 
            |- js---------------js源文件夹
            |- css--------------css源文件夹
    |- index.html-----页面文件
    |- Gruntfile.js---grunt配置文件(注意首字母大写)
    |- package.json---项目包配置文件
    
    • 全局安装 grunt-cli

    cnpm install -g grunt-cli

    • 安装grunt

    cnpm install grunt --save-dev

    • 配置文件: Gruntfile.js 此配置文件本质就是一个node函数类型模块 配置编码包含3步:

    1. 初始化插件配置
    2. 加载插件任务
    3. 注册构建任务

    基本编码:
    module.exports = function(grunt){
        // 1\. 初始化插件配置
        grunt.initConfig({
             //主要编码处
        });
        // 2\. 加载插件任务
        // grunt.loadNpmTasks('grunt-contrib-concat');
        // 3\. 注册构建任务
        grunt.registerTask('default', []);
    };
    

    命令: grunt //提示成功, 但没有任何效果(还没有使用插件定义任务)

    • Grunt插件介绍

    grunt官网的插件列表页面 http://www.gruntjs.net/plugins
    插件分类:
    --------- grunt团队贡献的插件 : 插件名大都以contrib-开头
    --------- 第三方提供的插件 : 大都不以contrib-开头
    常用的插件:
    --------- grunt-contrib-clean—— 清除文件(打包处理生成的)
    --------- grunt-contrib-concat——合并多个文件的代码到一个文件中
    --------- grunt-contrib-uglify——压缩js文件
    --------- grunt-contrib-jshint——javascript语法错误检查
    --------- grunt-contrib-cssmin——压缩/合并css文件
    --------- grunt-contrib-htmlmin——压缩html文件
    --------- grunt-contrib-imagemin——压缩图片文件(无损)
    --------- grunt-contrib-copy—— 复制文件、文件夹
    --------- grunt-contrib-requirejs**—— 合并压缩requirejs管理的所有js模块文件
    --------- grunt-contrib-watch—— 实时监控文件变化、调用相应的任务重新执行

    • 合并js: 使用concat插件

    下载插件 cnpm install grunt-contrib-concat --save-dev

    `1. 编码:`
    //  src/js/test1.js
    (function () {
        function add(num1, num2) {
            return num1 + num2;
        }
        console.log(add(10, 20));
    })();
    
    //  src/js/test2.js
    
    (function () {
        var arr = [2,3,4].map(function (item, index) {
            return item+1;
        });
        console.log(arr);
    })();
    
    ` 2. 配置: Gruntfile.js`
    
    module.exports = function(grunt) {
        // 配置任务
        grunt.initConfig({
            //任务名
            concat: {
                //可选项配置
                options: {
                    //使用;连接合并
                    separator: ';',
                },
                dist: {
                    //合并哪些js文件,也可以指定具体合并文件['src/1.js','src/2.js']
                    src: ['src/js/*.js'],
                    //输出地址
                    dest: 'build/js/build.js'
                }
            }
        });
        // 加载包含 "concat" 任务的插件。
        grunt.loadNpmTasks('grunt-contrib-concat');
    };
    
    `3. 执行命令: grunt concat   //会在build下生成一个built.js`
    
    • 压缩js: 使用uglify插件

    下载插件 cnpm install grunt-contrib-uglify --save-dev
    注意: 压缩任务执行的结果, 会将虽然声明过,但从没使用的函数/变量 剔除掉

    ` 1. 配置: Gruntfile.js`
    
    module.exports = function(grunt) {
        // 配置任务
        grunt.initConfig({
            pkg: grunt.file.readJSON('package.json'),
            uglify: {
                options: {
                    banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
                    '<%= grunt.template.today("yyyy-mm-dd") %> */'
                },
                build_min: {
                    files: {
                        'build/js/build.min.js': ['build/js/build.js']
                    }
                }
            }
        });
        // 加载包含 "uglify" 任务的插件。
        grunt.loadNpmTasks('grunt-contrib-uglify');
    };
    
    `3. 执行命令: grunt uglify  会将build/js/build.js 压缩为 build/js/build.min.js`
    
    • 默认任务: 注册任务队列 , 执行 grunt命令 , 自动 同步 执行队列任务

    同步执行 就要注意一下,任务的顺序了, 仔细想想下一个任务依赖不依赖上一个任务的结果

    module.exports = function(grunt) {
      // 配置任务
      grunt.initConfig({
       ............
      });
      // 加载插件。
      grunt.loadNpmTasks('........');
      // 加载包含 "concat" 任务的插件。
      //grunt.loadNpmTasks('grunt-contrib-concat');
    
      // 命令行执行 grunt  执行默认的任务列表。
      grunt.registerTask('default', ['concat','uglify']);
    
    };
    
    • js语法检查: 使用jshint插件

    下载插件 cnpm install grunt-contrib-jshint --save-dev

    ` 1. 新建 .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"] 
    }
    ` 2.  Gruntfile.js`
    //配置任务
    jshint : {
      options: {
        jshintrc : '.jshintrc' //指定配置文件,在根目录可以不写路径
      },
      build : ['Gruntfile.js', 'src/js/*.js'] //指定检查的文件
    }
    //加载插件
    grunt.loadNpmTasks('grunt-contrib-jshint');
    //注册任务
    grunt.registerTask('default', ['concat', 'uglify', 'jshint']);
    ` 3. 执行 grunt 命名`
    
    • CSS压缩&合并 使用 cssmin插件

    下载插件 cnpm install grunt-contrib-cssmin --save-dev

    ` 1. 编码`
    // src/css/1.css
    #box1 {
      width: 100px;
      height: 100px;
      background: red;
    }
    // src/css/2.css
    #box2 {
      width: 200px;
      height: 200px;
      background: blue;
    }
    // index.html
    <link rel="stylesheet" href="build/css/output.min.css">
    <div id="box1"></div>
    <div id="box2"></div>
    
    ` 2. Gruntfile.js`
    // 配置任务
    cssmin:{
      options: {
        shorthandCompacting: false,
        roundingPrecision: -1
      },
      build: {
        files: {
            'build/css/build.min.css': ['src/css/*.css']
        }
      }
    }
    // 加载插件
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    // 注册任务
    grunt.registerTask('default', ['concat', 'uglify', 'jshint', 'cssmin']);
    
    ` 3. 执行命令`
    grunt 
    
    • 使用watch插件(真正实现自动化 )

    下载插件 cnpm install grunt-contrib-watch --save-dev

    ` 1. Gruntfile.js `
    // 配置任务
    watch : {
      scripts : {
        files : ['src/js/*.js', 'src/css/*.css'],
        tasks : ['concat', 'jshint', 'uglify', 'cssmin'],
        //true:全量更新 不管更新的是什么 js css文件的任务全部更新一遍 false:变量更新 表示只更新当前文件类型的任务
        options : {spawn : false}  
      }
    }
    
    //加载插件
    grunt.loadNpmTasks('grunt-contrib-watch');
    //注册任务
    grunt.registerTask('default', ['concat', 'uglify', 'jshint', 'watch']);
    //执行命名 监控文件变化, 自动构建 
    grunt
    
    2. 改进
    //开发完毕执行 grunt命令 生成项目 提交代码
    grunt.registerTask('default', ['concat', 'uglify', 'jshint']); 
    //开发的时候 使用 grunt myWatch , 实时监控 变化 ,自动构建项目
    grunt.registerTask('myWatch', ['default','watch']);
    
    • 使用Sass插件

    下载插件 cnpm install grunt-contrib-sass --save-dev

    ` 1. 编码`
    // src/test.scss
    $baseWidth :50px;
    $baseWidth :100px !default;
    
    #box1{
        width: $baseWidth;
    }
    ` 2 . Gruntfile.js`
    // 配置任务
    sass: {
        dist: {
            files: [{
                expand: true,
                cwd: 'src/css',
                src: ['*.scss'],
                dest: 'src/css',
                ext: '.css'
            }]
        }
    }
    //加载插件
    grunt.loadNpmTasks('grunt-contrib-sass');
    // 修改watch 监听任务顺序,将sass的任务处理 放在cssmin任务之前
    watch : {
          scripts : {
            files : ['src/js/*.js', 'src/css/*.css','src/css/*.scss'],
            tasks : ['concat', 'jshint', 'uglify','sass', 'cssmin'],
            //true:全量更新 不管更新的是什么 js css文件的任务全部更新一遍 false:变量更新 表示只更新当前文件类型的任务
            options : {spawn : false}  
          }
    }
    //修改 registerTask的默认任务队列, 将sass的任务处理 放在cssmin任务之前
    grunt.registerTask('default', ['concat','uglify','jshint','sass','cssmin']);
    //执行监听
    grunt myWatch
    

    相关文章

      网友评论

          本文标题:Grunt

          本文链接:https://www.haomeiwen.com/subject/uvrgdktx.html