Node.js 程序一开始内容都在作为 entry point 的主程序文件里,代码量多了以后需要进行组织;又或者有的代码需要方便重用,这时就用到 module。

其实每个 .js 文件就是一个 module,我们可以创建 HelloWorld.js ,输入以下内容,用 node 执行观察输出结果

console.log(module.filename)
console.log(module.id)
console.log(module.exports)

在 Node.js 中,一个 module 的成员对外开放,能够被访问到是通过 module.exports 对象为接口

上面的例子也算是一个 module,可以通过 require 引用,只是目前它的 module.exports 对象为空,并没有实际的作用而已

let hw = require('./HelloWorld.js')

假设 HelloWorld.js 有以下成员,

let myName = 'World'

function sayHello(name){
  return `Hello ${name}!`
}

可以通过赋值给 module.exports 对象的属性来使其能够被外部访问到(JS 这种都是对象,函数名和变量名一样拿着到处赋值,仍然是不适应啊,每次见着都得缓一缓才能把思路顺过来)

module.exports.myName = myName
module.exports.sayHello = sayHello

// module.exports = {
//   myName: myName,
//   sayHello: sayHello
// }

接下来就可以在调用代码中访问到开放的成员了

let hw = require('./HelloWorld.js')

let result = hw.sayHello(hw.myName)
console.log(result)

以上关于 module 的代码使用的是 CommonJS 格式,虽然很多例子用的是这个格式,但 2013年 npm 作者已宣布被 Node.js 淘汰 🤦🏻‍♂️。不过新的 ES6 格式看着头晕,先用着 CommonJS 上手也可以。真的需要,编辑器也有可用的转换功能。