【学记】import和require的差别

190 阅读1分钟

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.exportsCommonJS 的标准,通常适用范围如 Node.js

  • import/exportES6 的标准

  • require 可以理解为一个全局函数,因为它是一个方法所以意味着可以在任何地方执行。

  • import 会提升到整个模块的头部,具有置顶性,但是建议写在文件的顶部。