【问题标题】:Javascript CommonJS - where's the module?Javascript CommonJS - 模块在哪里?
【发布时间】: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


【解决方案1】:

包装是什么?

节点是。它可以访问文件系统,因此它会缓存所有需要的文件中的代码,并将其交付给需要它的命名空间。

这个最终的、包装好的 CommonJS 模块是什么样的?

封装模块的实际代码可能在module.js 中,这是Node 安装的lib 文件夹中的核心文件。

“exports”变量是否在全局范围内?

exports 是文件中module 对象的属性。 module 是该文件内的全局范围。 exports 属性是模块返回给需要它的代码的内容。

要记住的关键是 CommonJS 精神是内置在 Node 的核心模块化代码中的。 V8 中没有神奇的实现表明module.exports 是一个“东西”。当实现 ES6 模块成为常态时,这一切可能都会改变。

阅读this,您可能会发现它很有用。

您可能会发现放弃重写require() 会更有用。 :-)

【讨论】:

  • 谢谢深南。放弃重写 require() 为时已晚——它已经完成了!这实际上是必要的,因为我使用的是 Nashorn,所以为了模仿 Node (etc) 所做的事情,我需要处理依赖管理。
  • 那个链接很好顺便说一句。超级好用。
  • @misterblinky 在这种情况下,avatar-js.java.net。我没有尝试使用它。我只知道这是一件事。另外,nodyn.io
猜你喜欢
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 2011-12-04
  • 2013-07-28
  • 2016-05-05
  • 2019-07-26
  • 2015-09-30
  • 2015-07-01
相关资源
最近更新 更多