《JavaScript开发框架权威指南》——2.3 将Grunt添加到项目中

简介: loadTask()方法一被调用,Grunt就会加载并执行在该文件夹下发现的所有Node模块,并且每次都将Grunt对象的引用作为参数传进去。这样的行为使我们可以将项目的Grunt配置划分为一系列相互独立的模块,每个模块负责一个单独的任务或插件的加载及配置工作。

本节书摘来自异步社区《JavaScript开发框架权威指南》一书中的第2章,第2.3节,作者:【美】Tim Ambler , Nicholas Cloud著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.3 将Grunt添加到项目中

在本章前面,为了添加Grunt命令行工具,我们将npm包grunt-cli作为全局模块进行了安装。现在我们应该已经可以在命令行中使用Grunt命令,但是对于每个要使用Grunt的工程,仍然需要为其配置Grunt本地依赖。为此,只需在工程根目录下运行以下命令即可。本例假设npm已经针对示例所用项目进行了初始化,package.json文件也已经存在。

$ npm install grunt --save-dev
现在,我们项目的package.json文件应该已经包含与清单中的示例代码相仿的Grunt条目。

清单2-5 更新后的package.json文件

// example-tasks/package.json

{
    "name": "example-tasks",
    "version": "1.0.0",
    "devDependencies": {
        "grunt": "0.4.5"
    }
}

将Grunt与项目进行整合的最后一个步骤是创建Gruntfile(见清单),并保存在工程根目录下。我们的Gruntfile只调用了一个函数loadTasks(),其作用将在接下来的小节进行讨论。

清单2-6 我们的Gruntfile

// example-tasks/Gruntfile.js

module.exports = function(grunt) {
    grunt.loadTasks('tasks');
};

保持合理的Grunt模式
我们希望你在读完本章之后发现,Grunt的确是一件处理日常工作流程中遇到的乏味的重复性工作的利器。但是即便如此,还是不得不承认我们对Grunt的第一反应绝对算不上积极。事实上,刚开始我们对它兴趣不大。为了了解其中的原因,我们看一下放在Grunt官方文档显著位置的Gruntfile示例(见清单)。

清单2-7 Grunt官方文档提供的Gruntfile示例

module.exports = function(grunt) {

    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        concat: {
            options: {
                separator: ';'
            },
            dist: {
                src: ['src/**/*.js'],
                dest: 'dist/<%= pkg.name %>.js'
            }
        },
        uglify: {
            options: {
                banner: '/*! <%= grunt.template.today("dd-mm-yyyy") %> */\n'
            },
            dist: {
                files: {
                    'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
                }
            }
        },
        qunit: {
            files: ['test/**/*.html']
        },
        jshint: {
            files: ['Gruntfile.js', 'src/* */*.js', 'test/**/*.js'],
            options: {
                // options here to override JSHint defaults
                globals: {
                    jQuery: true,
                    console: true,
                    module: true,
                    document: true
                }
            }
        },
        watch: {
            files: ['<%= jshint.files %>'],
            tasks: ['jshint', 'qunit']
        }
    });
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-jshint');
    grunt.loadNpmTasks('grunt-contrib-qunit');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-contrib-concat');

    grunt.registerTask('test', ['jshint', 'qunit']);

    grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);

};

清单中略显臃肿的Gruntfile还是为相对简单的项目准备的。对于规模更大的项目,Gruntfile会像吹气球一样膨胀好几倍,最终结果就是一大堆根本无法阅读又难以维护的东西。有经验的开发者绝不会在写代码的时候,将不相关的功能模块揉在一起。否则,我们为什么还要在任务运行器上搞点儿花样出来呢?

正如清单中的代码所示,使Grunt模式保持合理的秘密就藏在Grunt的loadTasks()方法上。该例中task参数指向task文件夹,其路径以工程的Gruntfile为参考位置。loadTask()方法一被调用,Grunt就会加载并执行在该文件夹下发现的所有Node模块,并且每次都将Grunt对象的引用作为参数传进去。这样的行为使我们可以将项目的Grunt配置划分为一系列相互独立的模块,每个模块负责一个单独的任务或插件的加载及配置工作。清单展示了其中一个小型模块,模块中定义的任务可以通过在命令行中执行grunt uglify来运行。

清单2-8 task文件夹中的示例模块(uglify.js)

// example-tasks/tasks/uglify.js

module.exports = function(grunt) {

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

    grunt.config('uglify', {
        'options': {
            'banner': '/*! <%= grunt.template.today("dd-mm-yyyy") %> */\n'
        },
        'dist': {
            'files': {
                'dist/app.min.js': ['src/index.js']
            }
        }
    });

};
相关文章
|
3月前
|
数据采集 资源调度 JavaScript
Node.js 适合做什么项目?
【8月更文挑战第4天】Node.js 适合做什么项目?
198 5
|
17天前
|
JavaScript 测试技术 API
跟随通义灵码一步步升级vue2(js)项目到vue3版本
Vue 3 相较于 Vue 2 在性能、特性和开发体验上都有显著提升。本文介绍了如何利用通义灵码逐步将 Vue 2 项目升级到 Vue 3,包括备份项目、了解新特性、选择升级方式、升级依赖、迁移组件和全局 API、调整测试代码等步骤,并提供了注意事项和常见问题的解决方案。
|
2月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
21天前
|
JavaScript 前端开发 测试技术
JavaScript与TypeScript:为何TypeScript成为大型项目的首选
JavaScript与TypeScript:为何TypeScript成为大型项目的首选
25 1
|
21天前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
|
2月前
vite.config.js中vite.defineConfig is not defined以及创建最新版本的vite项目
本文讨论了在配置Vite项目时遇到的`vite.defineConfig is not defined`错误,这通常是由于缺少必要的导入语句导致的。文章还涉及了如何创建最新版本的Vite项目以及如何处理`configEnv is not defined`的问题。
89 3
vite.config.js中vite.defineConfig is not defined以及创建最新版本的vite项目
|
23天前
|
存储 JavaScript 前端开发
Vue.js项目中全面解析定义全局变量的常用方法与技巧
Vue.js项目中全面解析定义全局变量的常用方法与技巧
32 0
|
3月前
|
JSON 前端开发 JavaScript
|
2月前
|
JavaScript 前端开发 UED
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
让 HTML 向 Vue.js 华丽转身:如何把 `wangEditor` 仿腾讯文档项目整合进 Vue.js
|
3月前
|
JavaScript
Vue项目打包后都产生了哪些JS请求?
【8月更文挑战第19天】Vue项目打包后都产生了哪些JS请求?
112 0
Vue项目打包后都产生了哪些JS请求?
下一篇
无影云桌面