I'm trying out Grunt and need a simple way to concatenate my modules
这是我第一次使用Grunt,我想让它结合我所有的js模块,每个js模块都package在一个立即执行的函数中,包含一个" use strict"声明,并将它们放入一个文件中,package
只能在一个立即执行的函数中进行,只有一个'use strict'声明。
通常如何进行?
我认为这将是一个常见的用例?也许我正在以错误的方式处理事情?我是否应该使用一种模块加载格式(即commonjs,amd)始终将所有这些文件一起加载到浏览器中,所以如果人们通常这样做,我实际上不介意删除所有立即执行的功能。重要的部分是最终结果以某种方式package,通过了lint和单元测试,并包含" use strict"声明。
(我应该澄清一下,我确实可以正常工作,整理,进行单元测试,连接和缩小,当我在最终的串联文件中看到一堆不必要的立即执行功能时,感觉就像我做错了。)
从拉取请求10开始,grunt-contrib-concat现在具有
Gruntfile.js
1 2 3 4 5 6 7 8 9 10 11 | concat: { dist: { src: ['src/my-lib.js'], dest: 'dist/<%= pkg.name %>.js', options: { banner:";(function( window, undefined ){ \ 'use strict';", footer:"}( window ));" } } } |
我认为,这更易于维护,并允许使用Gruntfile中定义的其他属性进行模板化。
我通常像jQuery团队那样做。您创建一个
intro.js
1 2 | ;(function( window, undefined ){ 'use strict'; |
outro.js
1 | }( window )); |
grunt.js:
1 2 3 4 5 6 7 8 9 10 | concat: { dist: { src: [ 'js/src/intro.js', ... 'js/src/outro.js' ], dest: 'js/out/app.js' } } |
只需添加到@elclanrs回答中,如果您希望能够将模块保存在单独的文件中,以便在开发过程中更轻松地进行调试,则显然也必须将它们package为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | concat: { events_debug: { // wrap the 'events' module in IIFE src: [ 'js/src/intro.js', 'js/src/events.js', 'js/src/outro.js' ], dest: 'js/out/events.js' }, callbacks_debug: { // wrap the 'callbacks' module in IIFE src: [ 'js/src/intro.js', 'js/src/callbacks.js', 'js/src/outro.js' ], dest: 'js/out/callbacks.js' } // zzZZZ... } |
这是非常乏味和自我重复的。也许您可能想为大量package的文件创建自定义任务,例如
1 2 3 4 5 6 7 8 | wrap: { html: { intro: 'partials/intro.js', outro: 'partials/outro.js', src: 'js/*.js', dest: 'out' // output directory } } |
最近对此有疑问,请参见以下主题:
使用grunt concat,我如何将同一文件的串联自动化为许多其他文件?
我建议您使用我的grunt插件grunt-concat-deps,因为它会自动解析与您的体系结构无关的模块。
PLUS:该插件不需要任何显式的模块配置,因为它依赖于YUIDoc样式的声明式和分散式模块定义。
有关更多信息,请参见此处:https://github.com/leoselig/grunt-concat-deps