1、遵循的规范不同
require 是AMD规范引入方式
import 是es6的一个语法标准,兼容浏览器要转换成es5
2、调用时间
require是运行时调用,require是个函数所以require理论上可以运用在代码的任何地方
import是编译时调用,所以必须放在文件开头 且放在全局中引入
3、本质
require是赋值过程,其实require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量
import是解构过程,但是目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require
4、所属语法规范不同
import(es6语法)
import在编译时确定导入
路径只能是字符串常量
import会被提升到文件最顶部
导入的变量是只读的
import导入的是值引用,而不是值拷贝
模块内部值发生变化,会对应影响到引用的地方
import导入与导出需要有一一映射关系,类似解构赋值。
require(CommandJS规范)
它相当于module.exports的传送门,module.exports后面的内容是什么,require的结果就是什么,对象、数字、字符串、函数……再把require的结果赋值给某个变量,相当于把require和module.exports进行平行空间的位置重叠。
require理论上可以运用在代码的任何地方,甚至不需要赋值给某个变量之后再使用。
require(’./a’)(); // a模块是一个函数,立即执行a模块函数
var data = require(’./a’).data; // a模块导出的是一个对象
require()的路径可以是表达式:require(’/app’ + ‘/index’);
require导出的是 module.exports对象
exports是对module.exports的一个引用,当module.exports指向变化,exports导出就会出问题了
require返回对应module.exports对象的浅拷贝
如果是module.exports里的基本类型的值,会得到该值的副本
如果是module.exports里的对象类型的值,会得到该值的引用