成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

一文帶你了解node中的的模塊系統

本篇文章帶大家進行node學習,深入淺出的了解node中的的模塊系統,希望對大家有所幫助!

一文帶你了解node中的的模塊系統

兩年前寫過一篇文章介紹模塊系統:理解前端模塊概念:CommonJs與ES6Module。這篇文章的知識面都是針對剛入門的,比較淺顯。在這也糾正文章的幾個錯誤:

  • 【模塊】和【模塊系統】 是兩碼事。模塊是軟件中的一個單元,而模塊系統則是一套語法或者工具,模塊系統能讓開發者在項目中定義和使用模塊。
  • ECMAScript Module縮寫是ESM,或者ESModule,而不是ES6Module。

關于模塊系統的基礎知識都在上一篇文章說的差不多了,所以這篇文章會重點關注模塊系統的內部原理以及更加完整的介紹不同模塊系統之間的區別,上一篇文章出現的內容在這就不再重復了。【相關教程推薦:nodejs視頻教程、編程教學】

模塊系統

并不是所有編程語言都有內置的模塊系統,JavaScript誕生之后的很長一段時間里都沒有模塊系統。

在瀏覽器環境中只能使用<script>標簽來引入不用的代碼文件,這種方法共享一個全局作用域,可謂是問題多多;加上前端日新月異的發展,這種方法已經不滿足當下的需求了。在沒官方的模塊系統出現前,前端社區自己創建第三方模塊系統,用的較多的有:異步模塊定義AMD、通用模塊定義UMD等,當然最著名還得是CommonJS

由于Node.js它是一個JavaScript的運行環境,可以直接訪問底層的文件系統。所以開發者通過它,并按照CommonJS規范實現了一套模塊系統。

最開始,CommonJS只能用于Node.js平臺,隨著Browserify和Webpack之類的模塊打包工具的出現,CommonJS也終于能在瀏覽器端運行了。

到2015年發布了ECMAScript6規范,才有了模塊系統的正式標準,按照該標準打造出來的模塊系統稱為ECMAScript module簡稱【ESM】,由此ESM就開始統一了Node.js環境與瀏覽器環境。當然ECMAScript6只是提供了語法和語義,至于實現部分得由各瀏覽器服務廠商和Node開發者去努力。所以才有了令其他編程語言羨慕不已的babel神器,實現模塊系統并不是一件容易的事,Node.js也是到了13.2版本才算是比較穩定的支持ESM。

但不管怎么樣,ESM才是JavaScript的“親兒子”,學習它一定不會有錯!

模塊系統的基本思路

在刀耕火種的年代中使用JavaScript開發應用,腳本文件只能通過script標簽引入。其中遇到比較嚴重的問題就是缺乏命名空間機制,這意味著每個腳本都共享同一作用域。這個問題在社區中有一個比較好的解決方法:Revevaling module

const myModule = (() => {     const _privateFn = () => {}     const _privateAttr = 1     return {         publicFn: () => {},         publicAttr: 2     } })()  console.log(myModule) console.log(myModule.publicFn, myModule._privateFn)
登錄后復制

運行結果如下:

一文帶你了解node中的的模塊系統

這個模式很簡單,利用IIFE創建一個私有的作用域,同時使用return需要暴露的變量。而屬于內部的變量(比如_privateFn、_privateAttr)是不能從外面的作用域訪問的。

【revealing module】正是利用了這些特性,來隱藏私有的信息,同時把應該公布給外界的API導出。后面的模塊系統也正是基于這樣的思路開發的。

CommonJS

基于上面思路,來開發一個模塊加載器。

首先編寫一個加載模塊內容的函數,并把這個函數包裹在私有作用域里面,然后通過eval()求值,以運行該函數:

function loadModule (filename, module, require) {   const wrappedSrc =      `(function (module, exports, require) {       ${fs.readFileSync(filename, 'utf8)}     }(module, module.exports, require)`   eval(wrappedSrc) }
登錄后復制

