Nodejs模块系统浅探的一些笔记

2020/01/15 Nodejs Notes

这篇速记是对Node.js的模块系统浅层次的探究,不涉及到Node.js模块化和模块系统的底层实现以及模块通信机制。速记了一些个人认为比较常见的一些模块系统的语法和概念。

加载模块: require

  1. 语法:

     var xxx = require("xx"); //xxx是自定义的变量名称,xx是模块名称
    
  2. 一些性质:

    • 执行被加载模块中的代码。
    • 得到被加载模块中的exports接口对象。
    • 优先从缓存中加载,若缓存中已有需要加载的模块,就直接从缓存加载,无需重新执行代码即可直接使用相应函数。

导出模块: exports

  1. 导出多个成员(成员必须在对象中)

     exports.a = 123;
     exports.b = "hello";
     exports.c = function () {
         console.log("ccc");
     }
     exports.d = {
         "foo": "bar"
     }
    
  2. 导出单个成员

     module.exports = "hello";
    
     // 二次赋值会覆盖前一次的赋值结果
     module.exports = function (x,y) {
         return x+y;
     }
    
  3. 也可以通过第二种方法导出多个成员

     module.exports = {
         add: function () {
             return x+y;
         }
         str: "hello"
     }
    

模块导出的原理简析

exportsmodule.exports的一个引用,即在底层实现上Node.js使用了类似下面的语句:

var exports = module.exports; // 即声明了exports变量,并且使其成为module.exports的一个引用

然而在最终模块返回值上,Node.js返回的实际是:

return module.exports;

所以如果exports重新被赋值了新对象,则不会对module.exports指向的实际内存空间产生影响;而如果module.exports被重新赋值,则原本绑定(挂载)到exports中的成员将不会被导出。

Search

    Table of Contents