封装需要JS及其模块

Encapsulating requireJS and its modules

本文关键字:模块 JS 封装      更新时间:2023-09-26

我想使用类似requireJS的东西来模块化我的javascript应用程序,但是,我想满足一个我还没有弄清楚的特殊要求:

我很高兴在全球空间中拥有requiredefine,但是,我不希望我导入的模块require可以全局访问(即它们应该可供我的应用程序访问,但不能在同一页面上运行的其他应用程序)。

在我看来,如果我调用define('moduleA', function() { ... });,我就可以通过require函数全局访问该模块。它可能没有占用全局空间本身的变量,或者附加到window,但仍然感觉很糟糕,因为其他应用程序真的不应该看到我的内部模块(更不用说潜在的命名冲突等,我可以使用contexts来规避这一点吗?

这似乎比仅仅命名我的模块并在构建时将它们全部包含在一个大型私有化函数中退后一步。

我可以有自己的私人版本require但我的模块(在不同的文件中)无法访问define

我错过了什么还是我只需要忍受这个?(或者,运行优化器将所有内容烘焙到一个文件中 - 感觉我可以命名空间我的模块,如果我这样做,根本不会打扰requireJS)。

在你的 r.js 构建配置中添加wrap: true,你将不再用requiredefine函数污染光板范围。

编辑

还可以使用 r.js 生成配置中的namespace设置为requiredefine指定命名空间。您可以在 RequireJS 的常见问题解答中阅读有关命名空间的更多信息。从 example.build 中.js注释:

// Allows namespacing requirejs, require and define calls to a new name.
// This allows stronger assurances of getting a module space that will
// not interfere with others using a define/require AMD-based module
// system. The example below will rename define() calls to foo.define().
// See http://requirejs.org/docs/faq-advanced.html#rename for a more
// complete example.
namespace: 'foo',