【发布时间】:2018-04-29 15:16:17
【问题描述】:
我有一个项目,其 javascript 文件的结构如下:
我的目标:我想在构建输出中缩小/丑化这些 javascript 文件,例如每个目录有 1 个缩小文件。因此,例如,如果我将 js 存储在 bld/js 中的构建输出中,那么在 bld/js 中,我最终会得到文件:dir1.min.js(连接和缩小 fileA.js、fileB.js 的结果)。 js,以及 /src/js/dir1/ 中的所有其他 js 文件)、dir2.min.js(连接和缩小 fileG.js 和 fileN.js 以及 /src/dir2/ 中的所有其他 js 文件的结果) ,等等。
现在 - 我正在使用 grunt 框架来生成构建,并且必须在 grunt 文件中执行此操作。我是 grunt、node.js 和 javascript 的新手。 我想解释一下我解决这个问题的思考过程,并且想知道是否有更熟悉这些框架的人可以告诉我我的方法/想法是否有问题。
据我所知,在 grunt 中做事的主要方式是使用插件。所以我的第一个想法是使用插件来完成这项任务。有一个名为“npm-contrib-uglify”的插件,专门用于缩小。 https://github.com/gruntjs/grunt-contrib-uglify 问题是 - 我的理解是,为了做我希望在这里做的事情(每个目录 1 min.js 文件),我需要为每个目录创建特定的任务。所以init看起来像这样:
grunt.initConfig({
uglify: {
dir1: {
files: {
'dest/js/dir1.min.js': ['src/js/dir1/**.js']
}
},
dir2: {
files: {
'dest/js/dir2.min.js': ['src/js/dir2/**.js']
}
},
...
dirN: {
files: {
'dest/js/dirN.min.js': ['src/js/dirN/**.js']
}
},
}
});
如果我只有一两个目录,并且项目格式保持相对相同 - 我想我可以接受这个。但是这个项目有很多dirs,更重要的是项目结构会发生变化;我希望能够将目录添加到我的项目中,而不必每次都通过添加新目标来更新 grunt 文件。我希望有一种方法来参数化任务 - 意思是,有一个通用目标,上面写着“对于某个目录,将该目录中的所有 .js 文件缩小为某个 .min.js 文件”,然后我可以以编程方式调用目标每个目录 - 但这似乎不可能。
所以我决定避免使用插件,而只依赖 node.js。有一个名为“npm-uglify”的 npm 模块。 https://www.npmjs.com/package/uglify-js 。我想我可以制作自己的自定义 grunt 任务,它循环遍历源目录,并在每个嵌套目录上调用 uglify-js。这是一个例子(注意我在几个地方使用伪代码,特别是为了获取目录列表,因为我没有访问机器的权限,也没有将语法提交给内存。但这应该给出的想法我的意思是:)
var fs = require('fs');
var uglifyJs = require('uglify-js');
...
grunt.registerTask('minifyMyJs', function(myJsSrcDir) { // myJsSrcDir is an abs. path to the src dir
for (dir in myJsSrcDir): // go through all the dirs.. realize I should use fs.readdir, but just use pseudocode here to give the idea
var minifiedOutputFileName = fs.basename(dir); // to get dir1 from /src/js/dir1
var minified = uglifyJs.Minify(["**.js"]);
fs.writeFile(minifiedOutputFileNam, result.code, function(err)) {
if(err) {
... error checking...
}
}
}
}
现在 - 我不是要你帮我解决这个问题,而且我知道上面的代码不会编译。相反,我的问题是——我只是在以完全错误的方式思考这个问题吗? grunt 的全部意义在于避免在 node.js 中编写这样的代码(所以我这样做是为了达到目的吗?) 你真的可以参数化 grunt 插件的目标吗?比如 grunt-contrib-uglify?我在使用许多插件时遇到了同样的问题,我有一些任务需要在许多不同的目录/文件中一遍又一遍地重复,但方式完全相同,所以我希望能够配置一个通用的目标我可以以编程方式调用不同的值(而不是对可能经常更改的特定目录或文件名的大量目标进行硬编码)。但这似乎不可能,所以我继续在 node.js 中实现。 我接近咕噜声的方式是否存在根本缺陷?如果是这样 - 你能提供一些替代的观点吗?
【问题讨论】:
标签: javascript node.js gruntjs minify