require/exports 和 import/export 区别

前言

刚开始写的时候不太了解这两者的区别,到底什么时候用require/exports什么时候用import/export呢?

require/exports

Node.js 本身没有模块化的标准,但是社区诞生了许多规范,比如require/exports遵循 CommonJS 规范,require.js遵循 AMD,seajs遵循 CMD,无论使用场景有那么多,但是依然不是标准,具体使用方法如下

1
2
3
const fs = require("fs");
exports.fs = fs;
module.exports = fs;

import/export

import/export跟上面的不同,他是 ES6 正式标准下的产物,使用起来也复杂了许多

1
2
3
4
5
6
7
8
9
10
11
12
import fs from 'fs'
import {default as fs} from 'fs'
import * as fs from 'fs'
import {readFile} from 'fs'
import {readFile as read} from 'fs'
import fs, {readFile} from 'fs'

export default fs
export const fs
export function readFile
export {readFile, read}
export * from 'fs'

export实际上是export一个对象,通过key然后import所需的value,如果默认export则需要增加default关键词,import的时候也可以更改key的别名,全部绑定在*的操作,如果你使用过 ES6 语法就是知道这类似解构的概念。

区别

现在看来,感觉两者就类似语法上的区别,实际上他们是运行时和编译时区别:

  • 通过require可以在任意地方使用,是运行时的,他类似一个输出和赋值连接的概念;
  • import必须要在文件开头使用,是编译的时候执行,刚刚提到也是,他类似输出然后解构的概念;

按照上面的区别,可以得出import编译时执行,所以如果实际上不存在export,那么在编译过程中就已经会报错,而require在运行过程中引入, 如果仅用到其中一个方法,也要把整个模块引入内存,所以对比起来,import会性能提高一点。