zoukankan      html  css  js  c++  java
  • Grunt入门教程

    引入:grunt是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:

    • ① 压缩文件
    • ② 合并文件
    • ③ 简单语法检查

    环境:grunt是基于nodejs运行的,所以需要有nodejs,在Nodejs中,安装grunt的命令行接口。

    1 npm install -g grunt-cli
    View Code

    将grunt命令植入系统路径。通过nodejs的require查找到安装的grunt,就能在任意目录下运行grunt项目了。

    在一个简单的实例中,慢慢享受grunt给前端所带来的便捷与随心所欲。

    新建项目的时候,增加两个文件,一个为:package.json;另一个为:Gruntfile.js。


     

    package.json

    这个文件用来存储npm模块的依赖项(比如我们的打包若是依赖requireJS的插件,这里就需要配置)
    然后,我们会在里面配置一些不一样的信息,比如我们上面的file,这些数据都会放到package中
    对于package的灵活配置。


     

    Gruntfile

    这个文件尤其关键,他一般干两件事情:
    ① 读取package信息
    ② 插件加载、注册任务,运行任务(grunt对外的接口全部写在这里面)

    Gruntfile一般由四个部分组成
    ① 包装函数
    这个包装函数没什么东西,意思就是我们所有的代码必须放到这个函数里面

    module.exports = function (grunt) {
    //你的代码
    }

    这个不用知道为什么,直接将代码放入即可

    ② 项目/任务配置
    我们在Gruntfile一般第一个用到的就是initConfig方法配置依赖信息

    pkg: grunt.file.readJSON('package.json')

    这里的 grunt.file.readJSON就会将我们的配置文件读出,并且转换为json对象

    然后我们在后面的地方就可以采用pkg.XXX的方式访问其中的数据了
    值得注意的是这里使用的是underscore模板引擎,所以你在这里可以写很多东西

    uglify是一个插件的,我们在package依赖项进行了配置,这个时候我们为系统配置了一个任务
    uglify(压缩),他会干这几个事情:

    ① 在src中找到zepto进行压缩(具体名字在package中找到)
    ② 找到dest目录,没有就新建,然后将压缩文件搞进去
    ③ 在上面加几个描述语言

    这个任务配置其实就是一个方法接口调用,按照规范来就好,暂时不予关注,内幕后期来
    这里只是定义了相关参数,但是并未加载实际函数,所以后面马上就有一句:

    grunt.loadNpmTasks('grunt-contrib-uglify');

    用于加载相关插件

    最后注册一个自定义任务(其实也是默认任务),所以我们下面的命令行是等效的:

    grunt == grunt uglify

    实例:

    1 js压缩打包

    package.json文件

     1 {
     2   "name": "demo",
     3   "file": "zepto",
     4   "version": "0.1.0",
     5   "description": "demo",
     6   "license": "MIT",
     7   "devDependencies": {
     8     "grunt": "~0.4.1",
     9     "grunt-contrib-jshint": "~0.6.3",
    10     "grunt-contrib-uglify": "~0.2.1",
    11     "grunt-contrib-requirejs": "~0.4.1",
    12     "grunt-contrib-copy": "~0.4.1",
    13     "grunt-contrib-clean": "~0.5.0",
    14     "grunt-strip": "~0.2.1"
    15   },
    16   "dependencies": {
    17     "express": "3.x"
    18   }
    19 }

      1->1(一个文件打包压缩到另一个文件):

    1  module.exports = function (grunt) {
    2         banner: '/*! <%= pkg.file %>Qboooogle <%= grunt.template.today("yyyy-mm-dd") %> */
    '
    3       },
    4       build: {6         src: 'build/js/<%=pkg.file %>.js',
    7         dest: 'dist/js/<%= pkg.file %>.min.js'
    8       }
    9     }

       N->1(N个文件打包压缩到一个文件):

    1 module.exports = function (grunt) {
    2         banner: '/*! <%= pkg.file %>Qboooogle <%= grunt.template.today("yyyy-mm-dd") %> */
    '
    3       },
    4       build: {
    5         src: ['build/js/<%=pkg.file %>.js','build/js/<%=pkg.file %>1.js'],7         dest: 'dist/js/<%= pkg.file %>.min.js'
    8       }
    9     }

       N->N(通过my_target):

     1 module.exports = function (grunt) {
     2       options: {
     3         banner: '/*! <%= pkg.file %> Qboooogle <%= grunt.template.today("yyyy-mm-dd") %> */
    '
     4       },
     5       my_target : {
     6         files : {
     7           'dist/js/index.min.js':['build/js/index.js'],
     8           'dist/js/index1.min.js':['build/js/index1.js'],
     9           'dist/js/index2.min.js':['build/js/index1.js'],
    10           'dist/js/index3.min.js':['build/js/index1.js']
    11         }
    12       }
    13     }

    2 less编译打包

    N->N

     1     less : {
     2       development: {
     3         options: {
     4           compress: true
     5         },
     6         files: {
     7           "dist/css/index1.css":"build/less/index1.less",
     8           "dist/css/index.css" : "build/less/index.less"
     9         }
    10       }
    11     }

    N->1(将build/less/下的两个文件编译合并到dist/css/目录下)

     1  module.exports = function (grunt) {
     2     less : {
     3       development: {
     4         options: {
     5           compress: false
     6         },
     7         files: {
     8           "dist/css/index.css":["build/less/index1.less","build/less/index.less"]
     9         }
    10       }
    11     }

    开发模式与产品模式(唯一区别就是开发模式下,为了进行调试,尽量不压缩文件,而上线版本,最好将其进行压缩)代码表示将build/less/下的两个Less文件转化为dist/css/下的css文件,两者前者为未压缩版本。

     1 module.exports = function (grunt) {
     2  less : {
     3        development: {
     4          options: {
     5            compress: false
     6          },
     7         files: {
     8           "dist/css/index.css":["build/less/index1.less","build/less/index.less"]
     9         }
    10       },
    11       production: {
    12         options: {
    13           compress: true
    14         },
    15         files: {
    16           "dist/css/index4.css":["build/less/index1.less","build/less/index.less"]
    17         }
    18       }
    19     }

    3 图片优化(将图片进行优化处理,并生成新的文件,存放在另一个文件夹中)这里表示,匹配build/img下面的所有以png,jpg,gif,svg,jpeg格式结尾的文件,并一一进行优化处理,然后将优化后的图片放在dist/img/目录下。

     1 image : {
     2       dynamic : {
     3         files:[{
     4           expand:true,
     5           cwd:'build/img/',
     6           src:['**/*.{png,jpg,gif,svg,jpeg'],
     7           dest:'dist/img/'
     8         }]
     9       }
    10     }
    11   });

    4 js语法检查(按照自定义的标准,检测绑定的相关js文件是否有语法错误)

     1    jshint : {
     2       options: {
     3         jshintrc :'.jshintrc'
     4       },
     5       core: {
     6         src:'dist/js/index.min.js'
     7       },
     8       demo: {
     9          src:'dist/js/index1.min.js'
    10       }
    11     }

    5 监听(watch):通过绑定所有的js文件及less文件,并时时监听文件内容的变化,当变化发生时,将重新编译、压缩、打包生成最新的文件。

     1  uglify: {
     2       options: {
     3         banner: '/*! <%= pkg.file %> Qboooogle <%= grunt.template.today("yyyy-mm-dd") %> */
    '
     4       },
     5       build : {
     6          src: 'build/js/index.js',
     7          dest:'dist/js/index6.min.js'
     8       }
     9     },
    10     watch: {
    11       files: ["build/less/*.less","build/js/*.js"],
    12       tasks: ["less", "uglify"]
    13     },

    6 清理文件(构建成功后,将不再需要的文件删除,比如图片优化之后,之前的图片就可以清理掉了)

    1   clean: {
    2       build: ["build/img/*"]
    3     },

    7 css文件校验处理

    1   csslint: {
    2       options: {
    3         csslintrc: 'build/less/.csslintrc'
    4       },
    5       dist:[
    6       'dist/css/index1.css',
    7       ]
    8     }

    8 链接Bootstrap HTML 并进行语法检查

    1  bootlint: {
    2       options: {
    3         relaxerror: ['W002','W003','W005','W007']
    4       },
    5       files: ['*.html']
    6     },

    9 构建HTML模板

     1 includes: {
     2       build: {
     3         src: ['*.html'], // Source files
     4         dest: 'documentation/', // Destination directory
     5         flatten: true,
     6         cwd: 'documentation/build',
     7         options: {
     8           silent: true,
     9           includePath: 'documentation/build/include'
    10         }
    11       }

    其中css链接处理需要的.jshintrc文件如下:

     1 {
     2   "adjoining-classes": false,
     3   "box-sizing": false,
     4   "box-model": false,
     5   "compatible-vendor-prefixes": false,
     6   "floats": false,
     7   "font-sizes": false,
     8   "gradients": false,
     9   "important": false,
    10   "known-properties": false,
    11   "outline-none": false,
    12   "qualified-headings": false,
    13   "regex-selectors": false,
    14   "shorthand": false,
    15   "text-indent": false,
    16   "unique-headings": false,
    17   "universal-selector": false,
    18   "unqualified-attributes": false,
    19   "ids": false,
    20   "fallback-colors": false,
    21   "vendor-prefix": false,
    22   "import": false
    23 }

    完整的Gruntfile.js文件如下:

      1 module.exports = function (grunt) {
      2   grunt.initConfig({
      3     pkg: grunt.file.readJSON('package.json'),
      4     uglify: {
      5       options: {
      6         banner: '/*! <%= pkg.file %> Qboooogle <%= grunt.template.today("yyyy-mm-dd") %> */
    '
      7       },
      8       build : {
      9          src: 'build/js/index.js',
     10          dest:'dist/js/index6.min.js'
     11       }
     12     },
     13     watch: {
     14       files: ["build/less/*.less","build/js/*.js"],
     15       tasks: ["less", "uglify","image","clean"]
     16     },
     17     concat: {
     18       options: {
     19         separator: ';'
     20       },
     21       dist: {
     22         src:["build/less/index1.less","build/less/index.less"],
     23         dest:"build/less/index3.less"
     24       }
     25     },
     26     less : {
     27       development: {
     28         options: {
     29           compress: false
     30         },
     31         files: {
     32           "dist/css/index6.css":["build/less/index1.less","build/less/index.less"]
     33         }
     34       },
     35       production: {
     36         options: {
     37           compress: true
     38         },
     39         files: {
     40           "dist/css/index5.css":["build/less/index1.less","build/less/index.less"]
     41         }
     42       }
     43     },
     44     clean: {
     45       build: ["build/img/*"]
     46     },
     47     uglify: {
     48       options: {
     49         mangle:true,
     50         preserveComments:'some'
     51       }
     52     },
     53 
     54     cssmin: {
     55       compress: {
     56         files: {
     57           "dist/css/index.css": [
     58           "build/less/index1.less",
     59           "build/less/index.less"
     60         ]
     61         }
     62       }
     63     }
     64     image: {
     65       dynamic: {
     66         files: [{
     67           expand: true,
     68           cwd: 'build/img/',
     69           src: ['**/*.{png,jpg,gif,svg,jpeg}'],
     70           dest: 'dist/img/'
     71         }]
     72       }
     73     },
     74     csslint: {
     75       options: {
     76         csslintrc: 'build/less/.csslintrc'
     77       },
     78       dist:[
     79       'dist/css/index1.css',
     80       ]
     81     },
     82     bootlint: {
     83       options: {
     84         relaxerror: ['W002','W003','W005','W007']
     85       },
     86       files: ['*.html']
     87     },
     88     includes: {
     89       build: {
     90         src: ['*.html'], // Source files
     91         dest: 'documentation/', // Destination directory
     92         flatten: true,
     93         cwd: 'documentation/build',
     94         options: {
     95           silent: true,
     96           includePath: 'documentation/build/include'
     97         }
     98       }
     99     }
    100     jshint : {
    101       options: {
    102         jshintrc :'.jshintrc'
    103       },
    104       core: {
    105         src:'dist/js/index.min.js'
    106       },
    107       demo: {
    108          src:'dist/js/index1.min.js'
    109       }
    110     }
    111   });
    112 
    113   grunt.loadNpmTasks('grunt-contrib-jshint');
    114     grunt.loadNpmTasks('grunt-image');
    115     grunt.loadNpmTasks('grunt-contrib-less');
    116     grunt.loadNpmTasks('grunt-contrib-clean');
    117     grunt.loadNpmTasks('grunt-contrib-csslint');
    118     grunt.loadNpmTasks('grunt-bootlint');
    119     grunt.loadNpmTasks('grunt-includes');
    120   grunt.loadNpmTasks("grunt-contrib-concat");
    121    grunt.loadNpmTasks("grunt-contrib-watch");
    122    grunt.loadNpmTasks("grunt-contrib-uglify");
    123   grunt.loadNpmTasks('grunt-contrib-cssmin');
    124 
    125    grunt.registerTask('link', ['includes']);
    126    grunt.registerTask('default', ['includes']);
    127   // Linting task
    128   //grunt.registerTask('lint', ['jshint', 'csslint', 'bootlint']);
    129 
    130   // The default task (running "grunt" in console) is "watch"
    131   //grunt.registerTask('default', ['watch']);
    132 }

    完整的目录结构如下:

    整项目代码下载:Qboooogle

  • 相关阅读:
    QT学习笔记
    局域网摄像头安装与调试
    从0开始搭建视觉检测智能车
    树莓派安装anaconda
    手把手教你搭建视觉检测智能车
    树莓派与Arduino串口通信实验
    树莓派设置关机重启键
    树莓派can通信
    树莓派GPIO使用笔记
    MySQL练习题
  • 原文地址:https://www.cnblogs.com/qbzmy/p/5877325.html
Copyright © 2011-2022 走看看