AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

如何實(shí)現(xiàn)并部署自己的Npm解析服務(wù)

來源: 責(zé)編: 時(shí)間:2023-10-08 10:00:03 323觀看
導(dǎo)讀大家好,我卡頌。你是否好奇 —— codesandbox是如何在線運(yùn)行代碼的?要回答這個(gè)問題,我們先看看前端項(xiàng)目是如何在本地跑起來的。簡單來說分為3步:執(zhí)行npm install安裝依賴。使用打包工具(比如webpack)打包、編譯代碼(如果使用

3gz28資訊網(wǎng)——每日最新資訊28at.com

大家好,我卡頌。3gz28資訊網(wǎng)——每日最新資訊28at.com

你是否好奇 —— codesandbox是如何在線運(yùn)行代碼的?3gz28資訊網(wǎng)——每日最新資訊28at.com

要回答這個(gè)問題,我們先看看前端項(xiàng)目是如何在本地跑起來的。簡單來說分為3步:3gz28資訊網(wǎng)——每日最新資訊28at.com

  • 執(zhí)行npm install安裝依賴。
  • 使用打包工具(比如webpack)打包、編譯代碼(如果使用Vite會(huì)省去打包的步驟,但會(huì)執(zhí)行「預(yù)構(gòu)建」)。
  • 將步驟2的產(chǎn)物通過script標(biāo)簽注入頁面。

codesandbox能在線運(yùn)行代碼,顯然他也實(shí)現(xiàn)了上述步驟,具體來說,codesandbox內(nèi)置了2個(gè)在線服務(wù):3gz28資訊網(wǎng)——每日最新資訊28at.com

  • npm解析服務(wù) —— 用于實(shí)現(xiàn)上述步驟1。
  • 在線打包服務(wù) —— 用于實(shí)現(xiàn)上述步驟2、3。

本文我們來聊聊如何實(shí)現(xiàn)并部署自己的npm解析服務(wù)。3gz28資訊網(wǎng)——每日最新資訊28at.com

codesandbox簡要工作原理

下面是一個(gè)常見的codesandbox界面,包含兩部分:3gz28資訊網(wǎng)——每日最新資訊28at.com

  • 左邊的文件系統(tǒng)、代碼編輯器。
  • 右邊的效果預(yù)覽區(qū)域。

3gz28資訊網(wǎng)——每日最新資訊28at.com

其中「效果預(yù)覽區(qū)域」是一個(gè)iframe,對(duì)于上圖中的例子,iframe的地址是https://pjdp86.csb.app/。如果你打開這個(gè)地址,會(huì)發(fā)現(xiàn)他就是代碼的預(yù)覽效果:3gz28資訊網(wǎng)——每日最新資訊28at.com

3gz28資訊網(wǎng)——每日最新資訊28at.com

但這并不意味著codesandbox幫我們部署了項(xiàng)目。實(shí)際上,這個(gè)地址中前端代碼是在頁面打開后再編譯、打包的。3gz28資訊網(wǎng)——每日最新資訊28at.com

打開codesandbox項(xiàng)目時(shí)經(jīng)常看到的下述界面,就是前端編譯代碼的畫面:3gz28資訊網(wǎng)——每日最新資訊28at.com

3gz28資訊網(wǎng)——每日最新資訊28at.com

具體來說,當(dāng)我們打開一個(gè)codesandbox項(xiàng)目,iframe對(duì)應(yīng)地址初始化時(shí),會(huì)執(zhí)行如下操作:3gz28資訊網(wǎng)——每日最新資訊28at.com

  • 下載項(xiàng)目代碼(即編輯器中顯示的代碼)。
  • 根據(jù)項(xiàng)目package.json中指明的依賴,從「npm解析服務(wù)」下載項(xiàng)目依賴的代碼。
  • 下載在線打包器(一個(gè)mini webpack)、編譯器(babel)相關(guān)代碼。
  • 在線打包、編譯。
  • 運(yùn)行打包后的代碼。

正是有了在線打包、編譯的流程,codesandbox才能在線運(yùn)行:3gz28資訊網(wǎng)——每日最新資訊28at.com

  • React項(xiàng)目(需要編譯JSX)。
  • TS項(xiàng)目(需要編譯TS語法)。
  • Vue項(xiàng)目(需要編譯SFC文件)。

回到本文的主題 —— 「npm解析服務(wù)」。當(dāng)我們從項(xiàng)目package.json中獲取到依賴庫的名稱后,完全可以從CDN直接請(qǐng)求依賴庫對(duì)應(yīng)的代碼,為什么還需要一個(gè)獨(dú)立的「npm解析服務(wù)」呢?3gz28資訊網(wǎng)——每日最新資訊28at.com

npm解析服務(wù)的作用

之所以需要獨(dú)立的「npm解析服務(wù)」,主要是因?yàn)?—— npm包本身可能還依賴別的npm包,如果每次初始化iframe時(shí)依次下載:3gz28資訊網(wǎng)——每日最新資訊28at.com

  • package.json中指定的依賴
  • 依賴的依賴
  • 依賴的依賴的依賴
  • ...

