成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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號
中国熟妇色XXXX欧美老妇多毛 | 亚洲午夜成人精品无码色欲| 皇帝在御花园进入贵妃的小说| 亚洲熟妇色av一区二区浪潮| 你的奶好大让老子摸摸的说说| 波多野成人无码精品电影| 日产精品一二三区| 国产SM鞭打折磨调教视频| 久久人妻无码中文字幕| 成人免费AV一区二区三区| 香港三级日本三级A视频| 美日韩AV成人影院| 国产精品JIZZ在线观看| 中国女人黑森林毛耸耸| 色欲蜜臀AV在线播放| 777亚洲精品乱码久久久久久| 他趴在两腿中间舔我私密有事吗| 久久久久久久综合色一本| 吃瓜视频最全观看| 亚洲中文无码A∨在线观看| 免费无码又爽又刺激高潮的APP| 国产精品久久久久久影视不卡| 色综合久久中文综合网| 开心久久婷婷综合中文字幕| 国产精东天美AV影业传媒| 99热精品国产三级在线| 破了亲妺妺的处免费视频国产| 国自产精品手机在线观看视频| 差差差软件大全APP推荐免费| 一区二区欧美视频| 亚洲AV无码国产一区二区三区 | 免费AV片大尺度在线观看| 国产乱人伦偷精品视频不卡| YY6080久久亚洲精品| 一二三四免费观看在线影视大全| 亚洲 都市 无码 校园 激情| VIDEOS欧美熟妇高跟| 精品久久一区二区乱码| AV无码久久久久不卡网站下载| J日本成熟IPHONE69| 一二三四视频社区在线| 亚洲欧美一区二区三区| 国产精品高潮呻吟爱久久AV无码| 亚洲AV噜噜狠狠网址蜜桃| 搡老熟女老女人HHD| 精品熟妇无码av免费久久| 国产成人啪精品视频免费软件 | 精品久久久久久久无码| 国产精品白丝JK白祙喷水视频| 差差漫画网页登录页面弹窗 | 丝瓜秋葵草莓香蕉榴莲绿| 丝瓜秋葵草莓香蕉榴莲绿| 无码H黄肉动漫在线观看| 亚洲人成无码网站在线观看野花 | 少妇的丰满人妻HD高清| 野花高清在线观看免费官网| 差差差很疼视频30分钟应用| 精品无码一区二区三区爱欲| 日韩精品无码观看视频免费| 亚洲色AV天天天天天天| 成人午夜又粗又硬又长| 久久久久人妻一区精品| 国产一区二区三区水蜜桃| 麻豆AV一区二区三区| 无码国产精品久久一区免费| 337P日本欧洲亚洲大胆在线| 国产又粗又猛又爽又黄的视频在线| 欧美 日韩 高清 国产AⅤ一区| 亚洲av成人网站| А天堂最新版中文网| 精品午夜福利1000在线观看| 少妇高潮惨叫喷水在线观看| 在线观看成人无码中文AV天堂不| 777琪琪午夜理论电影网| 国产女人精品视频国产灰线| 久久99久久99精品中文字幕| 男人的天堂在线视频| 亚洲ⅤA中文字幕无码| ZOOM人与ZOOM| 久久久精品成人免费观看国产| 四虎影视永久无码精品| 18禁裸乳啪啪无遮裆网站| А√新版天堂资源在线BT| 久久精品国产亚洲AV高清色欲| 天天看片在线完整版| CSGO大姐姐AWP多少钱| 久久国产热这里只有精品| 无码人妻丰满熟妇区免费| 啊宝宝的扇贝真会夹C视频| YSL千人千色T9T9T9T9| 久久综合九色综合网站| 亚洲AV无码专区国产乱码4SE| 丁香花在线电影小说| 国内精品伊人久久久久影院对白| 日产2021免费一二三四区| 亚州熟妇无码AV线播放| 成人免费视频一区二区| 男男车车CP视频| 亚洲欧美日韩精品久久| 国产精品免费高清在线观看| 久久久一本精品99久久精品88| 西方38大但人文艺术| 短乱俗小说500篇免费下载| 欧美成人精品视频在线观看| 野花香电视剧全集免费观看高清| 国内精品久久久久影院一蜜桃 | 成人乱码一区二区三区AV| 男男高H啊灌满了高潮视频| 亚洲无人区一码二码三码区别| 韩国av一区二区| 西欧FREE性满足HD| 国产精华最好的产品有哪些 | 成人性生交大片免费看中文| 欧美制服丝袜人妻另类| 18禁超污无遮挡无码免费游戏 | 亚洲视频日韩视欧美视频| 国内精品久久人妻互换| 小浪货腿打开水真多真紧| 国产福利一区二区三区在线视频| 色翁荡息又大又硬又粗视频| 成码无人AV片在线电影无下载| 人成午夜免费大片| 亚洲精品亚洲人成在线观看麻豆| 国产精品成人VA在线观看| 他揉捏她两乳不停呻吟人妻| 粉嫩一区二区三区| 十八款夜间禁用APP| 高H闺蜜老公1V1| 伸进衣服里吃奶捏胸视频| 大肉大捧一进一出视频出来呀| 日韩AV一区在线观看| 菠萝视频免费最新在线观看| 青青草国产精品亚洲专区无码| JIZZJIZZ中国护士高清多| 热99RE久久免费视精品频 | 女性自慰AⅤ片高清免费| 2022国产在线无码精品| 女人浓毛巨茎ⅩXXOOO| CHINESE老女人老熟妇| 人狗大战JAVA代码| 被老外添嫩苞添高潮NP视频| 久久天天躁狠狠躁夜夜AV| 永久看一二三四线| 蜜桃色欲AV久久无码精品软件| 色一情一区二区三区四区| 隔着衣服吃你的小尖尖作文| 丝袜高潮流白浆潮喷在线播放| 公车掀起老师裙子进入在线| 无码毛片AAA在线| 国产又粗又猛又爽又黄的网站 | 日本免费不卡在线观看的NV| 大伊香蕉精品视频在线天堂| 天美传媒蜜桃传媒精东豆| 国产区在线观看成人精品| 亚洲成人av无码| 国产爱豆剧传媒在线观看视频 | 亚洲高清国产拍精品熟女| 久久AⅤ无码精品色午麻豆| 又硬又粗又大一区二区三区视频| 免费又黄又爽1000禁片| ぱらだいす天堂中文网WWW| 熟妇性MATURETUBE另类| 国产女主播高潮在线播放| 亚洲乱亚洲乱妇24P| 迷迷糊糊挺进岳身体| 啊~用力CAO我CAO死我视频| 天堂影院在线观看高清在线| 国内精品伊人久久久久妇| 在线|国产精品女主播阳台| 欧美致敬很多经典的黑白MV| 高清播放器欧美大片| 亚洲AV无码成H人在线观看| 久久久久亚洲AV无码网站| 91人妻人人妻人人爽人人精品| 日韩A片无码ⅩXXXX| 国产日产久久高清欧美一区| 亚洲中文字幕AⅤ无码天堂| 欧美极品少妇XXXXⅩ高跟鞋| 丰满妇女伦大片免费| 亚洲AV无码专区亚洲AV手机版| 麻豆精品久久久久久中文字幕无码| ZLJZLJZLJ日本人| 无人区码一码二码三码在线| 久久精品国产免费播高清无卡| BBwBBw高潮喷水日本少妇自| 熟妇人妻精品一区二区蜜桃| 娇妻初尝粗大滋味借种韩国电影 | 亚洲AV永久无码一区| 免费AV永久免费网址| 丰满的熟妇人妻中文字幕久久| 亚洲产国偷v产偷v自拍浪潮AV| 毛片内射久久久一区| 丰满少妇被猛烈进入高清播放| 亚洲国产精品成人一区二区在线| 内射爽无广熟女亚洲| 国产精品久久久久精品三级卜| 伊人久久大香线蕉AⅤ色| 日产一二三区别免费必看| 精品乱子伦一区二区三区| 宝宝湿透了还嘴硬怎么回事|