日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

如何實現并部署自己的Npm解析服務

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

iXY28資訊網——每日最新資訊28at.com

大家好,我卡頌。iXY28資訊網——每日最新資訊28at.com

你是否好奇 —— codesandbox是如何在線運行代碼的?iXY28資訊網——每日最新資訊28at.com

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

  • 執行npm install安裝依賴。
  • 使用打包工具(比如webpack)打包、編譯代碼(如果使用Vite會省去打包的步驟,但會執行「預構建」)。
  • 將步驟2的產物通過script標簽注入頁面。

codesandbox能在線運行代碼,顯然他也實現了上述步驟,具體來說,codesandbox內置了2個在線服務:iXY28資訊網——每日最新資訊28at.com

  • npm解析服務 —— 用于實現上述步驟1。
  • 在線打包服務 —— 用于實現上述步驟2、3。

本文我們來聊聊如何實現并部署自己的npm解析服務。iXY28資訊網——每日最新資訊28at.com

codesandbox簡要工作原理

下面是一個常見的codesandbox界面,包含兩部分:iXY28資訊網——每日最新資訊28at.com

  • 左邊的文件系統、代碼編輯器。
  • 右邊的效果預覽區域。

iXY28資訊網——每日最新資訊28at.com

其中「效果預覽區域」是一個iframe,對于上圖中的例子,iframe的地址是https://pjdp86.csb.app/。如果你打開這個地址,會發現他就是代碼的預覽效果:iXY28資訊網——每日最新資訊28at.com

iXY28資訊網——每日最新資訊28at.com

但這并不意味著codesandbox幫我們部署了項目。實際上,這個地址中前端代碼是在頁面打開后再編譯、打包的。iXY28資訊網——每日最新資訊28at.com

打開codesandbox項目時經常看到的下述界面,就是前端編譯代碼的畫面:iXY28資訊網——每日最新資訊28at.com

iXY28資訊網——每日最新資訊28at.com

具體來說,當我們打開一個codesandbox項目,iframe對應地址初始化時,會執行如下操作:iXY28資訊網——每日最新資訊28at.com

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

正是有了在線打包、編譯的流程,codesandbox才能在線運行:iXY28資訊網——每日最新資訊28at.com

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

回到本文的主題 —— 「npm解析服務」。當我們從項目package.json中獲取到依賴庫的名稱后,完全可以從CDN直接請求依賴庫對應的代碼,為什么還需要一個獨立的「npm解析服務」呢?iXY28資訊網——每日最新資訊28at.com

npm解析服務的作用

之所以需要獨立的「npm解析服務」,主要是因為 —— npm包本身可能還依賴別的npm包,如果每次初始化iframe時依次下載:iXY28資訊網——每日最新資訊28at.com

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

那會極大拖慢項目初始化的時間。同時,這樣做也可能會下載大量實際不會使用的代碼。iXY28資訊網——每日最新資訊28at.com

所以,需要一個「npm解析服務」,當第一個用戶第一次請求某個庫時,依次完成:iXY28資訊網——每日最新資訊28at.com

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

那么,后續所有用戶在請求這個庫時,都能直接從對象存儲中直接獲取解析好的JSON文件,這能極大提高在線安裝依賴的速度。iXY28資訊網——每日最新資訊28at.com

比如,react@18.2.0經由「npm解析服務」解析后會返回如下JSON:iXY28資訊網——每日最新資訊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,發現他依賴了:iXY28資訊網——每日最新資訊28at.com

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

于是,這2個文件對應代碼也包含在JSON中。iXY28資訊網——每日最新資訊28at.com

當下一個用戶加載的項目依賴react@18.2.0,就能直接從對象存儲中獲取上述JSON。iXY28資訊網——每日最新資訊28at.com

npm解析服務的實現

codesandbox在線打包相關的代碼都是開源的,比如:iXY28資訊網——每日最新資訊28at.com

  • 編輯器的部分對應sandpack-react[1]
  • npm解析服務對應dependency-packager[2]
  • 在線打包服務對應codesandbox-client[3]

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

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

