精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

十分鐘了解Vite如何支持React

系統(tǒng) 瀏覽器
vite 是基于瀏覽器支持 ESM 模塊,用以解決大型應(yīng)用本地開發(fā)環(huán)境打包、熱更新時間久的一套解決方案,目前已支持vue、react、Svelte、Solid等主流框架,相信不少同學已經(jīng)開始使用 vite,并體驗到“飛一般”的體驗啦,下面我們來看看vite是如何支持react的吧!

[[413981]]

本文轉(zhuǎn)載自微信公眾號「微醫(yī)大前端技術(shù)」,作者丁楠 。轉(zhuǎn)載本文請聯(lián)系微醫(yī)大前端技術(shù)公眾號。

前言

vite 是基于瀏覽器支持 ESM 模塊,用以解決大型應(yīng)用本地開發(fā)環(huán)境打包、熱更新時間久的一套解決方案,目前已支持vue、react、Svelte、Solid等主流框架,相信不少同學已經(jīng)開始使用 vite,并體驗到“飛一般”的體驗啦,下面我們來看看vite是如何支持react的吧

一、啟動

首先從 github 上拉下 vite 的源碼,做好準備工作

  1. git clone https://github.com/vitejs/vite.git 
  2. cd vite 
  3. yarn 
  4. cd packages/vite 
  5. yarn build 
  6. yarn link 

用腳手架搭建好 vite-react 項目

  1. yarn create @vitejs/app my-react-app --template react 
  2. yarn link vite 
  3. yarn dev 

加上 node 瀏覽器端調(diào)試 script

  1. "debug""node --inspect-brk node_modules/vite/dist/node/cli.js" 

啟動服務(wù),可以看到

index.html 里比源碼多了一塊vite/clinet、@react/refresh的代碼,另外 script 的 type 都是module類型,我們來根據(jù)源碼分析下 vite 是如何做了這一層轉(zhuǎn)化。

二、中間件(middleware)

