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