目录

Nodejs 模块的导入和导出

更新于 2021-02-09

Nodejs 模块的导入和导出

示例:

待导出文档.js

let fun = function (){
    console.log("hello world")
}
let name = "devin"

module.exports.fun = fun
module.exports.name = name

使用文档.js

//导入模块
const example =  require("./export.js")

example.fun()
console.log(example.name)

导入与导出过程详解

1. 导入模块

1.1 加载模块的过程

  • 执行被加载模块中的代码
  • 得到被加载模块中的 exports 导出的接口对象

1.2 加载顺序

  • 优先从缓存中加载
  • 查找核心模块
  • 查找路径形式的文件模块
  • 第三方(自定义)模块

只使用 module.exports 即可。

require 用来加载代码,而 exports 和 module.exports 则用来导出代码

node 与 ES6

require: node 和 es6 都支持的引入 export / import : 只有es6 支持的导出引入 module.exports / exports: 只有 node 支持的导出

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

CommonJS定义的模块分为: 模块标识(module)、模块定义(exports) 、模块引用(require)

在一个node执行一个文件时,会给这个文件内生成一个 exportsmodule对象,而module又有一个exports属性。它们都指向同一个内存。

image-1

实例:赋值与引用

var a = {name: 1};
var b = a;          //此处仅仅是引用了a , 内存地址是一样的
console.log(a);     //{ name: 1 }
console.log(b);     //{ name: 1 }
b.name = 2;
console.log(a);     //{ name: 2 }
console.log(b);     //{ name: 2 }
var b = {name: 3};  //此处b 被覆盖,指向了一块新的内存
console.log(a);     //{ name: 2 }
console.log(b);     //{ name: 3 }
  1. module.exports 初始值为一个空对象 {}
  2. exports 是指向的 module.exports 的引用
  3. require() 返回的是 module.exports 而不是 exports

官方说明

image-2

我们经常看到这样的写法:

exports = module.exports = somethings

上面的代码等价于:

module.exports = somethings
exports = module.exports

原理很简单,即 module.exports 指向新的对象时,exports 断开了与 module.exports 的引用,那么通过 exports = module.exports 让 exports 重新指向 module.exports 即可。