esmodule 和 commonjs到底有什麼區別

我要說的,就算不知道兩者之間的區別,你在寫node和瀏覽器裏面的編程時,也不會導致多大的問題,網絡上吹毛求疵的說法太過誇張了。

在網上搜了一圈,很多文章抄襲於阮老師的總結:https://es6.ruanyifeng.com/#docs/module-loader, 沒有提出自己的見解。

阮老師的科普文章寫的很好,這篇基本也提煉出表象,但是對於總結出的三點區別,我個人理解起來還是容易混淆不夠透徹,所以我基於這部分又作了深入的挖掘,花了點時間讀取規範才終於徹底搞明白了:
https://tc39.es/ecma262/#sec-ecmascript-language-scripts-and-modules

最根本的區別

來自於兩點:

一是esm是爲瀏覽器的加載環境設計的,考慮到網絡的延遲,不可以等到模塊徹底解析完成(同步)再去加載索引加載其他的模塊,所以會以最快的速度建立出樹形的map,再去解析裝載具體的內容,這用異步去解釋也能解釋的通,但是它實際的過程就是這個過程,跟異步什麼的關聯不大。

二是esmimport的實際就是export出的值,它們使用的是同一個空間(內存)。而common js require的是module.exports的值, 返回的實際就是這個module.exports,只是因爲獲取的語法是var xx = require('...'),這只是導出的方式有細微的區別。本質是可以理解的。這是語法上的差異。

下圖可以說明這種語法的本質:

所以可以說,commonsjsrequire("...")返回的也是值的本身,只不過我們使用一個變量聲明賦值的語法來獲取這個值而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章