vite 2.x 之后放棄了原先 1.x 的 koa 模型,采用 node 原生 http 模塊+connect 的中間件模型,在請求 localhost 過程中首先會被connect-history-api-fallback重定向到 index.html,隨后會進入到下一個中間件indexHtmlMiddleware,這里實際是會執(zhí)行createDevHtmlTransformFn函數(shù)

  1. // packages\vite\src\node\server\middlewares\indexHtml.ts 
  2. export function createDevHtmlTransformFn( 
  3.   server: ViteDevServer 
  4. ): (url: string, html: string, originalUrl: string) => Promise<string> { 
  5.   const [preHooks, postHooks] = resolveHtmlTransforms(server.config.plugins) 
  6.  
  7.   return (url: string, html: string, originalUrl: string): Promise<string> => { 
  8.     return applyHtmlTransforms(html, [...preHooks, devHtmlHook, ...postHooks], { 
  9.       path: url, 
  10.       filename: getHtmlFilename(url, server), 
  11.       server, 
  12.       originalUrl 
  13.     }) 
  14.   } 

這里會導出兩個 hook,作用分別是

  • devHtmlHook, 將@/vite/client.js 插入頭部
  • react-refresh, 將一堆 react-refresh 的代碼插入頭部

這里就解釋了截圖中的兩端 script 從哪里來的,@/vite/client.js 簡單來講就是支持vite-hmr熱更新的一些代碼,而@react-refresh是 vite 支持 react 的熱更新插件代碼

三、轉(zhuǎn)換(transform)

從入口文件(index.html)發(fā)起的資源請求都會進入transformMiddleware

  1. // packages\vite\src\node\server\index.ts  文件轉(zhuǎn)換的核心 
  2.   middlewares.use(transformMiddleware(server)) 
  1. // packages\vite\src\node\server\transformRequest.ts  
  2. export async function transformRequest( 
  3.   url 
  4.   { config, pluginContainer, moduleGraph, watcher } 
  5.   options 
  6. ) { 
  7.  
  8.   ... 
  9.   const loadResult = await pluginContainer.load(id, ssr) 
  10.    
  11.   code = loadResult.code 
  12.   map = loadResult.map 
  13.  
  14.   // 代碼轉(zhuǎn)換,調(diào)用一系列 plugin 做代碼轉(zhuǎn)換 
  15.   const transformStart = isDebug ? Date.now() : 0 
  16.   const transformResult = await pluginContainer.transform(code, id, map, ssr) 
  17.    
  18.   code = transformResult.code! 
  19.   map = transformResult.map 
  20.  
  21.   return (mod.transformResult = { 
  22.     code, 
  23.     map, 
  24.     etag: getEtag(code, { weak: true }) 
  25.   } as TransformResult) 
  26.    

而 pluginContainer 的 transform 函數(shù)是會調(diào)用初始化時 vite 內(nèi)置的一系列 plugin 對源碼進行轉(zhuǎn)換,以src/main.jsx文件為例,首先源碼

  1. import React from 'react' 
  2. import ReactDOM from 'react-dom' 
  3. import './index.css' 
  4. import App from './App' 
  5.  
  6. ReactDOM.render( 
  7.   <React.StrictMode> 
  8.     <App /> 
  9.   </React.StrictMode>, 
  10.   document.getElementById('root'

會被標識名為 vite:esbuild 的 plugin 利用 esbuild 的內(nèi)置 apitransform,將jsx語法轉(zhuǎn)譯成React.createElement,算是替代了babel的一部分作用

  1. import React from "react"
  2. import ReactDOM from "react-dom"
  3. import "./index.css"
  4. import App from "./App"
  5. ReactDOM.render(/* @__PURE__ */ React.createElement(React.StrictMode, null, /* @__PURE__ */ React.createElement(App, null)), document.getElementById("root")); 

接著會進入標識名為 vite:import-analysis 的 plugin

原生 ES 引入不支持裸模塊導入,Vite 將在服務(wù)的所有源文件中檢測此類裸模塊導入,預構(gòu)建和重寫導入合法 url

  1. import { someMethod } from 'my-dep' 

由于瀏覽器不支持直接的裸模塊導入,所以需要將模塊地址改寫成真實的資源文件地址,import-analysis使用了es-module-lexer這個包,去動態(tài)的分析當前代碼中的import語法涉及的依賴,比如上面的react、react-dom,解析成依賴文件所在的本地地址(/node_modules/.vite 文件夾),然后再調(diào)用內(nèi)置的transformCjsImport函數(shù),轉(zhuǎn)換 Commonjs 類型包的 import 語句,比如

  1. import React from "react" 

將會被轉(zhuǎn)譯成

  1. import __vite__cjsImport0_react from "/node_modules/.vite/react.js?v=21227a2f"; const React = __vite__cjsImport0_react.__esModule ? __vite__cjsImport0_react.default : __vite__cjsImport0_react 

總感覺這部分在 webpack 中也有類似的實現(xiàn),感興趣的朋友也可以找找看,同時多啰嗦幾句,vue3 也是一樣的轉(zhuǎn)換邏輯,只是針對單文件需要@vitejs/plugin-vue 的支持

后續(xù)的加載邏輯形式也是類似的,就不贅述了。

四、@vitejs/plugin-react-refresh

最后再講下這個包,其實 vite 對 react 的支持主要還是用 esbuild 一部分來替代了原來@babel/preset-react的作用,另外一塊就是封裝了官方的 react-refresh,來支持 react 的熱更新,下面,我們來看下它做了什么。

轉(zhuǎn)碼

實際上所有的文件資源都會被@react-refresh 處理一遍,所有 jsx 文件會被@react-refresh通過@babel/core轉(zhuǎn)譯一遍,不過只有真正需要熱更新的 react 組件才會被輸出

  1. const result = transformSync(code, { 
  2.     babelrc: false
  3.     configFile: false
  4.     filename: id, 
  5.     parserOpts: { 
  6.       sourceType: 'module'
  7.       allowAwaitOutsideFunction: true
  8.       plugins: parserPlugins 
  9.     }, 
  10.     generatorOpts: { 
  11.       decoratorsBeforeExport: true 
  12.     }, 
  13.     plugins: [ 
  14.       require('@babel/plugin-transform-react-jsx-self'), 
  15.       require('@babel/plugin-transform-react-jsx-source'), 
  16.       [require('react-refresh/babel'), { skipEnvCheck: true }] 
  17.     ], 
  18.     ast: !isReasonReact, 
  19.     sourceMaps: true
  20.     sourceFileName: id 
  21.   }) 
  22.  
  23.   if (!/\$RefreshReg\$\(/.test(result.code)) { 
  24.     // 這里會用正則去分析,代碼塊是否是個需要熱更新支持的 react component,否則就返回源碼 
  25.     return code 
  26.   } 

提供額外的運行時代碼

  1. // index.html 被插入這一串初始化代碼 
  2. import RefreshRuntime from "/@react-refresh" 
  3. RefreshRuntime.injectIntoGlobalHook(window) 
  4. window.$RefreshReg$ = () => {} 
  5. window.$RefreshSig$ = () => (type) => type 
  6. window.__vite_plugin_react_preamble_installed__ = true 
  7. import { createHotContext as __vite__createHotContext } from "/@vite/client"
  8. import.meta.hot = __vite__createHotContext("/src/App.jsx"); 
  9. import RefreshRuntime from "/@react-refresh"
  10. if (import.meta.hot) { 
  11.   window.$RefreshReg$ = (type, id) => { 
  12.     RefreshRuntime.register(type, "D:/xxx/vite-react/src/App.jsx " + id); 
  13.   }; 
  14.   window.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform; 
  15.  
  16. // 這里插入組件轉(zhuǎn)換后的代碼 
  17. if (import.meta.hot) { 
  18.   import.meta.hot.accept(); 
  19.   if (!window.__vite_plugin_react_timeout) { 
  20.     window.__vite_plugin_react_timeout = setTimeout(() => { 
  21.       window.__vite_plugin_react_timeout = 0; 
  22.       RefreshRuntime.performReactRefresh(); 
  23.     }, 30); 
  24.   } 

importAnalysis會在 jsx 文件上動態(tài)插入createHotContext的代碼,createHotContext是vite提供的機制,用于緩存 context。

RefreshRuntime.register是react-refresh提供的 api,用于注冊組件,第二個參數(shù)是組件的文件路徑加上 id,用于識別哪個組件需要被熱替換。

RefreshRuntime.performReactRefresh觸發(fā) react 渲染。

五、總結(jié)

 

我們來個圖歸納下 vite 在支持 react 上做了哪些事吧

其實在啟動服務(wù)時,vite 會從入口文件起掃描一遍所有的依賴并進行預構(gòu)建,并生成模塊依賴 moduleGraph,類似于樹狀的形式,方便管理緩存,由于本文主要是對 react 方面的解讀,就不一一深入了,后續(xù)也會有其他同學更深入的解讀,感興趣的同學歡迎繼續(xù)跟蹤,順便路過的大哥、小姐姐們來個三連!

 

責任編輯:武曉燕 來源: 微醫(yī)大前端技術(shù)
相關(guān)推薦

2024-06-19 09:58:29

2024-05-13 09:28:43

Flink SQL大數(shù)據(jù)

2023-03-13 07:52:13

2023-07-15 18:26:51

LinuxABI

2024-11-07 16:09:53

2015-11-06 11:03:36

2009-11-03 11:01:45

VB.NET遠程事件

2024-12-13 15:29:57

SpringSpringBeanJava

2025-03-18 12:20:00

編程

2024-10-08 11:12:12

2020-12-17 06:48:21

SQLkafkaMySQL

2019-04-01 14:59:56

負載均衡服務(wù)器網(wǎng)絡(luò)

2024-10-08 13:12:04

2009-10-09 14:45:29

VB程序

2024-10-06 12:50:25

2020-12-09 16:41:22

LinuxIT開發(fā)

2021-09-07 09:40:20

Spark大數(shù)據(jù)引擎

2022-06-16 07:31:41

Web組件封裝HTML 標簽

2023-04-12 11:18:51

甘特圖前端

2015-09-06 09:22:24

框架搭建快速高效app
點贊
收藏

51CTO技術(shù)棧公眾號

视频一区中文| 国精产品一区一区三区四川| 高清成人免费视频| 91国内精品久久| 日本爱爱爱视频| 国产欧美日韩电影| 欧美性高跟鞋xxxxhd| 亚洲欧美精品在线观看| 成人毛片在线精品国产| 日本欧美久久久久免费播放网| 久久久999精品免费| 99re这里只有| 伊人久久大香伊蕉在人线观看热v| 亚洲综合在线观看视频| 婷婷久久伊人| 欧美 日韩 综合| 蜜桃91丨九色丨蝌蚪91桃色| 欧美黑人性视频| 伊人影院综合网| jizz久久精品永久免费| 欧美午夜视频网站| 日本阿v视频在线观看| eeuss影院www在线播放| av一二三不卡影片| 亚洲xxxxx性| 9i精品福利一区二区三区| 亚洲国产精品综合久久久| 亚洲日韩欧美视频一区| 成人区人妻精品一区二| 91丨精品丨国产| 在线一区二区观看| 五月丁香综合缴情六月小说| dj大片免费在线观看| 久久久精品天堂| 国产伦精品一区二区三区高清| 国产又粗又猛视频| 秋霞av亚洲一区二区三| 欧美亚洲另类视频| 久久精品国产av一区二区三区| 久久影院一区| 在线观看成人黄色| a级在线观看视频| 99久热这里只有精品视频免费观看| 欧美亚洲国产bt| 麻豆av免费在线| 羞羞视频在线观看不卡| 中文字幕日本乱码精品影院| 天堂社区 天堂综合网 天堂资源最新版 | 日韩黄色大片网站| 亚洲人成网站色ww在线| 国产麻豆xxxvideo实拍| 卡通动漫精品一区二区三区| 日韩欧美精品在线| 午夜诱惑痒痒网| 四虎国产精品免费久久| 欧美日韩免费不卡视频一区二区三区 | 欧美老人xxxx18| 亚洲综合av在线播放| 精品国产欧美日韩一区二区三区| 欧美视频免费在线观看| 欧美视频第一区| 午夜无码国产理论在线| 日本高清无吗v一区| 国产av人人夜夜澡人人爽| 成人看片网页| 欧美日韩精品欧美日韩精品 | 国产91欧美| 欧美日韩一级片在线观看| 宅男噜噜噜66国产免费观看| 午夜av成人| 欧美日韩在线直播| 亚洲综合激情视频| 日韩精品中文字幕吗一区二区| 日韩欧美色综合网站| 久久久久无码国产精品一区李宗瑞| 这里视频有精品| 亚洲激情免费观看| 少妇大叫太粗太大爽一区二区| 欧美激情在线精品一区二区三区| 亚洲天堂av女优| 国产精品久久久视频| 99成人超碰| 欧美激情综合亚洲一二区| 日韩无码精品一区二区三区| 久久激情中文| 国产精品手机播放| 国产av一区二区三区| www.欧美日韩| 色一情一乱一伦一区二区三区丨| 男人天堂手机在线| 亚洲线精品一区二区三区八戒| 欧美日韩一道本| 97人人做人人爽香蕉精品| 欧美一级片在线观看| 中文字幕一区二区人妻电影丶| 国产成人久久| 欧美成人剧情片在线观看| 天堂网一区二区三区| 免费观看在线色综合| 97久久夜色精品国产九色 | 91麻豆精品激情在线观看最新| 国产婷婷色综合av蜜臀av| 伊人久久久久久久久久久久久久| 尤物在线精品| 国产日韩在线免费| 手机看片福利在线观看| 国产精品久99| 精品国产一区三区| 韩国一区二区三区视频| 亚洲毛片在线观看.| 国产老头老太做爰视频| 久久综合影视| 成人免费在线看片| 欧美一区二区三区在线观看免费| 五月天亚洲婷婷| 久久久久xxxx| 国产伦精品一区二区三区视频| 欧美成人免费在线视频| 伊人久久中文字幕| 99久久婷婷国产综合精品| 综合视频免费看| 美女日韩欧美| 精品国产91洋老外米糕| 国产老头老太做爰视频| 天堂精品中文字幕在线| 精品91免费| 日本高清成人vr专区| 欧美色偷偷大香| 亚洲天堂视频一区| 99热精品在线观看| 97人人模人人爽人人少妇 | 97av在线影院| 国产18精品乱码免费看| 亚洲欧洲精品天堂一级| av无码精品一区二区三区| 欧美aaaaaaaa牛牛影院| 久久久久中文字幕| www.精品久久| 亚洲男人天堂av| 性欧美在线视频| 日韩午夜电影网| 国产精品免费在线免费| 免费福利在线视频| 日韩欧美一区二区三区| 亚洲黄色免费在线观看| 99精品国产一区二区青青牛奶| 99精品国产一区二区| 2024短剧网剧在线观看| 欧美一二区视频| 免费在线观看一级片| 国产一区二区三区日韩| 九一免费在线观看| 日韩中文字幕| 欧美日韩ab片| 人妻精品无码一区二区| 午夜激情一区二区| 亚洲欧美在线不卡| 一区二区黄色| 欧美日韩日本网| 亚洲成人一区在线观看| 日韩在线中文视频| 国产精品乱码久久久| 亚洲精品视频自拍| 国产大尺度视频| 中文日韩欧美| 日产国产精品精品a∨| 欧美影视资讯| 久久福利视频网| 亚洲第一页综合| 亚洲成人你懂的| 800av在线播放| 久色成人在线| 亚洲一区二区三区精品动漫| 电影一区二区三区久久免费观看| 欧美大片第1页| 亚洲 欧美 精品| 欧美日韩视频不卡| 免费在线一区二区三区| av亚洲精华国产精华精| 国产精品无码av无码| 欧美aaaa视频| 国产传媒一区二区三区| 综合另类专区| 久久精品这里热有精品| 国精产品一品二品国精品69xx| 色网站国产精品| 我要看黄色一级片| 99re成人在线| 男生操女生视频在线观看 | 成人动漫免费在线观看| 91夜夜揉人人捏人人添红杏| ririsao久久精品一区| 亚洲欧美在线免费| 国产免费黄色大片| 欧美性xxxxxxx| 北条麻妃在线观看视频| av一区二区不卡| 在线观看免费av网址| 夜夜精品视频| 热这里只有精品| 亚洲婷婷丁香| 亚洲va电影大全| 欧美黑人一区| 久久久女人电视剧免费播放下载| 国产区视频在线| 精品久久人人做人人爽| 波多野结衣黄色网址| 一个色在线综合| 国产三级aaa| 91麻豆国产香蕉久久精品| 国产精品久久久久久9999| 亚洲综合99| 日韩在线视频在线| 天天综合精品| 日韩精品资源| 日韩欧美美女在线观看| http;//www.99re视频| 国产精品亚洲一区二区三区在线观看| 欧美激情videos| 黄色网页网址在线免费| 亚洲新中文字幕| 三级小视频在线观看| 欧美日韩不卡一区二区| 日韩精品一区不卡| 欧美日韩国产在线看| 国产亚洲第一页| 亚洲欧美偷拍三级| 国产成人在线网址| 国产欧美视频一区二区三区| 亚洲国产精品自拍视频| 国产成人av一区二区三区在线 | 国产深夜男女无套内射| 欧美不卡高清| 免费成人深夜夜行网站视频| 郴州新闻综合频道在线直播| 久久精品日产第一区二区三区| 亚洲第一二区| 91青青草免费在线看| 日韩有码欧美| 国产女同一区二区| 色噜噜成人av在线| 国产欧美日韩中文字幕在线| 全亚洲第一av番号网站| 日韩美女在线观看| 忘忧草在线www成人影院| 欧美壮男野外gaytube| 美女扒开腿让男人桶爽久久软| 午夜精品一区二区三区视频免费看| 午夜伦理在线视频| 欧美成年人视频网站欧美| 国产成人午夜| 欧美成人小视频| 在线三级电影| 久久久久久久电影一区| 91福利区在线观看| 欧美最顶级丰满的aⅴ艳星| 午夜裸体女人视频网站在线观看| 2019日本中文字幕| 欧美日韩大片| 国产精品久久久久一区二区| 成人av色网站| 91免费看国产| 中文字幕日韩在线| 国产视频99| 欧美男gay| 日本黄色播放器| 欧美日韩视频| 欧美丰满熟妇bbbbbb百度| 久久亚洲精品伦理| 成人综合久久网| 国产精品99久久不卡二区| 女性生殖扒开酷刑vk| 91丝袜美腿高跟国产极品老师| 91精品人妻一区二区| 国产色综合久久| 韩国一级黄色录像| 亚洲国产精品精华液网站| 在线天堂中文字幕| 欧美色手机在线观看| 性生交生活影碟片| 国产婷婷色综合av蜜臀av| av午夜在线| 欧美成人一区二区三区电影| 97天天综合网| 国产日本欧美在线观看| www.成人网| 日韩精品在在线一区二区中文| 在线观看免费一区二区| 日本少妇高潮喷水视频| 六月丁香婷婷色狠狠久久| zjzjzjzjzj亚洲女人| 国产日产欧美一区| 欧美日韩成人免费观看| 欧美天堂在线观看| a天堂在线视频| 亚洲人成网站999久久久综合| 国产激情在线| 清纯唯美亚洲综合| 日韩在线视频一区二区三区| 欧美日韩在线精品| 欧美体内she精视频在线观看| 动漫av免费观看| 成人性生交大片免费看视频在线| 日本一卡二卡在线播放| 亚洲成在线观看| 在线观看国产黄| 亚洲国产欧美精品| 二区三区在线观看| 国产精品1234| 久久人人爽人人爽人人片av不| 亚洲人久久久| 亚洲一区成人| 亚洲国产精品狼友在线观看| 中文字幕亚洲一区二区va在线| 欧美性猛交bbbbb精品| 日韩三级av在线播放| h视频在线免费| 日韩av第一页| 欧美午夜18电影| 成人小视频在线观看免费| 美女视频黄a大片欧美| 亚洲国产第一区| 亚洲一区中文日韩| 国产美女无遮挡永久免费| 亚洲视屏在线播放| 欧美大电影免费观看| 精品久久久久久亚洲| 欧美日韩免费观看一区=区三区| 国产三级国产精品国产专区50| 久久综合久久综合九色| 国产奶水涨喷在线播放| 日韩一卡二卡三卡四卡| 免费在线看黄色| 国产精品人成电影| 国产一区二区三区四区| 欧美 激情 在线| 99re成人精品视频| 精品在线播放视频| 亚洲国产精品一区二区三区| 欧美hdxxxxx| 3d动漫精品啪啪一区二区三区免费| 日韩在线观看| 亚洲第一狼人区| 中文字幕不卡在线播放| 波多野结衣激情视频| 国产一区二区三区视频在线观看| 亚洲播播91| 天天爽天天狠久久久| 日本伊人色综合网| 日韩av片在线| 欧美日韩在线播| 男人天堂手机在线| 亚洲va欧美va国产综合久久| 在线精品小视频| 99riav国产精品视频| 亚洲国产精品嫩草影院| 婷婷久久久久久| 热门国产精品亚洲第一区在线| 伊人成综合网yiren22| 国产精品无码av无码| 国产精品每日更新| 国产片在线播放| 久久久久久国产免费| 日韩福利视频一区| 日本精品www| 国产精品久久久久久久午夜片| 91av久久久| 久久99久久99精品中文字幕| 粉嫩精品导航导航| 免费观看日韩毛片| 国产精品天美传媒沈樵| 国产精品一级二级| 欧美激情免费视频| 群体交乱之放荡娇妻一区二区| 成人精品小视频| 亚洲欧美一区二区视频| 亚洲产国偷v产偷v自拍涩爱| 97在线视频精品| 成人激情在线| 国产无套精品一区二区三区| 欧美日韩亚洲高清| 欧美成人二区| 久99久视频| 久久福利资源站| 国产乡下妇女做爰| 日韩在线视频一区| 欧美大胆视频| 中文字幕 91| 亚洲成人第一页| 波多野结衣在线影院| 成人资源av| 欧美bbbbb| 亚洲精品午夜久久久久久久| 国产亚洲xxx| 东京久久高清| 午夜免费高清视频| 天天av天天翘天天综合网| 午夜在线小视频| 久久波多野结衣| 国产寡妇亲子伦一区二区|