Grunt 构建网站初探

一直在钻研关于 Umbraco 的东西, 打算换换脑子,玩点别的东西先。

Grunt 是之前两个项目中,尝试开始使用的东西,因为不是专职的前端攻城狮,所以对于这类东西还是知之甚少,不过经过这两次的使用,真心觉得这种东西非常的便利,选择了对的工具,很多工作都可是事半功倍的。

具体 Grunt 是什么,请自行前往官网了解。中文版网站,近期不知为何不能访问了,www.gruntjs.net,看起来不是被墙的原因,似乎是服务除了什么故障。

How to started,根据官网的指南一步步做下来即可。之前一直在用 mac,给同事 Windows 安装时确实也遇到了一点问题,在此仅给出 Windows平台安装的的一点建议。

1、不必使用类似于 n 或者 nvm 一类的 node 版本管理工具进行安装,这在某些集团企业中,设置权限是非常麻烦的事情;

2、直接下载 nodejs 官网的 for windows 安装包下载 node,安装好之后,运行:

npm install -g grunt grunt-cli grunt-init

  *以上分别是安装 grunt、grunt 命令行工具,init 是一个 grunt 插件,可以初始化基本的 grunt 文件结构。

3、安装好后,一定记得设置 windows 环境变量,将 Grunt 安装的目录,配置到系统 PATH 路径中去,否则当你关闭 dos 窗口再开启,则会提示找不到 Grunt 命令,而你再次安装又会提示报错。

Grunt 结构中,有两个最为重要的结构性描述文件:package.json、Gruntfile.js,前者实际也是 node 项目的标配,后者是 Grunt 独有的构建文件。

package.json 文件:

{
  "name": "grunt_templete",
  "version": "1.0.0",
  "description": "基础的Grunt项目模板",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://git.oschina.net/xxxx"
  },
  "devDependencies": {
    "grunt": "^1.0.1",
    "grunt-contrib-clean": "^1.1.0",
    "grunt-contrib-concat": "^1.0.1",
    "grunt-contrib-copy": "^1.0.0",
    "grunt-contrib-cssmin": "^2.2.0",
    "grunt-contrib-htmlmin": "^2.3.0",
    "grunt-contrib-jshint": "^1.1.0",
    "grunt-contrib-less": "^1.4.1",
    "grunt-contrib-uglify": "^3.0.1",
    "grunt-contrib-watch": "^1.0.0"
  }
}

  *其中,关于依赖包的版本号,是需要权衡考虑的,如果项目时间较长,可能会不定期的更新 package.json,导致团队间共享要小心该文件的管理,还是改为固定版本较好;如果是短期项目,则可是使用"^"来自动更新至最新版本。

Gruntfile.js 文件:

module.exports = function(grunt) {
    grunt.file.defaultEncoding = 'utf-8';
    /**project configuration*/
    grunt.initConfig({
        pkg : grunt.file.readJSON('package.json'),

        clean: {
            contents: ['dest/*'],
            subfolders: ['dest/*/'],
            css: ['dest/assets/css/*'],
            js: ['dest/assets/js/*'],
            cleantemp:['dest/assets/css/temp']
        },
        less: {
            default: {
                files: [{
                    expand: true,
                    cwd: 'src/less',
                    src: ['*.less'],
                    dest: 'dest/assets/css/temp',
                    ext: '.css'
                }]
            }
        },
        cssmin: {
            default:{
                files: [{
                    expand: true,
                    cwd: 'dest/assets/css/temp',
                    src: ['*.css'],
                    dest: 'dest/assets/css/',
                    ext: '.min.css'
                }]
            }
        },
        jshint:{
            options:{
                expr:true, 
                lastsemic : true,
                scripturl:true, 
                ignores : ['dealer-*.js']
            },
            beforeuglify:['Gruntfile.js', 'src/js/*.js'],
            afteruglify:['dest/assets/js/*.js', '!dest/assets/js/dealer.min.js']
        },
        uglify:{
            buildall: {
                files: [{
                    expand:true,
                    cwd: 'src/js',
                    src:'*.js',//所有js文件
                    dest: 'dest/assets/js',//输出到此目录下
                    ext: '.min.js'
                }]
            },
        },
        copy: {
            main: {
                expand: true,
                nonull: true,
                cwd: 'src/html',
                src: '**',
                dest: 'dest/',
                options: {
                }
            },
            resources: {
                expand: true,
                nonull: true,
                cwd: 'src/images',
                src: '**',
                dest: 'dest/assets/images',
            }
        },
        watch: {
            css: {
                files: ['src/less/*.less'],
                tasks: ['less', 'cssmin', 'clean:cleantemp'],
                options: {
                    interrupt: true,
                    spawn: false
                }
            },
            js: {
                files: ['src/js/*.js'],
                tasks: ['jshint:beforeuglify', 'uglify', 'jshint:afteruglify'],
                options: {
                    interrupt: true,
                    spawn: false
                }
            },
            resources: {
                files: ['src/html/*', 'src/html/**/*', 'src/images/*', 'src/images/**/*'],
                tasks: ['copy'],
                options: {
                    interrupt: true,
                    spawn: false,
                    event: ['all'],
                }
            }
        }
    });

    /**load tasks package*/
    grunt.loadNpmTasks('grunt-contrib-clean');
    grunt.loadNpmTasks('grunt-contrib-less');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks('grunt-contrib-jshint');/**语法检查**/
    grunt.loadNpmTasks('grunt-contrib-uglify');/**js 压缩**/
    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-contrib-watch');
    
    grunt.registerTask('default', ['clean', 'less', 'cssmin', 'jshint:beforeuglify', 'uglify', 'jshint:afteruglify', 'clean:cleantemp', 'copy', 'watch']);
};

*这是我目前比较常用的基本包,包含了文件清理、less 编译、css 压缩、 js语法检查(分压缩前和压缩后)、压缩、html 以及其他资源文件的复制、文件变动的检测。每次运行 Grunt 命令之后,即可专注于前端的工作,不必再去考虑 js 语法、css 格式等问题,复制文件路径等。如果语法错误,命令行中会有醒目的提示;如果无误,修改后即可在浏览器中直接查看。

so easy!!!

所有的组件及使用方法,均可在官方插件库(https://gruntjs.com/plugins)找到,这里也不再赘述谁都在讲的内容了。

对于工具的态度,我一直是点到即止,不求甚解,使用时先让它动起来,遇到问题,需要研究再认真钻研。

原文地址:https://www.cnblogs.com/bashenandi/p/grunt-project.html