6

requirejsとuseminで次の問題が発生しています。

マルチページアプリケーションをセットアップしたいのですが、ページ固有の機能のみを含むモジュールを動的にロードします(たとえば、about-> about.js、home-> home.js)。先に進んですべてを1つのファイルにパックすることもできますが、それではファイルサイズが大きくなり、各サイトで必要のない機能のオーバーヘッドが発生します。(たとえば、カルーセルがないページにカルーセルプラグインをロードする必要があるのはなぜですか?)

例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が4jsh3b.common.jsになり、appが23jda3.app.jsになったため、必要なモジュール「common」と「app」は機能しなくなりました。

これについて私は何ができますか?ご協力いただきありがとうございます!(ヨーマンも使用しています、ところで)

4

2 に答える 2

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");
}),
于 2013-07-14T20:43:14.447 に答える