整個dependency-packager包含兩個serverless函數:iXY28資訊網——每日最新資訊28at.com

  • api:實際對外提供的服務
  • packager:根據包名和版本號生成JSON的服務

他們的關系如下:iXY28資訊網——每日最新資訊28at.com

iXY28資訊網——每日最新資訊28at.com

其中,生成的JSON保存在AWS S3中。同樣,這里也可以替換成其他云服務廠家的存儲方案。iXY28資訊網——每日最新資訊28at.com

packager服務的工作流程如下:iXY28資訊網——每日最新資訊28at.com

iXY28資訊網——每日最新資訊28at.com

其中,「驗證依賴的入口文件」會嘗試下面這些文件后綴:iXY28資訊網——每日最新資訊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;  }});

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

總結

codesandbox在線打包相關的代碼都是開源的,包括:iXY28資訊網——每日最新資訊28at.com

  • 編輯器
  • npm解析服務
  • 在線打包服務

其中,npm解析服務作為一個serverless服務包括兩部分:iXY28資訊網——每日最新資訊28at.com

  • api服務
  • packager服務

packager服務代碼量不多,如果想嘗試部署自己的serverless服務,是個不錯的選擇。iXY28資訊網——每日最新資訊28at.com

參考資料

[1]sandpack-react:https://github.com/codesandbox/sandpack/tree/main/sandpack-react。iXY28資訊網——每日最新資訊28at.com

[2]dependency-packager:https://github.com/codesandbox/dependency-packager。iXY28資訊網——每日最新資訊28at.com

[3]codesandbox-client:https://github.com/codesandbox/codesandbox-client。iXY28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-12437-0.html如何實現并部署自己的Npm解析服務

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一個 println 竟然比 volatile 還好使?

下一篇: SQL中的各種連接的區別總結

標簽:
  • 熱門焦點
  • 官方承諾:K60至尊版將會首批升級MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會搭載天璣9200+處理器和獨顯芯片X7的同時,Redmi給出了官方承諾,K60至尊重大更新首批升級,會首批推送MIUI 15。也就是說雖然
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 如何使用JavaScript創建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經瀏覽過購物網站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區域,以便瀏覽。結合這個小小的重要功能可以大大改善您網站的用戶體驗
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術的發展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 一條抖音4億人圍觀 ! 這家MCN比無憂傳媒還野

    作者:Hiu 來源:互聯網品牌官01 擦邊少女空降熱搜,幕后推手曝光被網友譽為“純欲天花板”的女網紅井川里予,近期因為一組哥特風照片登上熱搜,引發了一場互聯網世界關于
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的“征求意見版”:1、取消P序列
  • iQOO 11S或7月上市:搭載“雞血版”驍龍8Gen2 史上最強5G Soc

    去年底,iQOO推出了“電競旗艦”iQOO 11系列,作為一款性能強機,iQOO 11不僅全球首發2K 144Hz E6全感屏,搭載了第二代驍龍8平臺及144Hz電競屏,同時在快充
  • 2021中國國際消費電子博覽會與青島國際軟件融合創新博覽會新聞發布會隆重舉行

    9月18日,2021中國國際消費電子博覽會與青島國際軟件融合創新博覽會新聞發布會在青島國際新聞中心隆重舉行。發布會上青島市政府領導聯袂出席,對本次雙展會情
Top 主站蜘蛛池模板: 绍兴县| 辽中县| 鄂州市| 沽源县| 德令哈市| 资溪县| 红桥区| 博罗县| 竹溪县| 三河市| 柏乡县| 卫辉市| 石渠县| 海城市| 双辽市| 深圳市| 自贡市| 灵武市| 吐鲁番市| 政和县| 松原市| 裕民县| 荥经县| 澄迈县| 凉城县| 延边| 巴彦淖尔市| 顺平县| 永宁县| 肇州县| 从江县| 瓦房店市| 南涧| 金寨县| 普兰店市| 泸西县| 长宁区| 南宫市| 苗栗市| 松潘县| 南皮县|