requireJS - 几个问题

时间:2012-04-17 16:08:25

标签: javascript module requirejs

抱歉有点懒,而不是自己尝试,但我认为Stackoverflow上的一个很好的答案可能也会帮助其他人。我在考虑是否使用requireJS来加载我的模块。目前我正在自己这样做,所以我对requireJS有一些疑问。

  • requireJS如何处理多个引用(它是否缓存文件/模块)?

更确切地说,如果您有require(["some/module", "a.js", "b.js"], function...});之类的电话,并且您在之后的a.jsb.js来电中再次引用.require.define如何需要JS处理那些?我的猜测是,它会完全忽略那些额外的引用,这是正确的吗?如果是这样,是否可以强制requireJS 重新加载脚本?

  • requireJS是否始终通过网络传输文件,或者您可以静态加载模块?

我通常做的是连接所有js文件(包括模块),除了需要根据运行时条件加载的文件。就我阅读requireJS doc而言,您可以为模块定义自己的名称。所以我的问题是,你可以加载一个已经存在于脚本中的模块,而不通过网络传输吗? 据我了解的文档,名称是根据模块的路径位置和文件名自动创建的,所以这对我的要求没有任何意义。

2 个答案:

答案 0 :(得分:5)

requirejs.undef()应该做的伎俩

答案 1 :(得分:3)

通常情况下,一个模块只会被require.js加载一次。 require.js将始终解析依赖项并以正确的顺序加载模块,这样您就不必关心它了。对同一模块的require的后续调用将立即生成它。

重新加载模块。如果您真的需要多次加载同一个模块(不幸的是表明模块的设计有问题),您可以查看Multiversion support.

我不确定我理解“静态加载模块”的含义。但是,如果我猜对了,你想要将几个模块加载为一个并单独使用它们。这个有可能: 通常在您的模块中,您将执行以下操作:

define(['moduleA', 'moduleB', 'moduleC'], function (a, b, c) {
    ...
    return exports;
});

其中exports可以是或多或少的任何东西,一个函数,一个对象,等等。所以你也可以这样做:

define(['moduleA', 'moduleB', 'moduleC'], function (a, b, c) {
    ...
    return {moduleA: a, moduleB: b, moduleC: c};
});

将它们全部导出。

但请注意,您应该真正查看optimization tool。它可以将相关模块组合在一起。

最后,自动命名是一种误解,您可以明确模块的名称。