和【revealing module】一樣,把模塊的源代碼包裹在函數里面,區別在于,還把一系列變量(module, module.exports, require)傳給該函數。

值得注意的是,通過【readFileSync】讀取模塊內容。一般來說,在調用涉及文件系統的API時,不應該使用同步版本。但此時不同,因為通過CommonJs系統來加載模塊,本身就應該實現成同步操作,以確保多個模塊能夠按照正確的依賴順序得到引入。

接著模擬require()函數,主要功能是加載模塊。

function require(moduleName) {   const id = require.resolve(moduleName)   if (require.cache[id]) {     return require.cache[id].exports   }   // 模塊的元數據   const module = {     exports: {},     id   }   // 更新緩存   require.cache[id] = module      // 載入模塊   loadModule(id, module, require)      // 返回導出的變量   return module.exports } require.cache = {} require.resolve = (moduleName) => {   // 根據moduleName解析出完整的模塊id }
登錄后復制

(1)函數接收到moduleName后,首先解析出模塊的完整路徑,賦值給id。
(2)如果cache[id]為true,說明該模塊已經被加載過了,直接返回緩存結果
(3)否則,就配置一套環境,用于首次加載。具體來說,創建module對象,包含exports(也就是導出內容),id(作用如上)
(4)將首次加載的module緩存起來
(5)通過loadModule從模塊的源文件中讀取源代碼
(6)最后return module.exports返回想要導出的內容。

require是同步的

在模擬require函數的時候,有一個很重要的細節:require函數必須是同步的。它的作用僅僅是直接將模塊內容返回而已,并沒有用到回調機制。Node.js中的require也是如此。所以針對module.exports的賦值操作,也必須是同步的,如果用異步就會出問題:

// 出問題 setTimeout(() => {     module.exports = function () {} }, 1000)
登錄后復制

require是同步函數這一點對定義模塊的方式有著非常重要的影響,因為它迫使我們在定義模塊時只能使用同步的代碼,以至于Node.js都為此,提供了大多數異步API的同步版本。

早期的Node.js有異步版本的require函數,但很快就移除了,因為這會讓函數的功能變得十分復雜。

ESM

ESM是ECMAScript2015規范的一部分,該規范給JavaScript語言指定了一套官方的模塊系統,以適應各種執行環境。

在Node.js中使用ESM

Node.js默認會把.js后綴的文件,都當成是采用CommonJS語法所寫的。如果直接在.js文件中采用ESM語法,解釋器會報錯。

有三種方法可以在讓Node.js解釋器轉為ESM語法:
1、把文件后綴名改為.mjs;
2、給最近的package.json文件添加type字段,值為“module”;
3、字符串作為參數傳入--eval,或通過STDIN管道傳輸到node,帶有標志--input-type=module
比如:

node --input-type=module --eval "import { sep } from 'node:path';  console.log(sep);"
登錄后復制

不同類型模塊引用

ESM可以被解析并緩存為URL(這也意味著特殊字符必須是百分比編碼)。支持file:node:data:等的URL協議

file:URL
如果用于解析模塊的import說明符具有不同的查詢或片段,則會多次加載模塊

// 被認為是兩個不同的模塊 import './foo.mjs?query=1'; import './foo.mjs?query=2';
登錄后復制

data:URL
支持使用MIME類型導入:

  • text/javascript用于ES模塊
  • application/json用于JSON
  • application/wasm用于Wasm

import 'data:text/javascript,console.log("hello!");'; import _ from 'data:application/json,"world!"' assert { type: 'json' };
登錄后復制

data:URL僅解析內置模塊的裸說明符和絕對說明符。解析相對說明符不起作用,因為data:不是特殊協議,沒有相對解析的概念。

導入斷言
這個屬性為模塊導入語句添加了內聯語法,以便在模塊說明符旁邊傳入

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
在公车上拨开内裤进入| 成人免费午夜无码视频| 视频一区二区三区在线观看密桃 | 爆乳美女午夜福利视频| 动漫AV纯肉无码AV在线播放| 国产成人无码VA在线观看 | 产高清在线精品一区二区三区| 国产777涩在线 | 美洲| 国产思思99RE99在线观看| 久久AV喷吹AV高潮AV欧美| 免费无码一区二区三区蜜桃大| 人妻少妇无码专视频在线| 十八禁无码免费网站| 亚洲AⅤ精品无码一区二区嫖妓| 亚洲人成绝费网站色WWW吃脚| 综合人妻久久一区二区精品| 成·人免费午夜无码不卡| 国产欧美久久久精品影院| 久久99热精品免费观看牛牛| 欧美激情000ⅩXX同性| 斯诺克直播在线观看高清直播| 亚洲AV毛片成人精品| 中国蓝CHINABLUE| 抽插丰满内射高潮视频| 国内精品视频一区二区三区| 蜜桃av噜噜噜一区二区三区| 乳奴调教榨乳器拘束机器| 亚洲AV无码一区二区二三区| 18禁止导深夜福利备好纸巾| 高潮和狂野射精合集| 教官在我腿中疯狂律动H| 欧美疯狂做受XXXXX高潮| 玩弄漂亮少妇高潮大叫| 亚洲综合色在线观看一区二区| SUNTEK中老年妈妈| 国产在线无码精品无码| 男配每天都在体内成结节| 天堂AⅤ大芭蕉伊人AV| 亚洲中文字幕无码爆乳APP| V与子敌伦刺激对白播放| 国产偷国产偷亚洲高清日韩| 男女狂进狂出动态图| 无码动漫性爽XO视频在线| 中文字幕人成无码人妻综合社区| 寡妇大J8又粗又大| 久青草国产97香蕉在线影院| 上边一面亲下边一面膜的作用| 亚洲一区二区无码成人AV| 大香伊蕉在人线国产最新2005 | 亚洲国产成人久久综合碰碰| А√天堂8在线官网| 精品免费AV一区二区三区| 人人妻人人澡人人爽欧美一区九九| 亚洲VA在线VA天堂VA不卡| 被C哭着爬走又被拉回来挺进H| 精品人妻一区二区三区免费看| 日韩高清在线中文字带字幕| 亚洲一卡2卡3卡4卡精品分类 | 欧美最厉害的喷水VIDEOS| 性色A码一区二区三区天美传媒| 99久久精品费精品国产一区二区 | 麻豆亚洲AV熟女国产一区二| 无码免费大香伊蕉在人线国产| 12一14性XXXXX国产| 国色天香网WWW在线观看| 日本少妇XXⅩ熟睡侵犯| 一本一道AV无码中文字幕| 国产精品盗摄!偷窥盗摄| 女人与公拘交酡ZOZO| 亚洲AV无码专区亚洲AV桃花桃| А√天堂网WWW最新版地址| 久久精品久久久久久久精品 | 国产成人午夜性A一级毛片老女人 国产成人午夜无码电影在线观看 国产成人午夜精品影院 | 婷婷蜜桃国产精品一区| 99久久精品费精品国产| 久久国产高潮流白浆免费观看| 天天摸天天碰成人免费视频| 99久久国产综合精麻豆| 久久国产精品99国产精| 午夜毛片精彩毛片| 差差差很疼视频30分钟无掩盖| 狂野AV人人澡人人添| 亚洲AV综合色区无码一区| 二三四五六七无产乱码| 欧美激情精品久久久久久| 亚洲熟妇色自偷自拍另类| 国产麻豆剧传媒精品国产AV| 日韩av在线一区二区| 91人人妻人人澡人人爽超污| 久久精品99久久香蕉国产| 性少妇TUBEVIDEOS| 公翁的粗大放进我的秘密小说| 欧美在线 | 亚洲| 中文字幕无码一区二区黑人巨大| 精品国产YW在线观看| 西西人体大胆4444WWW| 丰满人妻一区二区三区Aⅴ在线| 欧美激情XXXX| …久久精品99久久香蕉国产| 久久久久久精品免费免费WEI| 亚洲AV综合AV成人网在线观看| 国产高潮流白浆喷水在线观看| 人人澡人人妻人人爽人人蜜桃| 80S国产成年女人毛片| 老头挺进娇妻身体| 亚洲最大AV在线| 久久精品99国产精品蜜桃| 亚洲精品成人无码中文毛片不卡| 国产免费久久精品国产传媒| 推拿完整版中文字幕| 公侵犯玩弄漂亮人妻优| 色噜噜狠狠色综合网| 人妻无码AⅤ中文系列久久免费| 性生生活大片又黄又| 国产精品高潮呻吟AV久久动漫| 日韩视频中文字幕精品偷拍| 白白嫩嫩又小又紧| 人妻少妇伦在线无码专区视频| 99无码精品二区在线视频| 男女做AJ视频免费的网站| 最新 国产 精品 精品 视频| 美女黑人做受XXXXXⅩ性| 在线观看成人网站| 乱码AV麻豆丝袜熟女系列| 中文字幕一区二区三区乱码| 免费A级毛片AV无码| 最新欧美精品一区二区三区| 免费无码高潮流白浆视频| 77777亚洲午夜久久多喷| 蜜桃视频在线观看| 18性欧美XXXⅩ性满足| 欧美激情在线播放| ているの天堂资源WWW| 日本高清中文字幕在线观穿线视频| 锕锕锕锕锕锕~好深啊电影APP| 人妻少妇无码一区二区三区| 成人午夜福利免费无码视频| 视频一区二区三区免费| 国产精品亚洲污污网站入口 | 国产午夜激无码AV片在线观看| 亚洲AV无码国产剧情| 精品国产一区二区三区免费| 亚洲同性男GV网站SEARCH| 泷泽萝拉AV种子| AV一本大道香蕉大在线| 日韩国产成人精品视频| 国产成人免费ā片在线观看老同学| 无码人妻少妇色欲AV一区二区| 国产综合无码一区二区色蜜蜜| 亚洲欧美国产国产一区二区| 老赵抱着月月在厨房做视频| 97色精品视频在线观看| 日本一线和三线的区别是什么| 国产成人无码精品一区在线观看| 小寡妇好紧进去了好大看视频| 精品国产亚洲AV麻豆尤物| 伊人久久大香线蕉AV综合| 欧美黑人aAAAAAAa| 国产A∨国片精品青草视频 | 色诱久久久久综合网YWWW| 国产精品亚洲色婷婷99久久精品 | 亚洲AV理论在线电影网| 国产在线内射婷婷| 一本无码中文字幕在线观| 欧美成人精品三级网站视频| 超碰人人看人人2017| 无人区码卡二卡乱码字幕| 精品国产一区二区三区国产区 | 吃瓜曝光黑料155FUN| 亚洲欧美中文日韩V在线观看| H国产小视频福利免费视频| 日韩午夜福利无码专区A| 国产精品亚洲二区在线观看| 亚洲精品国产美女久久久99| 色欲AV无码一区二区人妻| 国产人妖视频一区二区| 亚洲无人区码二码三码区别| 欧美日韩一区二区三区在线观看视 | 五月丁香六月缴情基地| 久久精品国产亚洲AV无码娇色| chineSe老女人老熟妇hd| 无码精品国产VA在线观看DVD| 久久精品国产亚洲无删除| JLZZJLZZ全部女高潮| 西西人体444WWW大胆无码视| 老翁的大肉蟒进进出出| 公交车舒婷1一20全文| 亚洲性人人天天夜夜摸| 人人澡人摸人人添学生AV| 韩国三级大乳在线观看| 55大东北熟女啪啪嗷嗷叫| 无码成人一区二区三区| 麻豆精品一卡2卡三卡4卡免费观 | 日本XXXX18裸体XXXX| 韩国av一区二区三区| CHINESETUBE国产在线| 性VIDEOS欧美熟妇HDX| 女人的选择HD中字| 国产午夜成人精品视频APP| AJ四色鸳鸯真假区别|