笔记:import 和 require 区别

432 阅读2分钟

require 和 import 是不同模块化规范下引入模块的语句(CommonJS 和 ES6)

1. 主要区别

区别importrequire
加载编译时加载(静态加载)运行时加载(动态加载)
导入可以导入模块中的所有导出内容或者部分导出内容导入整个模块对象,不能仅导入部分内容
导出import/export 模块输出的是值的映射,导出的值可以变化(输出值的映射)require/exports 输出的是值的拷贝。也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。(输出值的拷贝)
书写位置必须写在文件的顶部可以写在代码任何地方执行比如函数、判断语句当中
性能性能较高,因为 import 只需要依据 import 中的接口在编译时引入指定模块所以性能稍高性能较低,因为 require 是在运行时才引入模块并且还赋值给某个变量

1.1 值的拷贝和值的映射示例:

var a = 6
export default {a}
a = 7  //在es6中的export可以
var a = 6
module.export = a
a = 7   //在common.js中,这样是错误的

2. 区别的补充

2.1 import/export 不能对引入模块重新赋值/定义

2.2 ES6 模块可在 import 引用语句前使用模块,CommonJS 需先引用后使用

ES6 模块
//webUtils.js
export var e='foo';

console.log(e) // 'foo'
import {e} from './webUtils.js';
console.log(e) // 'foo'
CommonJS
//utils.js
exports.e = 'foo';

console.log(a) // 报错 ReferenceError: a is not defined
a = require('./utils');
console.log(a) // 'foo'

2.3 是否采用严格模式

  • import/export 导出的模块默认调用严格模式。
  • require/exports 默认不使用严格模式,可以自定义是否使用严格模式。

3. 其他模块化方法

3.1 动态导入 import()

import(modulePath)表达式加载模块并返回一个 promise,该 promise resolve 为一个包含其所有导出的模块对象。

我们可以在代码中的任意位置动态地使用它。例如:

import('/modules/my-module.js') //动态导入
  .then((module) => {
    // Do something with the module.
});

注意: 不要滥用动态导入 import()(必要情况下再采用)。