Node中模块的引入和导出

185 阅读2分钟

Node.js中,可以通过两种方式引入和导出模块:CommonJS模块格式和ES6模块格式。需要注意的是,不同的方式有自己的模块引入机制(可以参考这篇文章)。

CommonJS模块格式

Node.js默认的模块系统,使用require引入模块,exportsmodule.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模块格式

使用importexport关键字。在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
*/