那會(huì)極大拖慢項(xiàng)目初始化的時(shí)間。同時(shí),這樣做也可能會(huì)下載大量實(shí)際不會(huì)使用的代碼。3gz28資訊網(wǎng)——每日最新資訊28at.com

所以,需要一個(gè)「npm解析服務(wù)」,當(dāng)?shù)谝粋€(gè)用戶第一次請(qǐng)求某個(gè)庫時(shí),依次完成:3gz28資訊網(wǎng)——每日最新資訊28at.com

  • 從庫的入口代碼解析AST,分析其中的require語句,遞歸的解析這個(gè)庫的依賴。
  • 下載依賴代碼,將所有依賴的代碼匯總到一個(gè)JSON文件。
  • 將步驟2的JSON文件保存在對(duì)象存儲(chǔ)中。
  • 返回步驟2的JSON文件。

那么,后續(xù)所有用戶在請(qǐng)求這個(gè)庫時(shí),都能直接從對(duì)象存儲(chǔ)中直接獲取解析好的JSON文件,這能極大提高在線安裝依賴的速度。3gz28資訊網(wǎng)——每日最新資訊28at.com

比如,react@18.2.0經(jīng)由「npm解析服務(wù)」解析后會(huì)返回如下JSON:3gz28資訊網(wǎng)——每日最新資訊28at.com

