# Grunt 快速入门

1,113 阅读2分钟

Grunt 是JS的任务自动化工具。假设我们使用它来做js文件的混淆,我们需要如下组件:

grunt-cli 命令行
grunt     grunt组件
grunt-contrib-uglify-es 代码混淆组件

首先安装在继续学习前,你需要先将Grunt命令行(CLI)安装到全局环境中,把另外两个加入到本地开发依赖中:

npm install -g grunt-cli
npm install grunt  --save-dev
npm install grunt-contrib-uglify-es --save-dev

项目练手

假定你有一个项目,应该有一个配置好package.json,我们可以使用如下命令生成此文件:

npm init -y

假设一个action.js文件,内容如下:

console.log(`42`)

Gruntfile文件案例

想要把任务自动化跑起来,还需要一个Grunt配置文件:

touch Gruntfile.js

Grunt 配置中, grunt-contrib-uglify 插件中的uglify 任务:

module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        uglify: {
            options: {
                banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
            },
            build: {
                src: 'action.js',
                dest: 'action.min.js'
            }
        }
    });
    // 加载包含 "uglify" 任务的插件。
    grunt.loadNpmTasks('grunt-contrib-uglify-es');
    // 默认被执行的任务列表。
    grunt.registerTask('default', ['uglify']);
};

前面已经向你展示了整个 Gruntfile,接下来将详细解释其中的每一部分。

现在可以指定grunt命令了:

grunt

你可以在当前目录内发现生成的action.min.js文件。它是action.js的混淆版本。你可以试试:

node action.min.js

和: node action.js

你会发现它们的执行效果是一样的。

包装函数

你所书写的作为配置的代码,都必须放在此函数内:

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

###项目和任务配置

如果任务需要引用package.json的话,可以使用:

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

将存储在package.json文件中配置引入进来。然后就可以通过形如<% %>的模板字符串来引用配置属性:

banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'

与大多数task一样,grunt-contrib-uglify-es 插件中的uglify 任务要求它的配置被指定在一个同名属性中。也就是uglify

    build: {
            src: 'src/<%= pkg.name %>.js',
            dest: 'build/<%= pkg.name %>.min.js'
        }
    }

build内的src指定了uglify任务的源文件,dest指定uglify的目的文件。

加载 Grunt 插件和任务

只要在 package.json 文件中被列为依赖包,并通过npm install安装之后,都可以在Gruntfile中以简单命令的形式使用:

// 加载能够提供"uglify"任务的插件。
grunt.loadNpmTasks('grunt-contrib-uglify-es');

自定义任务

通过定义 default 任务,可以让Grunt默认执行一个或多个任务:

// Default task(s).
grunt.registerTask('default', ['uglify']);

更多插件

类似grunt-contrib-uglify这些常用的任务,都已经以grunt插件的形式被开发出来了:

concatenation 文件连接工具
minification  文件压缩工具
linting       代码规范工具

用法都是类似的。