usemin加速了文件名和requirejs依赖项

man*_*l-v 6 dependencies assets module requirejs gruntjs

我遇到了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>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,require.js被转换后的文件1cdhj2.require.js取代.大!

但是所需的模块"common"和"app"不再有效,因为常见的是4jsh3b.common.js,app变为23jda3.app.js!

我该怎么办?谢谢你的帮助!(也使用Yeoman,顺便说一句)

小智 4

这是一个棘手的问题,我确信其他人以更优雅的方式解决了这个问题,但以下内容对我有用。

一旦它变得更加强大,我可能会将其发布为 grunt 插件。

摘自我的 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");
}),
Run Code Online (Sandbox Code Playgroud)