建層:從 @ripple-ts/vite-plugin CHANGELOG 梳理插件演進(jìn)與實(shí)現(xiàn)細(xì)節(jié))
讀懂 Ripple 的構(gòu)建層從 ripple-ts/vite-plugin CHANGELOG 梳理插件演進(jìn)與實(shí)現(xiàn)細(xì)節(jié)【免費(fèi)下載鏈接】ripplethe elegant TypeScript UI framework項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ripple25/rippleripple-ts/vite-plugin是 Ripplethe elegant TypeScript UI framework接入 Vite 的核心橋梁它負(fù)責(zé)編譯.tsrx組件、注冊(cè) dev server 的 SSR/API 中間件、驅(qū)動(dòng)生產(chǎn)構(gòu)建的客戶端/服務(wù)端雙產(chǎn)物生成并實(shí)現(xiàn)流式 SSR、HMR 樣式同步等關(guān)鍵體驗(yàn)。本文以 packages/vite-plugin/CHANGELOG.md 為主線完整梳理該插件從0.2.x到當(dāng)前0.3.127的版本演進(jìn)把 changelog 中每一條實(shí)質(zhì)性變更記錄.tsrx工具鏈支持、dep-scan 修復(fù)、流式 SSR、全局 root boundary、源碼圖串聯(lián)等與 packages/vite-plugin/src/index.js、packages/vite-plugin/src/load-config.js 等源碼實(shí)現(xiàn)相互印證幫助讀者既掌握插件的當(dāng)前配置面也理解每項(xiàng)能力背后的調(diào)用鏈與修復(fù)動(dòng)機(jī)。插件在倉(cāng)庫(kù)中的定位ripple-ts/vite-plugin位于 monorepo 的 packages/vite-plugin 目錄。從 packages/vite-plugin/package.json 可以看到其關(guān)鍵事實(shí)當(dāng)前版本0.3.127與 CHANGELOG 頂部條目一致主入口src/index.js額外導(dǎo)出./production子路徑packages/vite-plugin/src/server/production.js供生產(chǎn)環(huán)境啟動(dòng)服務(wù)端入口運(yùn)行時(shí)依賴為ripple-ts/adapter平臺(tái)運(yùn)行時(shí)適配與tsrx/rippleTSRX → Ripple 編譯器devDependencies 中的vite說(shuō)明插件隨 Vite 8 一起工作見(jiàn)后文0.3.4的 Upgrade to Vite 8 記錄。插件入口是ripple()函數(shù)packages/vite-plugin/src/index.js#L339 中它返回一個(gè)插件數(shù)組——首元素是name: vite-plugin-ripple、enforce: pre的主插件resolver 先于 Vite 內(nèi)部 resolver 運(yùn)行其余為輔助插件。ripple()接受一個(gè)可選項(xiàng)excludeRippleExternalModules類型定義見(jiàn) packages/vite-plugin/types/index.d.ts#L106-L108設(shè)為true時(shí)跳過(guò)對(duì)node_modules中 Ripple 源碼包的掃描直接進(jìn)入optimizeDeps.exclude合并邏輯見(jiàn) packages/vite-plugin/src/index.js#L493-L502。CHANGELOG 中絕大多數(shù)條目形如 Updated dependencies只列出tsrx/ripple與ripple-ts/adapter的聯(lián)動(dòng)版本號(hào)——這是因?yàn)?monorepo 內(nèi)工作區(qū)包workspace:*隨 changesets 一起同步發(fā)版vite-plugin 本體往往沒(méi)有改動(dòng)。真正承載技術(shù)信息的是下文逐一解讀的十余條功能性條目。版本號(hào)演進(jìn)一次 1.0 回退與持續(xù)的 0.3.xCHANGELOG 記錄了一條有趣的版本弧線0.3.4之前是0.3.00.3.30.3.4升級(jí) Vite 8#807。0.2.2090.2.216段與0.3.x段在文件中交錯(cuò)出現(xiàn)如0.2.214出現(xiàn)在0.3.0之后見(jiàn) CHANGELOG L1281-L1305其中0.2.214的備注是 Force patch version bump for vite-plugin package屬于人為補(bǔ)發(fā)的版本號(hào)。1.0.0/1.0.1曾在0.3.25與0.3.26之間發(fā)布CHANGELOG L1041-L1056。隨后0.3.51明確說(shuō)明原因Patch packages currently versioned at 0.3.50 to fix the bump that caused major 1.0.0 release with a minor changeset.即一次 minor changeset 被錯(cuò)誤地算成了 major 跳版團(tuán)隊(duì)用0.3.51修正并回到0.3.x軌道此后至0.3.127一直保持 patch 遞增。這說(shuō)明當(dāng)前0.3.x并非未到 1.0而是版本治理修正后的延續(xù)序列引用該插件時(shí)應(yīng)以 packages/vite-plugin/package.json 中的version字段為準(zhǔn)。關(guān)鍵演進(jìn)節(jié)點(diǎn)逐條解讀功能性變更以下按時(shí)間順序覆蓋 CHANGELOG 中所有帶實(shí)質(zhì)描述的條目每條均給出源碼佐證。1. SSR dev 期的非法 HTML 嵌套檢測(cè)0.2.209CHANGELOG L1315-L1335 記錄了最早的實(shí)質(zhì)性條目SSR 期間若產(chǎn)出不合法嵌套例如button里再嵌button瀏覽器會(huì)自動(dòng)修復(fù) DOM導(dǎo)致 hydration 失敗且錯(cuò)誤難以定位。該修復(fù)包含四點(diǎn)服務(wù)端運(yùn)行時(shí)新增push_element/pop_element用元素棧追蹤當(dāng)前嵌套狀態(tài)按 HTML 規(guī)范加入完整的嵌套校驗(yàn)規(guī)則服務(wù)端編譯器在dev選項(xiàng)開(kāi)啟時(shí)自動(dòng)發(fā)出push_element/pop_element調(diào)用CompileOptions新增dev字段Vite 插件在vite devserve 命令時(shí)自動(dòng)打開(kāi) dev 模式。最后一點(diǎn)在當(dāng)前源碼中依然成立transformhook 以config?.command serve判定is_dev并把dev: is_dev傳給tsrx/ripple的compile()packages/vite-plugin/src/index.js#L1180-L1185。也就是說(shuō)dev 構(gòu)建產(chǎn)物里天然帶著嵌套校驗(yàn)的運(yùn)行時(shí)探針而vite build產(chǎn)物則不帶零生產(chǎn)開(kāi)銷。2. 全工具鏈.tsrx支持0.3.12 / 0.3.130.3.12CHANGELOG L1160-L1171Add first-phase.tsrxsupport across the core Ripple tooling so Vite, Rollup, TypeScript, the language server, Prettier, ESLint, and editor integrations accept.tsrx文件——插件從此以.tsrx為唯一擴(kuò)展名參與編譯0.3.13將其補(bǔ)全到 Ripple 工具鏈其余部分并把倉(cāng)庫(kù)內(nèi)受跟蹤的模塊統(tǒng)一改名為.tsrx。當(dāng)前源碼中這一設(shè)定是硬編碼的RIPPLE_EXTENSIONS [.tsrx]、RIPPLE_EXTENSION_PATTERN /\.tsrx$/packages/vite-plugin/src/index.js#L51-L52transformhook 的filter即基于該正則L1174。3. 修復(fù) SSR/API 中間件注冊(cè)時(shí)機(jī)0.3.35PR #966這是理解 dev server 請(qǐng)求路徑的關(guān)鍵條目CHANGELOG L936-L958問(wèn)題configureServerhook 此前返回了一個(gè)函數(shù)post-hook使 Ripple 的中間件注冊(cè)在 Vite 內(nèi)部中間件之后Vite 的 HTML fallback 中間件會(huì)先截走所有非文件 GET 請(qǐng)求導(dǎo)致 SSR 渲染與 API 路由永遠(yuǎn)沒(méi)有機(jī)會(huì)執(zhí)行。修復(fù)改為pre-hook函數(shù)不返回值直接vite.middlewares.use(...)并把配置加載延遲到首個(gè)請(qǐng)求由ensureConfigLoaded()負(fù)責(zé)——配置缺失時(shí)重試、加載錯(cuò)誤以 dev server 的 500 頁(yè)面呈現(xiàn)而不是靜默穿透。當(dāng)前實(shí)現(xiàn)完整保留了這一結(jié)構(gòu)configureServerpackages/vite-plugin/src/index.js#L586-L797不返回函數(shù)注釋明確寫道 Pre-hook: register middleware directly without returning a function, so it is inserted BEFORE Vites built-in stackensureConfigLoaded()的完整邏輯缺失不緩存、失敗后僅在文件 mtime 變化時(shí)重試在 L604-L673。此外加載失敗時(shí)插件選擇next()放行而非返回 500保證一個(gè)壞掉的ripple.config.ts不會(huì)拖垮 HMR、CSS、模塊請(qǐng)求等 Vite 內(nèi)部功能L683-L696。配套的 packages/vite-plugin/tests/configure-server.test.js 對(duì)該 hook 行為有專門測(cè)試。4. RenderRoute 的 params 傳入 SSR 組件0.3.36PR #999條目CHANGELOG L923-L934很短但意義重大路由匹配出的params從此會(huì)傳給 SSR 編譯后的頁(yè)面組件。dev 中間件中的實(shí)現(xiàn)是createContext(request, freshMatch.params)packages/vite-plugin/src/index.js#L746-L747Context類型的params: Recordstring, string定義在 packages/vite-plugin/types/index.d.ts#L87-L96并有 packages/vite-plugin/tests/render-route-props.test.js 覆蓋。5. 源碼圖串聯(lián)到 Vite JSX transform0.3.62PR #1148Chain TSRX compiler source maps through the Vite JSX transform so browser devtools show original.tsrxsources instead of generated TSXCHANGELOG L684-L695。此前 devtools 里看到的是編譯中間產(chǎn)物修復(fù)后斷點(diǎn)與組件樹(shù)都映射回.tsrx源文件。對(duì)應(yīng)的測(cè)試是 packages/vite-plugin/tests/transform-source-maps.test.js。transformhook 返回{ code, map }的形態(tài)packages/vite-plugin/src/index.js#L1198保證了 map 始終向上傳遞。6. 全局 root boundary、命名導(dǎo)出入口與代碼生成重構(gòu)0.3.66PR #1168這條CHANGELOG L638-L655包含三項(xiàng)全局 root pending/catch boundaryripple.config.ts頂層可配rootBoundary: { pending, catch }。當(dāng)前類型定義在 packages/vite-plugin/types/index.d.ts#L114-L117, L142-L143resolveRippleConfig會(huì)校驗(yàn)其必須是組件函數(shù)并默認(rèn){}packages/vite-plugin/src/load-config.js#L58-L76, L142配置路由可引用命名導(dǎo)出RenderRoute的entry從純路徑字符串?dāng)U展為string | readonly [exportName: string, path: string]元組packages/vite-plugin/types/index.d.ts#L112。解析工具get_route_entry_path/get_route_entry_export_name/get_component_export都在 packages/vite-plugin/src/routes.js#L16-L56——找不到指定命名導(dǎo)出時(shí)依次回退到default導(dǎo)出、第一個(gè)大寫開(kāi)頭的函數(shù)導(dǎo)出代碼生成集中化Refactor vite-plugin to keep code generation in one place, produce cache as necessary and generate actual files for inspection。這對(duì)應(yīng) packages/vite-plugin/src/project-codegen.js 中的write_project_generated_file虛擬模塊如virtual:ripple-hydrate的客戶端入口現(xiàn)在會(huì)寫成真實(shí)文件落盤方便排查——見(jiàn)loadhook 中先write_project_generated_file(..., client-entry.js, ...)再讀回的流程packages/vite-plugin/src/index.js#L1156-L1166測(cè)試在 packages/vite-plugin/tests/project-codegen.test.js。7. 客戶端 hydration 組合 RenderRoute 布局0.3.82修復(fù)了一個(gè)典型的服務(wù)端有、客戶端無(wú)的布局丟失 bugCHANGELOG L459-L476此前生成的客戶端入口只 hydrate 裸頁(yè)面組件路由的layout只存在于服務(wù)端 HTML——布局組件從未在瀏覽器執(zhí)行其 CSS 也不在客戶端依賴圖里hydration 后 SSR 樣式塊被移除布局樣式隨之消失表現(xiàn)為無(wú)樣式閃爍 FOUC。修復(fù)方式是客戶端入口加載 layout 模塊并以與服務(wù)端相同的方式包裹頁(yè)面且 layout 條目進(jìn)入客戶端構(gòu)建的靜態(tài)路由導(dǎo)入清單確保其 CSS 被打進(jìn) bundle。當(dāng)前buildStarthook 正是這一修復(fù)的載體收集 render 路由時(shí)同時(shí) flatMap[get_route_entry_path(r.entry), r.layout]并去重packages/vite-plugin/src/index.js#L559-L569RenderRoute類也帶有l(wèi)ayout字段packages/vite-plugin/src/routes.js#L72。8. 流式 SSR0.3.92PR #1326——插件側(cè)最重要的能力躍遷CHANGELOG L349-L370 的完整描述值得逐句拆解render(App, { stream })變?yōu)闈u進(jìn)式流同步殼含掛起的try邊界 pending 回退與當(dāng)前已注冊(cè)的全部 CSS立即 flush各邊界內(nèi)容在其異步工作完成后作為帶幀framed的亂序塊流出包含每塊 CSS、trackAsync信封與head內(nèi)容一小段內(nèi)聯(lián) runtime 在 hydration 前把塊替換進(jìn)對(duì)應(yīng)槽位hydration 后的邊界就地激活流式塊——直接認(rèn)領(lǐng)已流出的 DOM不重新渲染catch-only 邊界先流空槽位最終解析為 body 或服務(wù)端渲染的 catchcatch 區(qū)已在線的錯(cuò)誤的處理經(jīng) error 信封交給客戶端邊界render新增streamTemplate選項(xiàng)用于文檔骨架vite plugin 在ripple.config.ts中開(kāi)啟ssr.streaming時(shí)對(duì) render 路由響應(yīng)做流式輸出若index.html缺少!--ssr-head--/!--ssr-body--標(biāo)記則回退到緩沖式 SSR。源碼側(cè)可以逐一印證配置面ssr.streaming默認(rèn)false其 JSDoc 明確寫了標(biāo)記要求與回退策略packages/vite-plugin/types/index.d.ts#L144-L156resolveRippleConfig落默認(rèn)值在 packages/vite-plugin/src/load-config.js#L143-L145標(biāo)記解析buildStreamTemplate()按!--ssr-head--/!--ssr-body--把模板切成before/between/after三段缺標(biāo)記時(shí)返回null供調(diào)用方回退packages/vite-plugin/src/server/stream-response.js#L10-L38響應(yīng)組裝createStreamingResponse()啟動(dòng)render(component, { stream: sink, rootBoundary, streamTemplate })并立即返回Response(stream)渲染 Promise 的異常直接打到 sink 上packages/vite-plugin/src/server/stream-response.js#L54-L78。該 helper 被 dev serverpackages/vite-plugin/src/server/render-route.js與生產(chǎn) runtimepackages/vite-plugin/src/server/production.js共享注釋中寫明其平臺(tái)無(wú)關(guān)性測(cè)試packages/vite-plugin/tests/stream-response.test.js。9.ripple/server助手導(dǎo)出的 camelCase 重命名0.3.93create_ssr_stream→createStreamget_css_for_hashes→getCss返回render()收集的 scoped style hash 對(duì)應(yīng)的 CSS 文本舊 snake_case 導(dǎo)出被移除需要更新 import。CHANGELOG 同時(shí)說(shuō)明 The vite plugin consumes the new names internallyCHANGELOG L327-L347——這解釋了createStreamingResponse的入?yún)⒗锍霈F(xiàn)createSsrStream的依賴注入形態(tài)packages/vite-plugin/src/server/stream-response.js#L45-L51插件本身不硬依賴運(yùn)行時(shí)命名而是由調(diào)用方注入保持平臺(tái)無(wú)關(guān)。這是一條破壞性變更升級(jí)時(shí)需要遷移ripple/server的 import。10. HMR 更新導(dǎo)致組件樣式消失的修復(fù)0.3.6PR #819這是一個(gè)高頻痛點(diǎn)編輯組件 scoped CSS 時(shí) CSS hash 會(huì)變但虛擬 CSS 模塊既未被失效也未被包含進(jìn) HMR 更新瀏覽器持有舊 selector與新 hash 的 class 名失配全部樣式消失直到重啟 dev serverCHANGELOG L1208-L1228。當(dāng)前hotUpdatehandlerpackages/vite-plugin/src/index.js#L814-L870實(shí)現(xiàn)了修復(fù)并演進(jìn)了一步注釋說(shuō)明借鑒了 vite-plugin-svelte 的思路——不在hotUpdate里手動(dòng)重編譯而是調(diào)用this.environment.transformRequest(filename)跑完整 Vite 管線load → transform由既有transformhook 重編譯并更新cssCache順帶避免了雙重編譯隨后比對(duì)前后cssCache若 CSS 變化則invalidateModule虛擬 CSS 模塊并將其加入 HMR 更新列表保證瀏覽器拿到的新 CSS 與重渲染組件同步。對(duì)非 Ripple 文件若模塊不自接受則失效 SSR 模塊圖并發(fā)送full-reload。11. 移除 TSX island 與 React bridge0.3.73PR #1198Remove the unused namespaced TSX island feature and React bridge packageCHANGELOG L568-L581未使用的功能面被裁掉插件從此只聚焦.tsrx單一源碼形態(tài)。12. 升級(jí)到 Vite 8 與類型拆分0.3.4PR #807Upgrade to Vite 8CHANGELOG L1237-L1251。同一條版本里還有一個(gè)工程細(xì)節(jié)把生產(chǎn)子路徑./production的類型聲明拆到獨(dú)立文件 packages/vite-plugin/types/production.d.ts讓導(dǎo)出類型無(wú)需 self-import 技巧即可干凈解析。13. dep-scan 讓.tsrx導(dǎo)入對(duì)依賴預(yù)打包可見(jiàn)0.3.113PR #1394這條CHANGELOG L144-L184是插件在 dev 性能上的關(guān)鍵修復(fù)信息密度很高根因Vite 的 dep scanner 走 Rolldown 且不經(jīng)過(guò)主插件管線因此只從.tsrx文件 import 的 npm 依賴在啟動(dòng)掃描階段不可見(jiàn)只能在請(qǐng)求時(shí)才被發(fā)現(xiàn)觸發(fā) re-optimize 和整頁(yè)重載方案tsrx/core新增tsrx/core/vite/dep-scan入口提供兩種插件形態(tài)——直接 transform.tsrxid 的createDepScanTransformPlugin以及把 id 改寫為虛擬path.tsx形態(tài)的createDepScanLoadPlugin兩者都吞掉編譯失敗單個(gè)壞文件不再拖垮整個(gè)項(xiàng)目的依賴預(yù)打包附帶修復(fù)掃描自身的 JSX transform 默認(rèn) React automatic runtime會(huì)往 Preact/Solid/Vue 項(xiàng)目里發(fā)射無(wú)法解析的react/jsx-dev-runtimeimport 導(dǎo)致掃描整體失敗React/Preact 插件改為指向配置的 import sourceSolid/Vue 插件在掃描期保持 JSX 不轉(zhuǎn)換。Ripple 插件側(cè)的實(shí)現(xiàn)是dep_scan_configpackages/vite-plugin/src/index.js#L378-L402extensions: [.tsrx]注釋解釋了為什么必須聲明——scanner 對(duì)外部擴(kuò)展名一律 externalize并在rolldownOptions.plugins掛入createDepScanTransformPlugincompile回調(diào)使用compile(code, id, { mode: client, dev: true, hmr: false })moduleType: js。該配置對(duì)象被展開(kāi)進(jìn)confighook 返回的每個(gè)optimizeDeps中L496-L535。packages/vite-plugin/tests/dep-scan.test.js 有四組斷言精確鎖定上述行為擴(kuò)展名與 filter 只匹配.tsrxL25-L33、保留已有 exclude 列表L35-L39、掃描期編譯產(chǎn)物保持from some-dep且moduleType為jsL41-L56、編譯失敗返回空模塊{ code: , moduleType: js }而非拋錯(cuò)L58-L69。14. 消費(fèi)已發(fā)布的共享 TSRX 包0.3.125PR #1437最近的實(shí)質(zhì)性條目CHANGELOG L21-L34TSRX 目標(biāo)無(wú)關(guān)源碼遷移到獨(dú)立倉(cāng)庫(kù)tsrx-org/tsrx后Ripple 不再內(nèi)嵌編譯器/工具鏈改為消費(fèi)其發(fā)布包新 Ripple 項(xiàng)目使用tsrx/language-server、TSRX editor identity 與已發(fā)布的 TSRX 集成。對(duì)應(yīng)地插件對(duì)編譯器的依賴收斂為 packages/vite-plugin/src/index.js#L7 的import { compile } from tsrx/ripple與 L8 的import { createDepScanTransformPlugin } from tsrx/core/vite/dep-scan。當(dāng)前配置面總覽ripple.config.ts上述演進(jìn)累積出了當(dāng)前的配置結(jié)構(gòu)。RippleConfigOptions定義于 packages/vite-plugin/types/index.d.ts#L119-L175默認(rèn)值由resolveRippleConfig統(tǒng)一施加packages/vite-plugin/src/load-config.js#L91-L154該函數(shù)被聲明為冪等且是所有配置校驗(yàn)與默認(rèn)值的唯一事實(shí)來(lái)源字段類型/默認(rèn)值說(shuō)明build.outDir默認(rèn)dist生產(chǎn)構(gòu)建輸出目錄客戶端產(chǎn)物在outDir/client服務(wù)端產(chǎn)物在outDir/serverbuild.minify默認(rèn)undefined客戶端走 Vite 默認(rèn) esbuild僅當(dāng)顯式設(shè)置時(shí)覆蓋minify見(jiàn) packages/vite-plugin/src/index.js#L480-L484build.target默認(rèn)undefined傳遞給 SSR 子構(gòu)建adapter開(kāi)發(fā)期可選生產(chǎn)構(gòu)建必填requireAdapter: true含serve與runtime生產(chǎn)構(gòu)建缺 adapter 會(huì)直接拋錯(cuò)packages/vite-plugin/src/load-config.js#L103-L117router.routes默認(rèn)[]RenderRoute/ServerRoute實(shí)例數(shù)組packages/vite-plugin/src/routes.js#L61-L124無(wú)路由時(shí)插件退化為純 SPA 插件rootBoundary默認(rèn){}全局 pending/catch UI客戶端與 SSR 渲染根共用ssr.streaming默認(rèn)false開(kāi)啟后 render 路由走流式 SSRindex.html需含!--ssr-head--/!--ssr-body--標(biāo)記否則自動(dòng)回退緩沖式middlewares默認(rèn)[]全局中間件先于路由級(jí)before/after執(zhí)行platform.env默認(rèn){}注入平臺(tái)環(huán)境變量server.trustProxy默認(rèn)false信任X-Forwarded-Proto/X-Forwarded-Host僅置于可信反向代理之后時(shí)開(kāi)啟packages/vite-plugin/types/index.d.ts#L162-L174配置加載有兩條路徑packages/vite-plugin/src/load-config.js#L197-L244dev 期傳入運(yùn)行中的 Vite server走ssrLoadModule直接加載無(wú)臨時(shí) server 開(kāi)銷、支持 HMR 感知重載build/preview 期則臨時(shí)創(chuàng)建 middleware 模式的 Vite server 轉(zhuǎn)譯ripple.config.ts后立即關(guān)閉。ripple.config.ts路徑固定為root/ripple.config.tsgetRippleConfigPath。倉(cāng)庫(kù)內(nèi)的真實(shí)示例可參考 playground/ripple/ripple.config.ts 與 website-new/ripple.config.ts。生產(chǎn)構(gòu)建的完整鏈路closeBundlehookpackages/vite-plugin/src/index.js#L891-L1099是 changelog 多次演進(jìn)代碼生成集中化、布局進(jìn)客戶端圖、manifest 資產(chǎn)映射匯聚后的產(chǎn)物值得作為整體了解讀取客戶端構(gòu)建的.vite/manifest.json按路由 entry 遞歸收集 JS/CSScollectCss帶 visited 集合防環(huán)構(gòu)建 per-route 的clientAssetMap清理dist/client/.vite避免靜態(tài)服務(wù)器把源文件路徑暴露給用戶由 packages/vite-plugin/src/server/virtual-entry.js 的generateServerEntry生成服務(wù)端入口含路由表、client 資產(chǎn)映射、RPC 模塊路徑經(jīng)write_project_generated_file落盤為server-entry.js再調(diào)一次viteBuild做 SSR 子構(gòu)建ssr: true、輸出 ESM 到outDir/serverripple-ts/adapter*系列全部 external把index.html模板復(fù)制進(jìn) server 輸出使服務(wù)端入口自包含——注釋特別說(shuō)明這對(duì)dist/client 被當(dāng)純靜態(tài)文件服務(wù)的平臺(tái)如 Vercel至關(guān)重要。客戶端側(cè)buildStart預(yù)加載 render 路由條目transformIndexHtml在/body前注入script typemodule srcvirtual:ripple-hydratepackages/vite-plugin/src/index.js#L876-L885virtual:ripple-hydrate由loadhook 生成客戶端入口源碼packages/vite-plugin/src/project-codegen.js 的create_client_entry_source。如何驗(yàn)證與繼續(xù)閱讀插件行為測(cè)試packages/vite-plugin/tests 下六個(gè)文件——dep-scan.test.js預(yù)打包掃描、configure-server.test.jsdev server 中間件順序與懶加載、render-route-props.test.jsparams 傳遞、stream-response.test.js流式模板切分與回退、transform-source-maps.test.js源碼圖、project-codegen.test.js生成文件完整類型契約packages/vite-plugin/types/index.d.ts含RipplePluginOptions、RippleConfigOptions、ResolvedRippleConfig可運(yùn)行的項(xiàng)目形態(tài)playground/ripple含ripple.config.ts與vite.config.js的完整組合、website-new以 Ripple 構(gòu)建的站點(diǎn)本身與 templates/basic項(xiàng)目模板。綜上這份 CHANGELOG 記錄的不僅是一串版本號(hào)它完整呈現(xiàn)了 Ripple 構(gòu)建層的四條主線——.tsrx工具鏈集成、dev server 請(qǐng)求路徑與中間件秩序、構(gòu)建期代碼生成與雙產(chǎn)物管線、SSR 能力從能渲染到可流式、可追蹤、可調(diào)試的成熟過(guò)程——而每一處源碼現(xiàn)狀都能在這些條目中找到動(dòng)機(jī)與出處。【免費(fèi)下載鏈接】ripplethe elegant TypeScript UI framework項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ripple25/ripple創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考