摘要:所以,在模塊代碼執(zhí)行完之前,根本不知道這個(gè)模塊到底出了什么東西,這也是和最大的區(qū)別,因?yàn)槭腔陉P(guān)鍵字的模塊化,是可以在解析的過程中就知道導(dǎo)出了什么。
require | import |
---|---|
動(dòng)態(tài)評(píng)估 | 靜態(tài)評(píng)估 |
再運(yùn)行時(shí)報(bào)錯(cuò) | 再解析時(shí)報(bào)錯(cuò) |
不是關(guān)鍵詞 | 是關(guān)鍵詞 |
dep.js
module.exports = { foo: function () {}, bar: "a" }
app.js
var dep = require("dep") console.log(dep.bar) dep.foo()ESM
dep.js
export foo function(){} export const bar = "a"
app.js
import { foo, bar } from "dep" console.log(bar) foo()加載方式的不同
使用require的時(shí)候,其實(shí)會(huì)將module的代碼進(jìn)行包裝,變成如下樣子的代碼:
function (exports, require, module, __filename, __dirname) { const m = 1; module.exports.m = m; }
然后在執(zhí)行這個(gè)方法的時(shí)候,我們可以傳入:
const module = { exports: {} } const require = function(){/* ...some module load code here */} // __filename, __dirname是require的時(shí)候提供的路徑分析出來的 fun(module.exports, require, module, __filename, __dirname)
執(zhí)行完成之后,就能通過module拿到方法中向外拋出的變量了。
所以我們可以看到,module、require、exports都不是全局變量,而是專門為這個(gè)模塊使用的局部變量。
require的時(shí)候真正做的事情如下:
Resolution / 解析路徑
Loading / 加載代碼
Wrapping / 包裝
Evaluation / 評(píng)估執(zhí)行
Caching / 緩存
簡(jiǎn)單來說就是根據(jù)require調(diào)用時(shí)傳入的路徑,首先要拿到真正的絕對(duì)路徑(是相對(duì)目錄的,還是node_modules下面的等等),然后讀入代碼,包裝成上面顯示的樣子,然后傳給vm進(jìn)行評(píng)估執(zhí)行,得到結(jié)果,最后進(jìn)行緩存。
所以,在模塊代碼執(zhí)行完之前,node根本不知道這個(gè)模塊到底export出了什么東西,這也是和ESM最大的區(qū)別,因?yàn)镋SM是基于關(guān)鍵字的模塊化,是可以在解析的過程中就知道導(dǎo)出了什么。
在解析ESM模塊的時(shí)候,在把代碼傳給VM執(zhí)行之前,就可以得到一個(gè)叫做Module Record的內(nèi)部結(jié)構(gòu),他保存了模塊倒出的內(nèi)容的列表,在你import {f} from f的時(shí)候,他其實(shí)在你引用的地方和倒出的地方的f之間建立了連接,即它們是指向同一內(nèi)存的,即便是原始數(shù)據(jù)類型,你修改模塊中的指也會(huì)導(dǎo)致引用處的變化。啥意思呢?
// dep.js export let a = 1 setTimeout(() => a += 1, 500) // app.js import { a } from "dep" setTimeout(function () { console.log(a) }, 1000)
輸出的會(huì)是2,但是你用require,CommonJs模塊來做,就會(huì)是1,因?yàn)镃ommonJs是普通的值傳遞或者引用傳遞
這就是require和import最大的區(qū)別
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/94322.html
摘要:今天我們討論一個(gè)軟件測(cè)試方面的深刻問題。軟件測(cè)試人員算是程序員嗎大家不要緊張當(dāng)我們摸不到頭腦的時(shí)候,度娘是你最好的選擇。點(diǎn)來點(diǎn)去基本就完成了測(cè)試工作然后上線但是效果往往大跌眼鏡。那么現(xiàn)在回到測(cè)試人員到底算不算程序員這個(gè)問題上來。 ...
摘要:人生,遠(yuǎn)不止是錢。如何管理,一個(gè)更復(fù)雜的人生人生,就是一個(gè)大型應(yīng)用。把復(fù)雜的人間,拆解成了行動(dòng)與目標(biāo)。所以,,以及和兩個(gè)函數(shù),就構(gòu)成了的邏輯。現(xiàn)在,你不僅完全理解了的設(shè)計(jì)哲學(xué),你更懂得了如何管理人生。 Veux的哲學(xué),實(shí)質(zhì)上是人生的哲學(xué)。 看一看這張圖。 showImg(https://segmentfault.com/img/remote/1460000018782816?w=424...
摘要:事件去年奪冠,王思聰抽獎(jiǎng)。終于說到今天的正題了時(shí)間塔是什么它是一個(gè)區(qū)塊鏈量子隨機(jī)數(shù)發(fā)生器。簡(jiǎn)單地說,時(shí)間塔從鏈上抽取數(shù)據(jù),通過一系列高級(jí)操作,生成隨機(jī)數(shù)時(shí)間塔和有什么關(guān)系時(shí)間塔是聯(lián)合知名高校科研機(jī)構(gòu)以及實(shí)驗(yàn)室共同開發(fā)的科研成果。 以前我一直認(rèn)為,人類的本質(zhì)是復(fù)讀機(jī)。實(shí)際上,我還是過于年輕了,現(xiàn)實(shí)的冷水,終于澆醒了我。 人類的本質(zhì),是鴿子。 為什么?你聽我說。showImg(https:...
摘要:閉包反正看完我就懂了想要好好的理解閉包,你得首先理解作用域。其實(shí)這個(gè)閉包的產(chǎn)生過程可以理解為在里面的匿名函數(shù)定義時(shí)正處于懷孕階段,到外面調(diào)用時(shí),娃就出生了,娃就是閉包啦。閉包改變了變量的生命周期,變量將得到永生。 閉包?反正看完我就懂了 想要好好的理解閉包,你得首先理解作用域。別說了,趕緊去看作用域吧,?,這世界就是如此殘酷。好,言歸正傳,我們是來學(xué)習(xí)閉包的。O(∩_∩)O 什么是閉包...
閱讀 2318·2021-11-22 12:01
閱讀 1999·2021-11-12 10:34
閱讀 4520·2021-09-22 15:47
閱讀 2834·2019-08-30 15:56
閱讀 2866·2019-08-30 15:53
閱讀 2407·2019-08-30 13:53
閱讀 3383·2019-08-29 15:35
閱讀 3129·2019-08-29 12:27