JavaScript 项目构建工具 Grunt 实践:合并文件
Grunt 是一个基于任务的 JavaScript 项目命令行构建工具,运行于 Node.js 平台。Grunt 能够从模板快速创建项目,合并、压缩和校验 CSS & JS 文件,运行单元测试以及启动静态服务器。上一篇文章《Grunt:基于任务的 JavaScript 项目构建工具》介绍了 Grunt 安装和创建项目框架步骤,这篇文章介绍如何使用 Grunt 合并文件。
Grunt 内置 concat(文件合并)、lint(代码校验) 和 min(代码压缩) 任务,在 grunt.js 文件配置好任务后,运行 grunt 命令就可以自动完成一系列的项目构建操作了,如图示:
对应的 Grunt 配置文件代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | /*global module:false*/ module.exports = function (grunt) { // Project configuration. grunt.initConfig({ pkg: '<json:GruntDemo.jquery.json>' , meta: { banner: '/*! <%= pkg.title || pkg.name %> - v<%= pkg.version %> - ' + '<%= grunt.template.today("yyyy-mm-dd") %>\n' + '<%= pkg.homepage ? "* " + pkg.homepage + "\n" : "" %>' + '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' + ' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> */' }, concat: { dist: { src: [ '<banner:meta.banner>' , '<file_strip_banner:src/<%= pkg.name %>.js>' ], dest: 'dist/<%= pkg.name %>.js' } }, min: { dist: { src: [ '<banner:meta.banner>' , '<config:concat.dist.dest>' ], dest: 'dist/<%= pkg.name %>.min.js' } }, qunit: { files: [ 'test/**/*.html' ] }, lint: { files: [ 'grunt.js' , 'src/**/*.js' , 'test/**/*.js' ] }, watch: { files: '<config:lint.files>' , tasks: 'lint qunit' }, jshint: { options: { curly: true , eqeqeq: true , immed: true , latedef: true , newcap: true , noarg: true , sub: true , undef: true , boss: true , eqnull: true , browser: true }, globals: { jQuery: true } }, uglify: {} }); // Default task. grunt.registerTask( 'default' , 'lint qunit concat min' ); }; |
这篇文章先介绍 concat 任务,后面几个任务将会在随后的文章陆续介绍。
Grunt 合并文件
Grunt 内置的 concat 任务用于合并一个或者多个文件(或者指令,例如<banner>指令)到一个文件。concat 任务的项目配置框架:
1 2 3 4 5 6 7 | // 项目配置 grunt.initConfig({ // 项目元数据,用于 <banner> 指令 meta: {}, // 将要被合并的文件列表 concat: {} }); |
基本用法
把 src 目录下的 intro.js、projject.js、outro.js 三个文件合并到 built.js 文件并存放在 dist 目录,配置示例:
1 2 3 4 5 6 7 8 | grunt.initConfig({ concat: { dist: { src: [ 'src/intro.js' , 'src/project.js' , 'src/outro.js' ], dest: 'dist/built.js' } } }); |
添加注释
还可以通过 <banner> 指令在合并文件中添加注释,例如包名、版本、生成时间等,示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | grunt.initConfig({ pkg: '<json:package.json>' , meta: { banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + '<%= grunt.template.today("yyyy-mm-dd") %> */' }, concat: { dist: { src: [ '<banner>' , '<file_strip_banner:src/project.js>' ], dest: 'dist/built.js' } } }); |
多个构建目标
在实际项目中,往往需要根据模块生成多个目标文件,例如基础模块和插件模板分开打包,配置示例:
1 2 3 4 5 6 7 8 9 10 11 12 | grunt.initConfig({ concat: { basic: { src: [ 'src/main.js' ], dest: 'dist/basic.js' }, extras: { src: [ 'src/main.js' , 'src/extras.js' ], dest: 'dist/with_extras.js' } } }); |
动态文件名
Grunt 合并任务还可以生成动态的文件名,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | grunt.initConfig({ pkg: '<json:package.json>' , dirs: { src: 'src/files' , dest: 'dist/<%= pkg.name %>/<%= pkg.version %>' }, concat: { basic: { src: [ '<%= dirs.src %>/main.js' ], dest: '<%= dirs.dest %>/basic.js' }, extras: { src: [ '<%= dirs.src %>/main.js' , '<%= dirs.src %>/extras.js' ], dest: '<%= dirs.dest %>/with_extras.js' } } }); |
配置好以后,运行下面的命令就可以进行文件合并操作了:
1 | grunt concat |
合并后的代码示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /*! Gruntdemo - v0.1.0 - 2013-01-22 * https://github.com/dreamsky/grunt-demo * Copyright (c) 2013 Andy Li; Licensed MIT */ ( function ($) { // Collection method. $.fn.awesome = function () { return this .each( function () { $( this ).html( 'awesome' ); }); }; // Static method. $.awesome = function () { return 'awesome' ; }; // Custom selector. $.expr[ ':' ].awesome = function (elem) { return elem.textContent.indexOf( 'awesome' ) >= 0; }; }(jQuery)); |
您可能感兴趣的相关文章
作者:山边小溪
主站:yyyweb.com 记住啦:)
欢迎任何形式的转载,但请务必注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2012-01-31 8款非常棒的响应式 jQuery 幻灯片插件推荐
2012-01-31 40个非常聪明的户外广告设计案例(上篇)