Javascript RequireJS-嵌套require调用,如何清理?

Javascript RequireJS-嵌套require调用,如何清理?,javascript,django,requirejs,Javascript,Django,Requirejs,我的项目是使用Django设置的,我的任务是在整个项目中实现requireJS,以便开始模块化我们的JavaScript。 因为我们使用的是Django,这意味着我们也在使用嵌套模板,这是复杂性的开始 以下是我目前正在进行的基本设置: // template.html <script src="require.js"> <body> ... some html ... {% include "body.html" %} </body> <

我的项目是使用Django设置的,我的任务是在整个项目中实现requireJS,以便开始模块化我们的JavaScript。 因为我们使用的是Django,这意味着我们也在使用嵌套模板,这是复杂性的开始

以下是我目前正在进行的基本设置:

// template.html
<script src="require.js">
<body>
    ... some html ...
    {% include "body.html" %}
</body>
<script>
    requirejs(['static/require/main.js'], function() {
        requirejs(['static/app/template.js']);
    });
</script>

// body.html
<div>
    ... some html ...
</div>
<script>
    requirejs(['static/require/main.js'], function() {
        requirejs(['static/app/body.js']);
    });
</script>


// compiled HTML:
<script src="require.js">
<body>
    ... some html ...
    <div>
        ... some html ...
    </div>
    <script>
        requirejs(['static/require/main.js'], function() {
            requirejs(['static/app/body.js']);
        });
    </script>
</body>
<script>
    requirejs(['static/require/main.js'], function() {
        requirejs(['static/app/template.js']);
    });
</script>


// main.js
requirejs.config({
    paths: {
        'jquery': '...'
    }
);

// body.js
define('app/bodyjs', ['jquery'], function() {
    ... some js ...
});


// template.js
define('app/template.js', ['jquery'], function() {
    ... some js ...
});
但最终会在/jquery.js中查找jquery,这是不正确的,正确的路径是/static/lib/jquery.js

关于如何清理此问题的想法?

(继续之前的注意事项:我在所有模块名称中都看到了
.js
扩展。除非您有理由强制添加
.js
,否则您永远不应该在模块名称中添加
.js

我认为
/static/require/main
(无扩展名)包含您的RequireJS配置。您遇到的问题是,RequireJS异步加载所有模块,但您需要在加载任何其他模块之前加载配置。一种解决方案是像您一样嵌套
require
调用

另一种解决方案是同步加载配置:

<script type="text/javascript" src="lib/requirejs/require.js"></script>
<script type="text/javascript" src="requirejs-config.js"></script>

第一行加载RequireJS,第二行加载包含对
require.config
的调用的脚本。它保证在RequireJS加载任何其他内容之前加载。如果执行此操作,则不能使用
data main
,因为
data main
命名的模块将在加载配置之前加载


我在代码中注意到的另一件事是,使用模块名(第一个参数)调用
define
。在优化代码时,应该去掉模块名称,让
r.js
添加它们。这里的原则与扩展相同,仅当您可以引用重要的原因时,才添加模块名称。否则,不要这样做。

谢谢!那很好。不得不做一些重新工作,但一个下午后一切都很好。是的,不需要放.js,我只是为了清楚起见:)很高兴能帮上忙!添加
.js
的问题在于它改变了RequireJS解析路径的规则。根据您的配置实际包含的内容,它可能不会更改任何内容,但如果您更改配置,那么它可能会成为一个问题。安全的做法是不要放置扩展。
<script type="text/javascript" src="lib/requirejs/require.js"></script>
<script type="text/javascript" src="requirejs-config.js"></script>