我遇到了requirejs和usemin:
的以下问题我想设置一个多页面应用程序,我在其中动态加载仅包含页面特定功能的模块(例如,关于 - > about.js,home - > home.js)。我可以继续将所有内容打包在一个文件中,但这只会导致更大的文件大小和功能开销,而这在每个站点上都是不必要的! (例如,为什么我需要在没有轮播的页面上加载轮播插件!)
我查看了示例https://github.com/requirejs/example-multipage-shim
这实际上是处理它的好方法,直到我把usemin带入游戏。在加速文件名后,每个脚本标记的src路径都会更新,但依赖项呢?
<script src="scripts/vendor/1cdhj2.require.js"></script>
<script type="text/javascript">
require(['scripts/common'], function (common) {
require(['app'], function(App) {
App.initialize();
});
});
</script>
在这种情况下,require.js被转换后的文件1cdhj2.require.js取代。太好了!
但是所需的模块“common”和“app”不再有效,因为常见的是4jsh3b.common.js,app变为23jda3.app.js!
我该怎么办?谢谢你的帮助! (也使用Yeoman,顺便说一句)
答案 0 :(得分:4)
这是一个棘手的问题,我确信其他人会以更优雅的方式修复,但以下内容适用于我。
一旦它更健壮,我可能会将它发布为一个咕噜的插件。
取自我的Gruntfile:
"regex-replace": {
rjsmodules: { // we'll build on this configuration later, inside the 'userevd-rjsmodules' task
src: ['build/**/*.js'],
actions: []
}
},
grunt.registerTask('userevd-rjsmodules', 'Make sure RequireJS modules are loaded by their revved module name', function() {
// scheduled search n replace actions
var actions = grunt.config("regex-replace").rjsmodules.actions;
// action object
var o = {
search: '',
replace: '', //<%= grunt.filerev.summary["build/js/app/detailsController.js"] %>
flags: 'g'
};
// read the requirejs config and look for optimized modules
var modules = grunt.config("requirejs.compile.options.modules");
var baseDir = grunt.config("requirejs.compile.options.dir");
var i, mod;
for (i in modules) {
mod = modules[i].name;
revvedMod = grunt.filerev.summary[baseDir + "/" + mod + ".js"];
revvedMod = revvedMod.replace('.js', '').replace(baseDir+'/','');
o.name = mod;
o.search = "'"+mod+"'";
// use the moduleid, and the grunt.filerev.summary object to find the revved file on disk
o.replace = "'"+revvedMod+"'";
// update the require(["xxx/yyy"]) declarations by scheduling a search/replace action
actions.push(o);
}
grunt.config.set('regex-replace.rjsmodules.actions', actions);
grunt.log.writeln('%j', grunt.config("regex-replace.rjsmodules"));
grunt.task.run("regex-replace:rjsmodules");
}),
答案 1 :(得分:1)
您还可以使用requirejs的map config指定原始模块与您的原始模块之间的映射。 Filerev输出一个摘要对象,其中包含所有已版本化的模块及其原始名称的映射。使用grunt文件写入功能以AMD方式编写文件,内容为摘要对象:
// Default task(s).
grunt.registerTask('default', ['uglify', 'filerev', 'writeSummary']);
grunt.registerTask('writeSummary', 'Writes the summary output of filerev task to a file', function() {
grunt.file.write('filerevSummary.js', 'define([], function(){ return ' + JSON.stringify(grunt.filerev.summary) + '; })');
})
并在您的require配置中使用此文件,以便使用新的revved模块而不是旧的模块:
require(['../filerevSummary'], function(fileRev) {
var filerevMap = {};
for (var key in fileRev) {
var moduleID = key.split('/').pop().replace('.js', '');
var revvedModule = '../' + fileRev[key].replace('.js', '');
filerevMap[moduleID] = revvedModule;
}
require.config({
map: {
'*': filerevMap
}
});
我在上面创建的filerevMap对象特定于我的文件夹结构。您可以按照自己的方式进行调整。它只是循环遍历filerev摘要,并确保根据您的模块名称和值根据您的文件夹结构修改密钥。