廖雪峰网站学习

用vs.code调试js代码非常方便,node中的模块加载机制被称为CommonJS规范。

在这个规范下,每个.js文件都是一个模块,它们内部各自使用的变量名和函数名都互不冲突。

<b>结论</b>

要在模块中对外输出变量,用:

module.exports = variable;

输出的变量可以是任意对象、函数、数组等等。

要引入其他模块输出的对象,用:

var foo = require('other_module');

引入的对象具体是什么,取决于引入模块输出的对象。

<b>深入的了解模块原理:</b>
JavaScript语言本身并没有一种模块机制来保证不同模块可以使用相同的变量名。

那Node.js是如何实现这一点的?

其实要实现“模块”这个功能,并不需要语法层面的支持。Node.js也并不会增加任何JavaScript语法。实现“模块”功能的奥妙就在于JavaScript是一种函数式编程语言,它支持闭包。如果我们把一段JavaScript代码用一个函数包装起来,这段代码的所有“全局”变量就变成了函数内部的局部变量。

<b>模块的module.exports是怎么实现的那?</b>

这个也很容易实现,Node可以先准备一个对象module:

// 准备module对象:
var module = {
  id: 'hello',
  exports: {}
};
var load = function (module) {
  // 读取的hello.js代码:
  function greet(name) {
      console.log('Hello, ' + name + '!');
  }

  module.exports = greet;
  // hello.js代码结束
  return module.exports;
};
var exported = load(module);
// 保存module:
save(module, exported);

可见,变量module是Node在加载js文件前准备的一个变量,并将其传入加载函数,我们在hello.js中可以直接使用变量module原因就在于它实际上是函数的一个参数:

module.exports = greet;

通过把参数module传递给load()函数,hello.js就顺利地把一个变量传递给了Node执行环境,Node会把module变量保存到某个地方。

由于Node保存了所有导入的module,当我们用require()获取module时,Node找到对应的module,把这个module的exports变量返回,这样,另一个模块就顺利拿到了模块的输出:

var greet = require('./hello');

强烈建议使用

module.exports = xxx

的方式来输出模块变量,这样,你只需要记忆一种方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,638评论 2 41
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    Myselfyan阅读 4,087评论 2 58
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宫若石阅读 1,117评论 0 1
  • 模块 Node 有简单的模块加载系统。在 Node 里,文件和模块是一一对应的。下面例子里,foo.js加载同一个...
    保川阅读 608评论 0 0
  • 我曾经读过一个大学生发的帖子,他在帖子上说他大学期间欠下了十几万元的贷款,不管自己如何努力的去兼职也是还不...
    磨刀霍霍霍阅读 255评论 1 3