{  "contents": {    "/node_modules/react/index.js": {      // 庫的代碼      "content": "...省略",      "isModule": false,      // 依賴的其他模塊      "requires": [        "./cjs/react.production.min.js",        "./cjs/react.development.js"      ]    },    "/node_modules/react/cjs/react.production.min.js": {/*省略*/},    "/node_modules/react/cjs/react.development.js": {/*省略*/},    "/node_modules/js-tokens/package.json": {/*省略*/},    "/node_modules/loose-envify/package.json": {/*省略*/},    "/node_modules/react/package.json": {/*省略*/}  },  // 庫的版本信息  "dependency": {    "name": "react",    "version": "18.2.0"  },  "peerDependencies": {},  // 依賴的依賴  "dependencyDependencies": {    "loose-envify": {/*省略*/},    "js-tokens": {/*省略*/}  },  "dependencyAliases": {}}

上述JSON中,入口代碼在/node_modules/react/index.js,通過遞歸分析他的AST,發(fā)現(xiàn)他依賴了:3gz28資訊網(wǎng)——每日最新資訊28at.com

  • "./cjs/react.production.min.js"
  • "./cjs/react.development.js"

于是,這2個(gè)文件對(duì)應(yīng)代碼也包含在JSON中。3gz28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)下一個(gè)用戶加載的項(xiàng)目依賴react@18.2.0,就能直接從對(duì)象存儲(chǔ)中獲取上述JSON。3gz28資訊網(wǎng)——每日最新資訊28at.com

npm解析服務(wù)的實(shí)現(xiàn)

codesandbox在線打包相關(guān)的代碼都是開源的,比如:3gz28資訊網(wǎng)——每日最新資訊28at.com

  • 編輯器的部分對(duì)應(yīng)sandpack-react[1]
  • npm解析服務(wù)對(duì)應(yīng)dependency-packager[2]
  • 在線打包服務(wù)對(duì)應(yīng)codesandbox-client[3]

所以,我們可以基于dependency-packager部署自己的「npm解析服務(wù)」。3gz28資訊網(wǎng)——每日最新資訊28at.com

dependency-packager是一個(gè)serverless服務(wù),通過AWS Lambda部署。由于采用的是開源的serverless框架,所以我們可以很方便的將項(xiàng)目中AWS Lambda的部分替換成其他serverless服務(wù)商(比如阿里云函數(shù)計(jì)算)。3gz28資訊網(wǎng)——每日最新資訊28at.com

整個(gè)dependency-packager包含兩個(gè)serverless函數(shù):3gz28資訊網(wǎng)——每日最新資訊28at.com

  • api:實(shí)際對(duì)外提供的服務(wù)
  • packager:根據(jù)包名和版本號(hào)生成JSON的服務(wù)

他們的關(guān)系如下:3gz28資訊網(wǎng)——每日最新資訊28at.com

3gz28資訊網(wǎng)——每日最新資訊28at.com

其中,生成的JSON保存在AWS S3中。同樣,這里也可以替換成其他云服務(wù)廠家的存儲(chǔ)方案。3gz28資訊網(wǎng)——每日最新資訊28at.com

packager服務(wù)的工作流程如下:3gz28資訊網(wǎng)——每日最新資訊28at.com

3gz28資訊網(wǎng)——每日最新資訊28at.com

其中,「驗(yàn)證依賴的入口文件」會(huì)嘗試下面這些文件后綴:3gz28資訊網(wǎng)——每日最新資訊28at.com

const found = [  path.join(basedir, pkg.module),  path.join(basedir, pkg.module + ".js"),  path.join(basedir, pkg.module + ".cjs"),  path.join(basedir, pkg.module + ".mjs"),  path.join(basedir, pkg.module, "index.js"),  path.join(basedir, pkg.module, "index.mjs"),].find((p) => {  try {    const l = fs.statSync(p);    return l.isFile();  } catch (e) {    return false;  }});

驗(yàn)證完成后,會(huì)以package.json中的module或main字段作為入口文件,將代碼轉(zhuǎn)換為AST,分析AST中的require語句(cjs語法中引入模塊的語法),找到依賴的模塊。最終將這些模塊匯總在JSON中。3gz28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

codesandbox在線打包相關(guān)的代碼都是開源的,包括:3gz28資訊網(wǎng)——每日最新資訊28at.com

  • 編輯器
  • npm解析服務(wù)
  • 在線打包服務(wù)

其中,npm解析服務(wù)作為一個(gè)serverless服務(wù)包括兩部分:3gz28資訊網(wǎng)——每日最新資訊28at.com

  • api服務(wù)
  • packager服務(wù)

packager服務(wù)代碼量不多,如果想嘗試部署自己的serverless服務(wù),是個(gè)不錯(cuò)的選擇。3gz28資訊網(wǎng)——每日最新資訊28at.com

參考資料

[1]sandpack-react:https://github.com/codesandbox/sandpack/tree/main/sandpack-react。3gz28資訊網(wǎng)——每日最新資訊28at.com

[2]dependency-packager:https://github.com/codesandbox/dependency-packager。3gz28資訊網(wǎng)——每日最新資訊28at.com

[3]codesandbox-client:https://github.com/codesandbox/codesandbox-client。3gz28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-12437-0.html如何實(shí)現(xiàn)并部署自己的Npm解析服務(wù)

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 一個(gè) println 竟然比 volatile 還好使?

下一篇: SQL中的各種連接的區(qū)別總結(jié)

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Redmi Pad評(píng)測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍(lán)牙耳機(jī)到筆記本電腦,紅米不知不覺之間也已經(jīng)形成了自己頗有競爭力的產(chǎn)品體系,在中端和次旗艦市場上甚至要比小米新機(jī)的表現(xiàn)來得更好,正所謂“大丈夫生居
  • 5月安卓手機(jī)好評(píng)榜:魅族20 Pro奪冠

    性能榜和性價(jià)比榜之后,我們來看最后的安卓手機(jī)好評(píng)榜,數(shù)據(jù)來源安兔兔評(píng)測,收集時(shí)間2023年5月1日至5月31日,僅限國內(nèi)市場。第一名:魅族20 Pro好評(píng)率:97.50%不得不感慨魅族老品牌還
  • 0糖0卡0脂 旭日森林仙草烏龍茶優(yōu)惠:15瓶到手29元

    旭日森林無糖仙草烏龍茶510ml*15瓶平時(shí)要賣為79.9元,今日下單領(lǐng)取50元優(yōu)惠券,到手價(jià)為29.9元。產(chǎn)品規(guī)格:0糖0卡0脂,添加草本仙草汁,清涼爽口,富含茶多酚,保留
  • 從 Pulsar Client 的原理到它的監(jiān)控面板

    背景前段時(shí)間業(yè)務(wù)團(tuán)隊(duì)偶爾會(huì)碰到一些 Pulsar 使用的問題,比如消息阻塞不消費(fèi)了、生產(chǎn)者消息發(fā)送緩慢等各種問題。雖然我們有個(gè)監(jiān)控頁面可以根據(jù) topic 維度查看他的發(fā)送狀態(tài),
  • Python異步IO編程的進(jìn)程/線程通信實(shí)現(xiàn)

    這篇文章再講3種方式,同時(shí)講4中進(jìn)程間通信的方式一、 Python 中線程間通信的實(shí)現(xiàn)方式共享變量共享變量是多個(gè)線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準(zhǔn)追劇女孩們的古偶劇集,2021年有優(yōu)酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • iQOO 11S評(píng)測:行業(yè)唯一的200W標(biāo)準(zhǔn)版旗艦

    【Techweb評(píng)測】去年底,iQOO推出了“電競旗艦”iQOO 11系列,作為一款性能強(qiáng)機(jī),該機(jī)不僅全球首發(fā)2K 144Hz E6全感屏,搭載了第二代驍龍8平臺(tái)及144Hz電競
  • iQOO Neo8 Pro即將開售:到手價(jià)3099元起 安卓性能最強(qiáng)旗艦

    5月23日,iQOO如期舉行了新品發(fā)布會(huì),全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個(gè)版本,其中標(biāo)準(zhǔn)版搭載高通驍龍8+,而Pro版更
  • 北京:科技教育體驗(yàn)基地開始登記

      北京“科技館之城”科技教育體驗(yàn)基地登記和認(rèn)證工作日前啟動(dòng)。首批北京科技教育體驗(yàn)基地?cái)M于2023年全國科普日期間掛牌,后續(xù)還將開展常態(tài)化登記。  北京科技教育體驗(yàn)基
Top