gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

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

一文帶你了解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號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
亚洲制服中文字幕| 五月天综合婷婷| 欧洲精品在线播放| 中文字幕精品在线播放| 三上悠亚在线一区| 一区二区xxx| 2025韩国理伦片在线观看| 成年网站在线免费观看| 国产精品免费观看久久| 激情五月宗合网| 国产肥臀一区二区福利视频| 青青草国产精品视频| 日本一道本久久| 欧美成人黑人猛交| 久久撸在线视频| 日韩高清在线一区二区| 国产高清免费在线| 国产精品va在线观看无码| 男女裸体影院高潮| 久久精品国产sm调教网站演员| 黄色免费视频大全| www.xxx亚洲| 一级网站在线观看| 大伊香蕉精品视频在线| 日韩av在线综合| www.99r| 日韩亚洲欧美一区二区| 18禁男女爽爽爽午夜网站免费 | 亚洲精品性视频| 1314成人网| 青青草视频在线免费播放| 国产又黄又猛视频| 久久免费看毛片| 国产免费黄色av| 99视频在线观看视频| 国产一级爱c视频| 在线观看av免费观看| 日韩精品xxxx| 久久久成人精品一区二区三区| 国产一区二区网| 在线播放 亚洲| 精品久久久久久无码国产| 97精品国产97久久久久久粉红| 亚洲精品无码国产| 五月天男人天堂| 黄色国产小视频| av网站手机在线观看| 亚洲精品免费一区亚洲精品免费精品一区 | 大地资源网在线观看免费官网| 日韩欧美一区三区| 97精品国产97久久久久久粉红| 黄色高清无遮挡| 久久久久久久久久久视频| 伊人网在线免费| 国产日韩视频在线播放| 欧美特级aaa| 熟女少妇精品一区二区| 91视频最新入口| 日韩免费视频播放| 极品粉嫩国产18尤物| 熟妇熟女乱妇乱女网站| 欧美特黄aaa| 一道本在线免费视频| 蜜臀视频一区二区三区| www国产黄色| 亚洲熟妇av一区二区三区| 国产精品裸体瑜伽视频| 毛片在线播放视频| 每日在线更新av| 日本wwww视频| 91色国产在线| 女同激情久久av久久| 男人午夜视频在线观看| 国产免费色视频| 麻豆一区二区三区在线观看| 日韩精品一区二区三区电影| 一二三在线视频| 日本熟妇人妻xxxx| 日韩av黄色网址| 九九热在线免费| 亚洲综合123| 成年女人18级毛片毛片免费| 日韩xxxx视频| 成人免费毛片播放| 五月天中文字幕在线| 干日本少妇视频| 国产av麻豆mag剧集| 国产精品无码专区av在线播放| 国产三级日本三级在线播放| 亚洲激情在线看| 蜜臀av色欲a片无码精品一区| 黄色片网址在线观看| 日本美女高潮视频| 毛片毛片毛片毛片毛| 欧美人与动牲交xxxxbbbb| 日本免费不卡一区二区| 8x8x最新地址| 99亚洲国产精品| 色婷婷综合久久久久中文字幕| 精品久久久99| 欧美日韩黄色一级片| 国产欧美精品一二三| av高清在线免费观看| aaa一级黄色片| 成人小视频在线看| 国内精品国产三级国产99| 亚洲中文字幕无码中文字| 亚洲一区二区中文字幕在线观看| 131美女爱做视频| 激情成人在线观看| 国产三级日本三级在线播放| 日韩精品一区二区在线视频| 三上悠亚av一区二区三区| 亚洲色成人www永久在线观看 | 91网址在线播放| 成人免费a级片| 91亚洲一区二区| 日韩精品你懂的| 国产成人亚洲精品无码h在线| 欧美性猛交xxxx乱大交91| 欧美综合在线观看视频| 国产原创popny丨九色| 小泽玛利亚av在线| 亚洲综合激情五月| 日本高清久久久| 亚洲免费看av| 久久久久久久片| 成年人免费大片| 日韩精品一区二区三区色欲av| avav在线播放| 国产成人永久免费视频| 成年人深夜视频| a级黄色片免费| 日韩一级性生活片| 奇米精品一区二区三区| 日本中文字幕网址| 成人免费在线小视频| 精品国产免费av| 农村妇女精品一二区| 国产男女无遮挡| 国产无套粉嫩白浆内谢的出处| 日韩a在线播放| www.xxx亚洲| 中文字幕第100页| 91精品视频国产| 成年人深夜视频| 波多野结衣家庭教师在线| 东京热加勒比无码少妇| 污污的网站18| 国产av不卡一区二区| 91嫩草国产丨精品入口麻豆| 日韩精品在线中文字幕| 国产精品一区二区免费在线观看| 免费欧美一级视频| 九九热99视频| 国产精品igao激情视频| 女人天堂av手机在线| 一女二男3p波多野结衣| 免费观看亚洲视频| 国产又黄又猛视频| 欧美一级免费在线观看| 国产一区二区网| 欧美第一页浮力影院| 国产成人永久免费视频| 午夜视频你懂的| 国产精品三级一区二区| 国产精品少妇在线视频| 亚洲美女自拍偷拍| 国产淫片免费看| 91精品视频国产| 九色在线视频观看| 免费看av软件| 免费看污污网站| av免费看网址| www亚洲国产| 精品久久久久久久免费人妻| 午夜啪啪福利视频| 亚洲一级片免费| 欧美日韩在线视频一区二区三区| 91网址在线观看精品| 免费黄色福利视频| 国产精品一线二线三线| 国产精品嫩草影院8vv8| 欧美日韩亚洲一| 青青青在线视频播放| 免费观看黄色的网站| 色呦色呦色精品| 黄色一级二级三级| 欧美牲交a欧美牲交aⅴ免费真| 大胆欧美熟妇xx| 老司机午夜网站| www.-级毛片线天内射视视| 天天色综合社区| 午夜激情av在线| 蜜桃免费在线视频| 91蝌蚪视频在线观看| 日本www高清视频| 日本精品www| 欧美 日韩 国产一区| 免费欧美一级视频|