談談模組化的 require 和 import

2021-10-09 18:09:59 字數 1326 閱讀 7226

一、區別

require是commonjs的規範,在node中實現的api,import是es的語法,由編譯器處理。所以import可以做模組依賴的靜態分析,配合webpack、rollup等可以做treeshaking。

commonjs匯出的值會複製乙份,require引入的是複製之後的值(引用型別只複製引用),es module匯出的值是同乙份(不包括export default),不管是基礎型別還是應用型別。

寫法上有差別,import可以使用import * 引入全部的export,也可以使用import aaa, 的方式分別引入default和非default的export,相比require更靈活。

二、require和import會不會迴圈引用?

答案是不會,因為模組執行後會把匯出的值快取,下次再require或者import不會再次執行。這樣也就不會迴圈引用了。比如a引入了b,b引入了a,如果a再次執行那麼會再引入b,那就迴圈起來了,但實際上會做快取,再次引入不會再執行。可以通過require.cache來檢視快取的模組,key為require.resolve(path)的結果。

三、模組中有定時器改變了匯出的值,匯出的值會不會變?

// a.js

let a =

1settimeout((

)=>

,1000

)module.exports = a

// test.js

const a =

require

('./a'

)settimeout((

)=>

,2000

)// a2.js

let a =

1settimeout((

)=>

,1000

)export

// test2.js

import

from

'./a2'

settimeout((

)=>

,2000

)

結果是import引入的值是2,而require引入的值一直是1,這也是require和imort很重要的乙個區別,es module的export匯出的值會靜態的繫結,而commonjs exports匯出的值是乙個物件,會複製乙份。這樣也就出現了這樣的現象。

四、總結

問 require和import的區別就是問commonjs和es module的區別,這兩者乙個是api的規範,乙個是語言的語法,所以後者可以做靜態分析,基於這個實現treeshaking,同時es module會靜態的繫結匯出的值,而commonjs會複製乙份。但兩者都會做快取,所以不會有迴圈引用問題。

函式式程式的模組化和物件的模組化

define random init1 define rand update x remainder 13 x 5 24 define random numbers op stream define numbers last value op stream let op stream car op ...

什麼是模組化?模組化的好處

1.高內聚低耦合,有利於團隊作戰,當專案很複雜的時候,將專案劃分為子模組分給不同的人開發,最後再組合在一起,這樣可以降低模組與模組之間的依賴關係體現低耦合,模組又有特定功能體現高內聚。2.可重用,方便維護,模組的特點就是有特定功能,當兩個專案都需要某種功能的時候,我們定義乙個特定的模組來實現該功能,...

什麼是模組化?模組化的好處

什麼是模組化?j a 應用架構設計 模組化模式與 osgi 一書中對它的定義是 模組化是一種處理複雜系統分解為更好的可管理模組的方式。所謂的模組化開發就是封裝細節,提供使用介面,彼此之間互不影響,每個模組都是實現某一特定的功能。模組化開發的基礎就是函式。模組化開發使 耦合度降低,模組化的意義在於最大...