在Node.js中,可以通过两种方式引入和导出模块:CommonJS模块格式和ES6模块格式。需要注意的是,不同的方式有自己的模块引入机制(可以参考这篇文章)。
CommonJS模块格式
Node.js默认的模块系统,使用require引入模块,exports或module.exports导出模块。
引入模块示例:
// 引入系统模块
const fs = require('fs')
// 引入第三方模块,需要通过"npm i"预先安装
const Koa = require('koa')
// 引入自定义模块
const myModule = require('./myModule')
导出自定义函数示例:
function sum(...args) {
if (args.length === 0) {
throw new Error('invalid args')
}
args.forEach((arg) => {
if (!+arg) {
throw new Error('invalid args')
}
})
return args.reduce((sum, arg) => sum += +arg, 0)
}
exports.sum = sum
有多个对象要导出时,将其添加为exports对象的属性即可,如:
exports.func1 = () => {}
exports.func2 = () => {}
导出自定义类示例:
class A {
constructor() {
this.name = 'A'
}
sayName() {
console.log(this.name)
}
}
module.exports = A;
⚠️注意,上述的例子中,不能写为exports=A。因为exports只是module对象上exports属性的引用(等同于let exports = module.exports),所以对exports变量的赋值不会影响module.exports的值。
导出的是值的拷贝,内部的修改无法反馈到外部,如:
// a.js
let value = 100
function setValue(newValue) {
value = newValue
}
exports.value = value
exports.setValue = setValue
// b.js
const a = require('./a')
console.log('before:')
console.log(a.value)
a.setValue(200)
console.log('after:')
console.log(a.value)
/*
output:
before:
100
after:
100
*/
ES6模块格式
使用import和export关键字。在Node.js中使用时需要额外配置:
- 在
package.json中设置type: module。 - 或者将文件扩展名改为
.mjs。
引入模块示例:
// 引入默认导出的值
import fs from 'fs'
// 引入命名导出的值
import { sum } from './myModule.mjs'
// 引入模块所有导出内容并绑定到指定的命名空间
import * as MyModule from './myModule.mjs'
导出模块示例
class A {
constructor() {
this.name = 'A'
}
sayName() {
console.log(this.name)
}
static sayHello() {
console.log('Hello')
}
static sayGoodBye() {
console.log('sayGoodBye')
}
}
// 默认导出
export default A
// 命名导出
export const sayHello = A.sayHello
export const sayGoodBye = A.sayGoodBye
⚠️注意,默认导出有且只能有一个,但可以定义多个命名导出。
导出的是值的引入,内部修改可以反馈到外部,如:
// a.mjs
export let value = 100
export function setValue(newValue) {
value = newValue
}
// b.mjs
import { value, setValue } from './c.mjs'
console.log('before:')
console.log(value)
setValue(200)
console.log('after:')
console.log(value)
/*
output:
before:
100
after:
200
*/