【发布时间】:2015-10-01 12:08:35
【问题描述】:
所以我在个人项目中使用模块是出于通常的原因(命名空间保护和依赖关系处理 (require) 和公共 API 定义 (exports))。我编写了自己的 require() 方法并使用标准模块模式——即:
var myModule = (function() {
var exports = {};
function sayHello() {
return "hi";
}
exports.sayHello = sayHello;
return exports;
})();
所以我想将我的东西标准化为 CommonJS 标准(这是针对服务器端 JS 的,我的问题是 not 关于 CommonJS 与其他模块标准的对比)。我读到的关于 CommonJS 的所有内容都说模块看起来像这样
function sayHello() {
return "hi";
}
exports.sayHello = sayHello
就是这样!但这不是一个模块。一定有什么东西把这个包装成一个实际的模块!我还没有找到一个讨论 CommonJS 模块的网站,它说明了它是如何变成一个实际的模块的。我是否错过了其他人似乎都知道的东西?
所以我的问题是:
包装是什么? ——也就是说,是什么把它变成了一个实际的模块?我猜是某种图书馆。
这个最终的、包装好的 CommonJS 模块是什么样的?我想编写 CommonJS 标准的实现,但找不到任何关于最终模块应该是什么样子的文档。
“exports”变量是否在全局范围内?如果没有,如果没有在模块代码的主体中明确声明,那么向模块提供导出对象是什么?是谁在做的——模块的调用者?
当。我自己写的时候看起来很简单。现在它看起来像魔术。一些综合文档的链接会很棒。
注意:我对node.js知之甚少,不打算在这个项目中使用它,所以如果你回答,请不要在node.js中回答-说话。
【问题讨论】:
-
"包装是什么?" — 这取决于主机环境。浏览器实现将不同于 Node.js 实现,而 Node.js 实现将不同于 WSH 实现等等。
-
我写了自己的 require() 方法 - 你是怎么做到的?它有什么作用?你为什么要重新发明轮子?
-
NodeJS 为您隐式处理 CommonJS。浏览器环境不会这样做,并且要在其中使用 CommonJS 模式,您将需要一个 JavaScript 捆绑器,例如 Browserify 或 Webpack(至少在 ES6 登陆所有主要浏览器之前)
-
@Amit - 我的问题是这个轮子是什么?我写了我当时需要的东西——即一种管理模块的方法。现在我想了解 CommonJS 的内部结构,以便我可以使用 wheel。
标签: javascript module commonjs