为什么requirejs尊重某些模块的数据主要入口点,而不是其他模块?

时间:2014-04-23 18:48:35

标签: javascript requirejs assetic

我的程序通过树枝模板中的此入口点开始:

<script data-main="{{ asset('bundles/wwwcms/js/app') }}" src="{{ asset('bundles/wwwcms/js/require.js') }}"></script>

输出:

<script data-main="static.correct_require_url.net/js/app" src="static.correct_require_url/require.js"></script>

一切正常,所以要求执行我的app.js(config):

requirejs.config({
  'baseUrl': 'js/lib',
  'paths': {
    'app': '../app',
    'jquery': '//code.jquery.com/jquery-1.10.2.min',
    'bootstrap': '//netdna.bootstrapcdn.com/bootstrap/3.0.2/js/bootstrap.min'
  },

  'shim': {
    'bootstrap': {
      deps: ['jquery']
    }
  }
});

// always require jquery and bootstrap onload
requirejs(['bootstrap']);

哪个也有效。

目录结构如下:
app.js
require.js
/ lib目录
  - test.js
/应用
  - dirty.js
  - import.js

好的,这就是错误发生的地方

对于页面,让我们说我想加载dirty.js和import.js。 dirty.js依赖于jquery,而import.js依赖于&#34; test.js&#34; (我刚刚为演示目的而制作的东西)。

所以我以这种方式在页面上加载依赖项:

<script type="text/javascript">
  require(['app/dirty', 'app/import']);
</script>

当页面加载时,dirty.js和import.js从相对于&#34; app&#34;的正确URL加载得很好。但是,import.js(test.js)的依赖项无法正确加载。

这是import.js的开始方式:

require(['jquery', 'test'], function($, test) {
...
});

如您所见,它要求lib / test.js。它从CDN中提取jQuery,以便进行处理。但是对于test.js,它使用了错误的路径。

使用正确的静态url路径引入

import.js(以及首先加载的所有其他模块),但使用错误的路径加载模块的依赖项 - 使用该页面的url加载它们!

因此,当我查看调试器控制台中的网络选项卡时,import.js来自: static.blahblah.com/js/app/import.js。

但test.js来自: blahblah.com/route/to/current/page/js/app/test.js

(每次显然是404s)

出现这种情况的可能原因是什么?难道我做错了什么?任何帮助将不胜感激。

这是在需要运行之前脚本标记的外观:

<script data-main="//static.bananajams.cloud.net/bundles/wwwcms/js/app" src="//static.bananajams.cloud.net/bundles/wwwcms/js/require.js"></script>

<script type="text/javascript">
  require(['app/dirty', 'app/preview', 'app/import']);
</script>

1 个答案:

答案 0 :(得分:0)

如果数据主要是代码的单一入口点,那么数据主要是一个好主意。它是异步加载的,因此无法保证它在应用程序中的其他代码之前运行。见

RequireJS does not run data-main script before loading required modules

了解更多信息。