如何将requireJS函数保留在全局命名空间之外?

时间:2011-12-22 07:48:50

标签: javascript requirejs

我正在使用requireJS编写第三方JS应用程序,并且我希望保持全局命名空间除了将由我的应用程序创建的单个全局接口对象之外的所有内容。除了requireJS之外,我还没有遇到任何问题。

作为优化器的一个选项,require.js可以滚动到构建中,命名空间可以定义为优化器范围所有引用需要函数到该命名空间。

例如。 require(...)成为my_scope.require(...)

问题是这个全局命名空间对象在应用程序中创建之前不会存在。优化器确保requireJS加载&在它加载的任何代码之前执行,因此当需要执行require函数时(如require或define),抛出异常(命名空间对象未定义)。

有没有人成功实现这一目标,而无需手动更改构建的脚本或在构建的脚本之前和之前运行另一个脚本?换句话说,有没有一种正确的方法来实现这个目标?

2 个答案:

答案 0 :(得分:5)

对于那些一直在寻找这个问题的答案的人来说,就是在一堆用过的肘部油脂中找到的。

在构建配置选项中,忘记使用namespace。有一个属性“wrap”,允许您将整个构建脚本包装在您选择的代码中。

只需将其定义为以下内容即可围绕所有内容创建本地范围(包括requireJS函数):

require.config({
    wrap: {
        start: "(function() {",
        end: "}());"
    }
})

答案 1 :(得分:0)

我的看法是,requirejs和模块加载器通常采用不同的方法来减少全局混乱而不是命名空间。使用require,您不需要将事物附加到全局命名空间,只需在闭包内使用require方法调用来获取本地范围的引用。

因此,您需要权衡一点点全局混乱(即window.require)以获取您需要附加的所有其他内容。

在命名空间实现中,您将使用类似

的内容
var foo = window.my_scope.foo.bar

使用模块加载器,您可以使用要求的调用。对于CommonJS模块加载器,您可以执行类似这样的操作

var foo = require("my_scope/foo/bar")

RequireJs为此增加了一点复杂性,因为它是一个AMD模块加载器,但这是另一个完整的对话!