Thoughts
我只是以完全错误的方式思考这个问题吗?
不,我不认为你以错误的方式思考这个问题。质疑总是一件好事why/how对于任何发展[时期]。从长远来看,这使我们成为更好的开发人员。
无论您选择在构建过程中使用哪种解决方案/工具,无论是专用的任务运行程序,例如grunt or gulp,或者更高级别的解决方案,例如nodejs也许结合npm 脚本,你仍然需要编写一些代码。当然,提到的所有这些方法之间的共同点是您必须使用以下代码进行编码JavaScript.
grunt 的全部意义在于避免在 node.js 中编写类似的代码(所以我这样做就违背了目的?
我不应该说哪种解决方案/工具比另一种更好(这样就太固执己见了)就我个人而言,我有使用上述所有工具开发构建流程的经验。通常,尽管我经常发现使用专用任务运行程序时处理构建的开发时间会减少(grunt or gulp)比使用更自定义的方法(例如npm-scripts
结合nodejs
.
通常,我也会找到一个非常棒的插件grunt(例如grunt-contrib-uglify
)然后经过一番修补后发现它满足了我 90% 的要求,但对于剩下的 10% 却惨遭失败。然而,在利用/集成任何开源包/模块时通常会出现这种情况……可以说,您仍然必须填补空白!
咕噜声鲜为人知的宝石
迫降前gruntjs
并进入nodejs
目前还只有开发模式,(再次重申我对任何方法都没有偏见),我建议您查看一些 grunts 功能,例如:
- 自定义任务
- grunt.file.expand
- grunt.config
- grunt.task.run
使用时可能出现过这样的情况grunt我发现利用上面列出的功能可以帮助我解决我之前提到的剩余 10% 的要求。多次证明,自定义任务功能非常有用。
Solution
值得注意的是grunt-contrib-uglify is a 多任务插入。 IE。它允许您配置多个Targets正如你在你的uglify
你问题中的配置。您已包含三个名为dir1
, dir2
, and dirN
.
事实是grunt-contrib-uglify
is 多任务并记住我之前列出的重要功能...满足您的要求的一种方法是使用grunt is to:
- 使用自定义任务动态配置和运行 uglify 任务。
- Utilize
grunt.file.expand
获取每个 .js 文件的父文件夹的路径。
-
filterpaths 仅包含唯一目录路径的数组。
- 动态创建
files
每个目标的配置uglify
task.
- 配置
uglify
使用多个目标的任务grunt.config
然后使用运行任务grunt-task.run
.
Grunfile.js
module.exports = function (grunt) {
'use strict';
grunt.initConfig({
uglify: {
// <-- Intentionally blank, will be dynamically generated.
}
});
/**
* 1. Helper custom Task to dynamically configure and run the uglify task.
*/
grunt.registerTask('myUglify', 'Configures uglify task', function () {
var srcDirGlob = 'src/js/**/*.js';
var destDir = 'dist/js/';
var config = {};
// 2. Get the paths to the parent diretory of each .js file.
var paths = grunt.file.expand({ filter: 'isFile' }, srcDirGlob)
.map(function (_path) {
return _path.substring(0, _path.lastIndexOf("/"));
});
// 3. Filter paths Array to only unique directory paths.
paths.filter(function(_path, pos){
return paths.indexOf(_path) === pos;
})
// 4. Dynamically create the `files` configuration for each Target.
.forEach(function(_path, index) {
var dirName = _path.substring(_path.lastIndexOf('/') + 1);
var destPath = destDir + dirName + '.min.js';
var srcGlob = _path + '/*.js';
config[index] = {
files: {}
}
config[index].files[destPath] = srcGlob;
});
// NOTE: The dynamically created `config` object is now something like this:
//
// config: {
// 0: {
// files: {
// 'dist/js/dir1.min.js': 'src/js/dir1/**.js'
// }
// },
// 1: {
// files: {
// 'dist/js/dir2.min.js': 'src/js/dir2/**.js'
// }
// },
// ...
// }
// 5. Configure the uglify task with multiple Targets
// (i.e. the `config` object) and then run the Task.
grunt.config('uglify', config);
grunt.task.run(['uglify']);
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.registerTask('default', ["myUglify"]);
};
Results
Running $ grunt
通过 CLI 使用Gruntfile.js
上面有一个src
目录如下:
.
└── src
└── js
├── dir1
│ ├── fileA.js
│ └── fileB.js
├── dir2
│ ├── fileG.js
│ └── fileN.js
└── dir3
├── fileQ.js
└── fileR.js`
..将连接和uglify
the .js
文件产生的目录结构如下:
.
└── dist
└── js
├── dir1.min.js
├── dir2.min.js
└── dir3.min.js`
注:源的父文件夹名称.js
文件用于连接/丑化结果的名称.js
file.
Summary
- 中使用的模式/方法
Gruntfile.js
(上文)可以根据需要对许多可用插件进行修改。
- 只要插件本身支持多任务然后考虑利用grunt 自定义任务填补空白。
我希望这可以帮助你。