node系列扯犊子之二聊聊模块系统

Node里面的模块系统遵循的是CommonJS规范。

1、CommonJS模块的特点:

  • 所有代码都运行在模块作用域,不会污染全局作用域。
  • 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
  • 模块加载的顺序,按照其在代码中出现的顺序。

2、module对象

  • 每个模块内部,都有一个module对象,代表当前模块。它的属性:
  • module.id 模块的识别符,通常是带有绝对路径的模块文件名。
  • module.filename 模块的文件名,带有绝对路径。
  • module.loaded 返回一个布尔值,表示模块是否已经完成加载。
  • module.parent 返回一个对象,表示调用该模块的模块。
  • module.children 返回一个数组,表示该模块要用到的其他模块。
  • module.exports 表示模块对外输出的值。

那么问题来了,module.exports和exports的区别?
为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令:var exports = module.exports;
所以,对每个模块来说,module.exports和exports是相关联的,所以可以向exports对象添加方法,不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系。
所以,当两者同时存在,require眼里只有module.exports,只有exports存在时,在require眼里,它不过是module.exports的一个影子而已,无论什么时候,require眼里其实只有module.exports。我滴天!require是渣呢?还是痴情呢?

3、require函数及其辅助方法主要如下:

  • require(): 加载外部模块
  • require.resolve():将模块名解析到一个绝对路径
  • require.main:指向主模块
  • require.cache:指向所有缓存的模块
  • require.extensions:根据文件的后缀名,调用不同的执行函数

参考链接:
http://javascript.ruanyifeng.com/nodejs/module.html
https://www.runoob.com/nodejs/nodejs-module-system.html

上一篇:[js基础篇]模块化小结


下一篇:生成DLL文件,没生成LIB文件