使用多个文件时如何将函数保留在全局命名空间之外?
How do I keep functions out of the global namespace when using multiple files?
上次我使用 JS 构建大型应用程序时使用了 require.js - 这很好,但开销很大,特别是如果您不想异步加载文件,所以这次我不带它去。
这次我用纯 JS 编写,并使用 Grunt 连接和缩小所有内容(我是 Grunt n00b)。因为我将所有函数保存在单独的文件中,所以我无法像使用单个文件那样将所有函数都包装在一个闭包中。将所有函数保留在全局命名空间之外的最佳解决方案是什么?
我不确定我是否需要一个完整的依赖项管理解决方案,但如果它是轻量级和简单的,我会考虑一个。
有许多常见且易于使用的 JavaScript 工具可通过实现 CommonJS(require.js 使用的规范)或 ES2015 module specification, including (as Benjamin suggested) Webpack, Browserify, and Rollup 来管理应用程序范围的依赖关系.
如果你想在没有任何依赖管理工具的情况下做到这一点,你可以使用 Revealing Module Pattern 和命名空间,简化示例:
Top/Application 文件
window.SomeApplication = (function () {
// Add functions you want to expose to this
this.require= function (path) { // Creates namespace if not already existing, otherwise returns reference to lowest level object in path
var current = window,
i;
path = path.split('.');
for (i = 0; i < path.length; ++i) {
if (!current[path[i]]) {
current[path[i]] = {};
}
current = current[path[i]];
}
return current;
};
return this;
})();
一些其他文件
SomeApplication.require('SomeApplication.SomeSubNamespace').SomeModule = (function () {
// Module code
return this;
})();
然后使用你的 grunt concat 并首先指定顶级文件。这样你只会在 window 对象上公开一个项目,你的模块将可以通过 window.SomeApplication.SomeSubNamespace.SomeModule
.
访问
上次我使用 JS 构建大型应用程序时使用了 require.js - 这很好,但开销很大,特别是如果您不想异步加载文件,所以这次我不带它去。
这次我用纯 JS 编写,并使用 Grunt 连接和缩小所有内容(我是 Grunt n00b)。因为我将所有函数保存在单独的文件中,所以我无法像使用单个文件那样将所有函数都包装在一个闭包中。将所有函数保留在全局命名空间之外的最佳解决方案是什么?
我不确定我是否需要一个完整的依赖项管理解决方案,但如果它是轻量级和简单的,我会考虑一个。
有许多常见且易于使用的 JavaScript 工具可通过实现 CommonJS(require.js 使用的规范)或 ES2015 module specification, including (as Benjamin suggested) Webpack, Browserify, and Rollup 来管理应用程序范围的依赖关系.
如果你想在没有任何依赖管理工具的情况下做到这一点,你可以使用 Revealing Module Pattern 和命名空间,简化示例:
Top/Application 文件
window.SomeApplication = (function () {
// Add functions you want to expose to this
this.require= function (path) { // Creates namespace if not already existing, otherwise returns reference to lowest level object in path
var current = window,
i;
path = path.split('.');
for (i = 0; i < path.length; ++i) {
if (!current[path[i]]) {
current[path[i]] = {};
}
current = current[path[i]];
}
return current;
};
return this;
})();
一些其他文件
SomeApplication.require('SomeApplication.SomeSubNamespace').SomeModule = (function () {
// Module code
return this;
})();
然后使用你的 grunt concat 并首先指定顶级文件。这样你只会在 window 对象上公开一个项目,你的模块将可以通过 window.SomeApplication.SomeSubNamespace.SomeModule
.