我不喜欢这里的解决方案(包括我之前给出的解决方案),原因如下:
- 这个问题的投票最高的答案是,你必须手动同步脚本标签的列表,当你添加/重命名/删除JS文件。
- 这个问题接受的答案是,你的JS文件列表不能有模式匹配。这意味着您必须在 Gruntfile 中手动更新它。
我已经想出了如何解决这两个问题。我已经设置了我的 grunt 任务,以便每次添加或删除文件时,都会自动生成脚本标签以反映这一点。这样,当您添加/删除/重命名 JS 文件时,您无需修改 html 文件或 grunt文件。
为了总结它的工作原理,我有一个带有脚本标签变量的 html 模板。我使用https://github.com/alanshaw/grunt-include-replace来填充该变量。在开发模式下,该变量来自我所有 JS 文件的通配模式。当添加或删除 JS 文件时,watch 任务会重新计算此值。
现在,要在 dev 或 prod 模式下获得不同的结果,您只需使用不同的值填充该变量。这是一些代码:
var jsSrcFileArray = [
'src/main/scripts/app/js/Constants.js',
'src/main/scripts/app/js/Random.js',
'src/main/scripts/app/js/Vector.js',
'src/main/scripts/app/js/scripts.js',
'src/main/scripts/app/js/StatsData.js',
'src/main/scripts/app/js/Dialog.js',
'src/main/scripts/app/**/*.js',
'!src/main/scripts/app/js/AuditingReport.js'
];
var jsScriptTags = function (srcPattern, destPath) {
if (srcPattern === undefined) {
throw new Error("srcPattern undefined");
}
if (destPath === undefined) {
throw new Error("destPath undefined");
}
return grunt.util._.reduce(
grunt.file.expandMapping(srcPattern, destPath, {
filter: 'isFile',
flatten: true,
expand: true,
cwd: '.'
}),
function (sum, file) {
return sum + '\n<script src="' + file.dest + '" type="text/javascript"></script>';
},
''
);
};
...
grunt.initConfig({
includereplace: {
dev: {
options: {
globals: {
scriptsTags: '<%= jsScriptTags(jsSrcFileArray, "../../main/scripts/app/js")%>'
}
},
src: [
'src/**/html-template.html'
],
dest: 'src/main/generated/',
flatten: true,
cwd: '.',
expand: true
},
prod: {
options: {
globals: {
scriptsTags: '<script src="app.min.js" type="text/javascript"></script>'
}
},
src: [
'src/**/html-template.html'
],
dest: 'src/main/generatedprod/',
flatten: true,
cwd: '.',
expand: true
}
...
jsScriptTags: jsScriptTags
jsSrcFileArray
是典型的 grunt 文件通配模式。 jsScriptTags
获取jsSrcFileArray
并将它们与script
两侧的标签连接在一起。 destPath
是我想要的每个文件的前缀。
这是 HTML 的样子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Example</title>
</head>
<body>
@@scriptsTags
</body>
</html>
现在,正如您在配置中看到的那样,script
当它在prod
模式下运行时,我将该变量的值生成为硬编码标记。在开发模式下,此变量将扩展为如下值:
<script src="../../main/scripts/app/js/Constants.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/Random.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/Vector.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/StatsData.js" type="text/javascript"></script>
<script src="../../main/scripts/app/js/Dialog.js" type="text/javascript"></script>
如果您有任何问题,请告诉我。
PS:对于我想在每个客户端 JS 应用程序中做的事情,这是大量的代码。我希望有人可以把它变成一个可重用的插件。也许有一天我会。