require 和 import 在日常的开发过程中是经常使用的已经模块引入的方式,这里记录我的一些体悟
require 是赋值过程并且是运行时才执行,本质是把module.exports指向的内存里储存的内容通过require函数进行了浅拷贝,拷贝的结果被赋予了执行了require的变量,做个实验
//被引用的文件 require.js
let obj = { a: { aa: 1 }, b: 1 }
let num = 0
const add = () => {
num++
obj.a.aa++;
obj.b++;
}
const res = {
obj,
add,
num
}
module.exports = res
//main.js
let re = require("./require.js");
console.log("obj:" + re.obj.a.aa, re.obj.b, "num:" + re.num)//obj:1 1 num:0
re.add()
console.log("obj:" + re.obj.a.aa, re.obj.b, "num:" + re.num)//obj:2 2 num:0
很明显obj(引用型数据类型)被改变了,而num(基础数据类型)却没有,因为require导出的内容是module.exports的指向的内存块内容的浅拷贝
import 是解构过程并且是编译时执行,在编译时就会输出引用,调用时直接通过引用访问内存上的内容
//被引用的文件 import.js
let obj = { a: { aa: 1 }, b: 1 }
let num = 0
const add = () => {
num++
obj.a.aa++;
obj.b++;
}
export {
obj,
add,
num
}
//main.js
import * as re from "./import.js"
console.log("obj:" + re.obj.a.aa, re.obj.b, "num:" + re.num)//obj:1 1 num:0
re.add()
console.log("obj:" + re.obj.a.aa, re.obj.b, "num:" + re.num)//obj:2 2 num:1
这里的num同样发生了改变,这是因为每次调用都是对内存的直接访问
补充一些其它不同点
-
导入
require导出exports/module.exports是CommonJS的标准,通常适用范围如Node.js -
import/export是ES6的标准 -
require可以理解为一个全局函数,因为它是一个方法所以意味着可以在任何地方执行。 -
import会提升到整个模块的头部,具有置顶性,但是建议写在文件的顶部。