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

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

基于Rspack實(shí)現(xiàn)大倉(cāng)應(yīng)用構(gòu)建提效實(shí)踐

來(lái)源: 責(zé)編: 時(shí)間:2024-07-11 17:31:21 745觀看
導(dǎo)讀一、實(shí)踐背景隨著項(xiàng)目的逐步迭代,代碼量和依賴的逐漸增長(zhǎng),應(yīng)用的構(gòu)建速度逐步進(jìn)入緩慢期。以目前所在團(tuán)隊(duì)的業(yè)務(wù)應(yīng)用來(lái)看(使用webpack構(gòu)建),應(yīng)用整體構(gòu)建耗時(shí)已經(jīng)普遍偏高,影響日常開(kāi)發(fā)測(cè)試的使用效率,其中編譯耗時(shí)大約占50%

一、實(shí)踐背景

隨著項(xiàng)目的逐步迭代,代碼量和依賴的逐漸增長(zhǎng),應(yīng)用的構(gòu)建速度逐步進(jìn)入緩慢期。以目前所在團(tuán)隊(duì)的業(yè)務(wù)應(yīng)用來(lái)看(使用webpack構(gòu)建),應(yīng)用整體構(gòu)建耗時(shí)已經(jīng)普遍偏高,影響日常開(kāi)發(fā)測(cè)試的使用效率,其中編譯耗時(shí)大約占50%。xlO28資訊網(wǎng)——每日最新資訊28at.com

實(shí)際上隨著近些年前端的技術(shù)發(fā)展以及業(yè)務(wù)對(duì)前端交互體驗(yàn)的要求提高,前端整個(gè)代碼量復(fù)雜度和代碼量增長(zhǎng)飛快。隨著這一趨勢(shì)的變化,服務(wù)于前端工程構(gòu)建方案多年的webpack,在構(gòu)建效率上已經(jīng)逐漸成為瓶頸。因此業(yè)界也存在不少優(yōu)化思路和方案,主要分兩個(gè)方向:xlO28資訊網(wǎng)——每日最新資訊28at.com

  • 基于原有Node.js語(yǔ)言實(shí)現(xiàn),通過(guò)緩存等方案來(lái)提升構(gòu)建效率,主要是緩存、預(yù)構(gòu)建的方式來(lái)減少編譯。此類方案多數(shù)存在條件限制,比如緩存方案前提是第一次先生成緩存來(lái)提升二次構(gòu)建效率,對(duì)于發(fā)布平臺(tái)等需要冷啟場(chǎng)景無(wú)法生效。
  • 另外一類是采用Golang、Rust等語(yǔ)言重新實(shí)現(xiàn)耗時(shí)較為復(fù)雜的編譯過(guò)程,從語(yǔ)言層面實(shí)現(xiàn)編譯過(guò)程的性能提升。比較有代表的有,基于Golang實(shí)現(xiàn)的esbuild、基于Rust實(shí)現(xiàn)的SWC,都在對(duì)應(yīng)的場(chǎng)景得到不少的性能提升。

二、業(yè)界方案

既然是業(yè)界的普遍性問(wèn)題,那么外界也肯定會(huì)存在不少優(yōu)化案例可以借鑒或者復(fù)用。由于Node.js的優(yōu)化方案通常都會(huì)存在各種場(chǎng)景限制,這里我們主要從另外一個(gè)思路去尋找方案。經(jīng)過(guò)調(diào)研目前業(yè)界的主要方案有Rspack、Vite、Turbopack、swcpack相對(duì)比較有代表性(可能還有其他方案,由于筆者時(shí)間精力有限未能了解到)。幾個(gè)方案主要的情況如下(筆者個(gè)人主觀分析,僅供參考):xlO28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片xlO28資訊網(wǎng)——每日最新資訊28at.com

三、技術(shù)選型

先看當(dāng)前大倉(cāng)前端應(yīng)用主要技術(shù)體系:整體技術(shù)棧主要是React為主,未來(lái)Vue還會(huì)逐步遷移React;框架層面UmiJS@4大概占60%、UmiJS@v3大概占20%、剩余為其他Vue或者C端的多頁(yè)應(yīng)用。整體技術(shù)體系主要是UmiJS為主,配套主要是webpack的構(gòu)建方案,部分Vue項(xiàng)目有使用Vite。xlO28資訊網(wǎng)——每日最新資訊28at.com

在這樣的現(xiàn)實(shí)情況下,我們面對(duì)的主要是React+UmiJS+webpack的應(yīng)用?;趹?yīng)用廣泛性考慮,只要解決這部分應(yīng)用就可以達(dá)到80%的應(yīng)用提速覆蓋。為此,我們選擇了基于Rspack來(lái)實(shí)現(xiàn)構(gòu)建方案的性能提升,主要考慮有以下幾點(diǎn):xlO28資訊網(wǎng)——每日最新資訊28at.com

  • 高性能:基于Rust實(shí)現(xiàn)核心能力,全量編譯+增量編譯(HMR)的實(shí)現(xiàn)方式,官方宣稱實(shí)際落地有5~10倍的提升,隨著未來(lái)逐步優(yōu)化完善還有提升空間,且生產(chǎn)和開(kāi)發(fā)階段除緩存之外,基本可以獲得一致性的性能收益。
  • 低成本:Rspack大量兼容webpack生態(tài),大量配置和插件可以直接或者調(diào)整一下配置即可復(fù)用,僅需對(duì)一些特殊的插件自研定制開(kāi)發(fā)即可。以下是對(duì)項(xiàng)目主要使用到的webpack能力進(jìn)行了梳理,并對(duì)其在Rspack中的情況情況也進(jìn)行了對(duì)照。

圖片圖片xlO28資訊網(wǎng)——每日最新資訊28at.com

綜合情況來(lái)看:雖然性能Rspack未必是最高的,但其兼容webpack生態(tài)帶來(lái)的低成本遷移,是其他的方案基本上無(wú)法做到的。對(duì)此,選擇了基于Rspack來(lái)作為基礎(chǔ)的底層能力。得益于此,我們最終實(shí)現(xiàn)了業(yè)務(wù)代碼零改動(dòng)即可實(shí)現(xiàn)構(gòu)建方案遷移(僅微調(diào)構(gòu)建配置),并獲得云構(gòu)建2倍+編譯性能的提升。xlO28資訊網(wǎng)——每日最新資訊28at.com

四、方案設(shè)計(jì)思路

由于大倉(cāng)目前大量的應(yīng)用為UmiJS@4體系,作為我們主要服務(wù)的目標(biāo)對(duì)象,本文也是主要先針對(duì)解決UmiJS@4版本的應(yīng)用方案。xlO28資訊網(wǎng)——每日最新資訊28at.com

方案難點(diǎn)

  • UmiJS僅支持webpack和Vite兩種構(gòu)建模式,如何擴(kuò)展Rspack構(gòu)建?
  • 業(yè)務(wù)應(yīng)用中有大量使用UmiJS插件、Babel插件來(lái)實(shí)現(xiàn)一些特殊能力,如何支持此類插件的能力?
  • 如何盡可能降低業(yè)務(wù)應(yīng)用接入成本,進(jìn)而達(dá)成方案快速應(yīng)用到各個(gè)業(yè)務(wù)應(yīng)用中?

通過(guò)擴(kuò)展插件命令實(shí)現(xiàn)Rspack構(gòu)建

UmiJS默認(rèn)構(gòu)建能力是封裝在@umi/max內(nèi)部,通過(guò)max dev/build來(lái)調(diào)用內(nèi)置配套的本地/生產(chǎn)構(gòu)建。在UmiJS官方上并未提供編譯能力的完全自定義擴(kuò)展能力,僅支持Vite/webpack的選擇以及提供了一些修改構(gòu)建配置的方法。xlO28資訊網(wǎng)——每日最新資訊28at.com

通過(guò)查看UmiJS項(xiàng)目的源碼,發(fā)現(xiàn)其內(nèi)部的構(gòu)建實(shí)現(xiàn)全部集中在dev/build這兩個(gè)擴(kuò)展命令中。源代碼在preset-umi/src/commands/目錄下的dev/dev.ts和build.ts 兩個(gè)文件,分別對(duì)應(yīng)dev和build命令。而實(shí)際上的構(gòu)建邏輯,實(shí)現(xiàn)上主要是在 @umijs/bundler-vite 和 @umijs/bundler-webpack兩個(gè)包中。其內(nèi)部執(zhí)行的主要邏輯如下(這里以dev模式為例,build模式基本上類似,就是少了文件監(jiān)聽(tīng)編譯和express相關(guān)邏輯):xlO28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片xlO28資訊網(wǎng)——每日最新資訊28at.com

那么我們只需要在新的命令中實(shí)現(xiàn)相關(guān)的邏輯,即可通過(guò)擴(kuò)展命令的方式來(lái)擴(kuò)展Rspack構(gòu)建能力。另外,使用該方法實(shí)現(xiàn),還能沿用UmiJS原本的代碼生成等原本的插件,進(jìn)而可以避免需要大量重新實(shí)現(xiàn)UmiJS插件的能力,并降低重寫帶來(lái)的邏輯不一致風(fēng)險(xiǎn)。xlO28資訊網(wǎng)——每日最新資訊28at.com

官方平替插件+少部分自研擴(kuò)展支持原有插件能力

前面的插件擴(kuò)展模式已經(jīng)能保證原有大量的UmiJS能力是可以直接沿用的,比如生成路由、添加tailwind.css等UmiJS內(nèi)置能力都可直接沿用。另外項(xiàng)目主要依賴擴(kuò)展的插件,除了少部分修改構(gòu)建能力的插件之外,基本上都可以直接使用或者少量適配即可。不兼容的幾個(gè)插件主要是因?yàn)椋汗δ苁峭ㄟ^(guò)修改的webpack配置來(lái)調(diào)整構(gòu)建能力,需要通過(guò)使用對(duì)應(yīng)的Rspack構(gòu)建能力來(lái)進(jìn)行兼容。xlO28資訊網(wǎng)——每日最新資訊28at.com

另外除了UmiJS的插件之外,還有構(gòu)建依賴的Babel插件部分,當(dāng)然部分Babel插件也是通過(guò)UmiJS插件引入使用的。對(duì)此,也對(duì)主要的Babel插件的情況進(jìn)行了梳理,其主要的情況如下表:xlO28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片xlO28資訊網(wǎng)——每日最新資訊28at.com

所以整體上還是以沿用webpack原有擴(kuò)展加Rspack官方能力替換為主,只需要針對(duì)少部分未支持的Babel插件進(jìn)行擴(kuò)展即可實(shí)現(xiàn)。xlO28資訊網(wǎng)——每日最新資訊28at.com

基于配置映射實(shí)現(xiàn)業(yè)務(wù)超低接入成本

想要達(dá)成方案可以快速應(yīng)用的理想效果,就是讓應(yīng)用接入過(guò)程中盡可能少改內(nèi)容,特別是業(yè)務(wù)代碼。因?yàn)橐坏┮臉I(yè)務(wù)代碼邏輯,這種就會(huì)增加非常多的接入成本,所以在方案設(shè)計(jì)上,構(gòu)建能力以及原本UmiJS的相關(guān)配置能力要盡量去沿用并且滿足基本上不需要業(yè)務(wù)側(cè)同學(xué)去感知差異化的內(nèi)容。xlO28資訊網(wǎng)——每日最新資訊28at.com

帶著這個(gè)需求并結(jié)合前面的幾塊內(nèi)容分析來(lái)看,大多數(shù)內(nèi)容都是有平替方案,少部分需要進(jìn)行自定義開(kāi)發(fā)擴(kuò)展,主要也是集中在Babel插件上。那么我們需要做的就是維持UmiJS轉(zhuǎn)換生成webpack的配置邏輯不動(dòng),在拿到webpack配置之后,再對(duì)webpack的配置做解析通過(guò)一個(gè)配置轉(zhuǎn)換器對(duì)需要轉(zhuǎn)換成Rspack的內(nèi)容進(jìn)行轉(zhuǎn)化,對(duì)原本兼容的配置直接遷移使用即可實(shí)現(xiàn)我們的目的。xlO28資訊網(wǎng)——每日最新資訊28at.com

配置&能力映射示意圖:xlO28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片xlO28資訊網(wǎng)——每日最新資訊28at.com

方案架構(gòu)

結(jié)合以上的問(wèn)題解決思路以及目標(biāo),最終方案的架構(gòu)設(shè)計(jì)如下:xlO28資訊網(wǎng)——每日最新資訊28at.com

圖片xlO28資訊網(wǎng)——每日最新資訊28at.com

架構(gòu)要點(diǎn)說(shuō)明:xlO28資訊網(wǎng)——每日最新資訊28at.com

  • 通過(guò)擴(kuò)展自研插件,提供自定義的rspack-dev和rspack-build命令來(lái)提供開(kāi)發(fā)、生產(chǎn)模式,接入時(shí)僅需要安裝插件并替換啟動(dòng)命令即可(舉個(gè)例子:package.json中修改max dev為max rspack-dev)。
  • 通過(guò)插件內(nèi)部對(duì)配置進(jìn)行轉(zhuǎn)化,將原本UmiJS的配置轉(zhuǎn)為Rspack配置,保障業(yè)務(wù)應(yīng)用接入時(shí)基本不感知。另外在開(kāi)發(fā)成本方面,由于大多數(shù)loader和plugin可以復(fù)用,主要是配置和loader等能力替換映射成本。
  • 方案基于UmiJS的max擴(kuò)展,原本UmiJS的擴(kuò)展能力不受影響。業(yè)務(wù)高使用率Babel插件有現(xiàn)成的SWC擴(kuò)展能力可直接替換(比如:Babel-plugin-import、svgr等),少部分自研插件需要使用Rust重寫。

穩(wěn)定性保障

切換構(gòu)建之后,less/postcss插件是一致的,主要風(fēng)險(xiǎn)來(lái)自于兩個(gè)方面:xlO28資訊網(wǎng)——每日最新資訊28at.com

  • webpack轉(zhuǎn)Rspack:Rspack項(xiàng)目?jī)?nèi)平移了大量的webpack測(cè)試用例用于保障一致性,另外默認(rèn)嚴(yán)格模式,出現(xiàn)不兼容配置會(huì)拋出錯(cuò)誤中斷構(gòu)建,保證了基礎(chǔ)方面的穩(wěn)定性。

圖片圖片xlO28資訊網(wǎng)——每日最新資訊28at.com

  • Babel(v7)轉(zhuǎn)SWC:SWC支持所有stage 3 perposals 、preset-env,JS/TS語(yǔ)法編譯能力上跟Babel 7對(duì)齊。在插件生態(tài)上不一致,若有使用Babel插件,需要考慮替換方案(詳情參考前文中的Babel插件使用情況)。

圖片圖片xlO28資訊網(wǎng)——每日最新資訊28at.com

雖然在Rspack方面申明已經(jīng)兼容了主流的內(nèi)容,但畢竟是替換了構(gòu)建方案,對(duì)業(yè)務(wù)來(lái)說(shuō)還是存在一些未知的風(fēng)險(xiǎn),還是需要一些手段來(lái)進(jìn)行保障業(yè)務(wù)應(yīng)用的穩(wěn)定性。xlO28資訊網(wǎng)——每日最新資訊28at.com

穩(wěn)定性保障手段:xlO28資訊網(wǎng)——每日最新資訊28at.com

  • 構(gòu)建報(bào)錯(cuò)中斷策略:配置上出現(xiàn)不支持的Babel插件直接報(bào)錯(cuò)中斷構(gòu)建,避免未支持的內(nèi)容被跳過(guò)進(jìn)而導(dǎo)致異常發(fā)布上線。
  • 階段推進(jìn)落地策略:由于大多數(shù)構(gòu)建運(yùn)行都是在開(kāi)發(fā)測(cè)試階段(粗略統(tǒng)計(jì)平臺(tái)發(fā)布70%左右為測(cè)試環(huán)境),先行接入開(kāi)發(fā)&測(cè)試環(huán)境達(dá)到構(gòu)建效率提升,等開(kāi)發(fā)測(cè)試階段跑穩(wěn)定之后,再?gòu)姆呛诵膽?yīng)用開(kāi)始試點(diǎn)上線,功能穩(wěn)定之后再逐步推廣。
  • 極簡(jiǎn)的應(yīng)急恢復(fù)策略:由于極低的接入成本,若接入遇到問(wèn)題想快速回退也非常簡(jiǎn)單,僅需回退命令為dev/build即可完成應(yīng)急恢復(fù)。

五、方案效益

實(shí)現(xiàn)超低接入成本:僅需改動(dòng)三個(gè)小步驟,一兩分鐘即可完成接入。具體步驟如下:xlO28資訊網(wǎng)——每日最新資訊28at.com

  • 添加并安裝依賴:添加并安裝@umijs/plugin-rspack依賴(得物私有npm包)。
dx add @umijs/plugin-rspack@latest -D
  • 添加UmiJS的plugin:在config/config.ts中修改plugins屬性。
{    // 原有其他配置    ...    plugins: [        // 原有其他插件        ...,         // 添加 @umijs/plugin-rspack 插件        '@umijs/plugin-rspack',    ],    // 原有其他配置    ...}
  • 修改構(gòu)建命令:修改package.json中的構(gòu)建命令,將對(duì)應(yīng)環(huán)境的命令調(diào)整為rspack-dev/rspack-build,并增加NODE_ENV配置。
{    "scripts": {        // start 對(duì)應(yīng)支持本地的dx dev,        // 原配置樣例        - "start": "cross-env BUILD_ENV=dev max dev",        // 改rspack構(gòu)建樣例        + "start": "cross-env BUILD_ENV=dev NODE_ENV=development max rspack-dev",        // pnpm:build:x 對(duì)應(yīng)支持發(fā)布平臺(tái)指定的環(huán)境        // 原t1配置樣例        - "pnpm:build:t1": "cross-env BUILD_ENV=t1 max build",        // t1改rspack構(gòu)建樣例        + "pnpm:build:t1": "cross-env BUILD_ENV=t1 NODE_ENV=production max rspack-build",        ... // 原先的其他配置,酌情進(jìn)行調(diào)整    }}

平均2倍+的編譯性能提升:大倉(cāng)應(yīng)用接入17個(gè)應(yīng)用(目前主要是接入開(kāi)發(fā)、測(cè)試環(huán)境),平均提升在2倍以上。以自身負(fù)責(zé)的一個(gè)應(yīng)用為例,原有webpack編譯耗時(shí)150秒,接入后降低到40秒(減少73.33%),加上優(yōu)化過(guò)程中去除部分無(wú)用的引入代碼最終僅需20秒左右。xlO28資訊網(wǎng)——每日最新資訊28at.com

六、分享過(guò)程中的一些干貨

這里主要結(jié)合UmiJS所需要的能力,分享一些UmiJS涉及到的Rspack用法以及過(guò)程中一些比較典型的內(nèi)容。xlO28資訊網(wǎng)——每日最新資訊28at.com

支持ts/tsx

ts/tsx的支持主要依靠的是swc-loader,Rspack使用了Rust定制的builtin:swc-loader,其使用方式基本上是跟webpack的swc-loader一致的,詳情可以直接參考swc-loader文檔,這里主要體現(xiàn)一些常用的配置項(xiàng),具體使用可以結(jié)合自身項(xiàng)目情況來(lái)調(diào)整。xlO28資訊網(wǎng)——每日最新資訊28at.com

export default {  module: {    rules: [      {        test: //.(j|t)s(x)?$/,        loader: 'builtin:swc-loader',        options: {          env: {            // 瀏覽器兼容性,支持browserslist,詳細(xì)可以參考:https://swc.rs/docs/configuration/supported-browsers#targets            targets: {              chrome: "80",            },          },          // js/ts編譯配置          jsc: {            parser: {              // 開(kāi)啟ts編譯              syntax: 'typescript',              // 開(kāi)啟tsx編譯              tsx: true,              // 開(kāi)啟@裝飾器編譯              decorators: true,              // 動(dòng)態(tài)import              // dynamicImport: false,            },            transform: {              // react運(yùn)行環(huán)境配置              react: {                // dev模式打開(kāi)development啟動(dòng)react的開(kāi)發(fā)模式                development: isDev,              },              // stage 1 的舊版本class decorators              legacyDecorator: true,              // 支持 ts emitDecoratorMetadata              decoratorMetadata: true,            },          },        },      },    ]  }}

React HMR

在看文檔配置時(shí),感覺(jué)不好理解,實(shí)際使用上其實(shí)分兩種情況:xlO28資訊網(wǎng)——每日最新資訊28at.com

  • 直接使用Rspack的devServer情況下,需要同時(shí)開(kāi)啟devServer.hot和@rspack/plugin-react-refresh。如下配置:
import ReactRefreshPlugin from '@rspack/plugin-react-refresh';export default {    ... 其他配置    devServer: {        // 開(kāi)啟HMR,官方文檔也有體現(xiàn)        hot: true,    },    plugins: [        ...其他插件        // React熱更新支持插件        isDev && new ReactRefreshPlugin(),    ]}
  • 若不使用devServer的情況下,需要用rspack.HotModuleReplacementPlugin來(lái)實(shí)現(xiàn)devServer.hot的能力。由于這種方式未在實(shí)踐過(guò)程中進(jìn)應(yīng)用,這里不進(jìn)行具體的使用舉例。

Module Federation

Rspack提供了兩個(gè)版本的模塊聯(lián)邦能力,官方文檔主要是介紹的v1.5對(duì)應(yīng)的是經(jīng)過(guò)Rspack改良過(guò)的版本。但實(shí)際上在一些情況下,如果直接跟webpack的MF對(duì)接會(huì)存在一些問(wèn)題。我們?cè)诘谝淮问褂眠^(guò)程中,也是對(duì)接了默認(rèn)的v1.5版本,就出現(xiàn)了公共依賴無(wú)法找到的問(wèn)題,錯(cuò)誤提示如下:xlO28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片xlO28資訊網(wǎng)——每日最新資訊28at.com

實(shí)際上若需要跟webpack項(xiàng)目對(duì)接的情況下,需要采用v1.0版本的MF插件,使用方法如下:xlO28資訊網(wǎng)——每日最新資訊28at.com

import { container } from '@rspack/core';export default {    ... 其他配置    plugins: [        new container.ModuleFederationPluginV1({            ... 這里是mf的配置        })    ]}

樣式按需引入:babel-plugin-importxlO28資訊網(wǎng)——每日最新資訊28at.com

babel-plugin-import作用:主要是配合ant-design或poizon-design(基于antd定制主題)庫(kù)來(lái)使用,通過(guò)插件識(shí)別js中依賴的組件,自動(dòng)注入樣式文件,進(jìn)而實(shí)現(xiàn)css的按需引用。實(shí)現(xiàn)類似如下效果:xlO28資訊網(wǎng)——每日最新資訊28at.com

// 手寫源代碼import { Button, Input } from 'antd';// 通過(guò)插件編譯后import { Button, Input } from 'antd';import 'antd/lib/button/style';import 'antd/lib/input/style';

在Rspack中使用的是swc來(lái)進(jìn)行js/ts解析的,故babel-plugin-import是不能直接使用的,需要采用builtin:swc-loader的rspackExperiments來(lái)進(jìn)行對(duì)應(yīng)的能力支持。其配置方法如下:xlO28資訊網(wǎng)——每日最新資訊28at.com

export default {  module: {    rules: [      {        test: //.(j|t)s(x)?$/,        loader: 'builtin:swc-loader',        options: {          experimental: {            // babel-plugin-import的配置            import: [              // pd按需注入樣式              { libraryName: 'poizon-design', libraryDirectory: 'es', style: true },              // antd按需注入樣式              { libraryName: 'antd', libraryDirectory: 'es', style: true },            ],          }        }      }    ]  }}

cssModules:auto-css-modulesxlO28資訊網(wǎng)——每日最新資訊28at.com

在UmiJS中,默認(rèn)是通過(guò)auto-css-modules來(lái)進(jìn)行css-modules代碼的判斷;其原理為通過(guò)ast語(yǔ)法樹(shù),判斷import引入樣式文件時(shí),若有聲明對(duì)應(yīng)的變量,就將其打上一個(gè)query標(biāo)記。并在樣式文件處理時(shí),通過(guò)resourceQuery來(lái)進(jìn)行匹配對(duì)應(yīng)的文件,并添加css-modules的編譯能力。詳情見(jiàn):UmiJS AutoCssModules插件源代碼、UmiJS CSS編譯配置源代碼。xlO28資訊網(wǎng)——每日最新資訊28at.com

通過(guò)UmiJS項(xiàng)目以及結(jié)合一些資料,Babel的auto-css-modules能力有swc-plugin-auto-css-modules可以替代,配置的話,主要幾個(gè)關(guān)鍵點(diǎn):xlO28資訊網(wǎng)——每日最新資訊28at.com

  • 添加swc-plugin-auto-css-modules插件(實(shí)際上開(kāi)源的插件并不能用,后文詳細(xì)說(shuō)明原因)。
  • 添加builtins.css配置,指定cssModules編譯時(shí)的方式,主要有樣式名是否保持,輸出的樣式格式。
  • 添加resourceQuery識(shí)別,并給對(duì)應(yīng)的內(nèi)容加type: 'css/module';Rspack默認(rèn)會(huì)對(duì)type: 'css/module'的代碼當(dāng)做cssModules編譯,這個(gè)用法會(huì)比使用css-loader+style-loader更方便。

具體配置實(shí)現(xiàn)參考如下:xlO28資訊網(wǎng)——每日最新資訊28at.com

const postcssLoader = {  loader: require.resolve('postcss-loader'),  options: {    // ...此處省略less-loader配置  }};const lessLoader = {  loader: require.resolve('less-loader'),  options: {    // ...此處省略less-loader配置  }}export default {  builtins: {    css: {      // cssModule默認(rèn)配置      modules: {        // class保持原樣輸出        localsConvention: 'asIs',        // class轉(zhuǎn)換后的格式,localIdentName跟css-loader并不完全兼容,比如[hash:base64:5]這種寫法就會(huì)報(bào)錯(cuò)        localIdentName: '[local]_[hash:8]',      },    },  },  module: {    rules: [      {        test: //.(j|t)s(x)?$/,        loader: 'builtin:swc-loader',        options: {          experimental: {            plugins: [              // ...此處其他配置內(nèi)容              // 添加 swc-plugin-auto-css-modules 插件執(zhí)行?modules的注入              [require.resolve('swc-plugin-auto-css-modules'), {}]            ]          }        },      },      {        test: //.css(/?.*)?$/,        oneOf: [          {            // 通過(guò)resourceQuery來(lái)匹配?modules            resourceQuery: /modules/,            use: [postcssLoader],            // type聲明指定為cssModules解析            type: 'css/module'          },          {            use: [postcssLoader],            // type聲明指定為普通css解析            type: 'css'          },        ]      },      {        test: //.less(/?.*)?$/,        oneOf: [          {            resourceQuery: /modules/,            use: [postcssLoader, lessLoader],            type: 'css/module'          },          {            use: [postcssLoader, lessLoader],            type: 'css'          },        ]      },    ]  }}

但實(shí)際上上述的配置并不能直接跑起來(lái),運(yùn)行時(shí)會(huì)提示構(gòu)建報(bào)錯(cuò)(RuntimeError: out of bounds memory accesSS),錯(cuò)誤如下圖:xlO28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片xlO28資訊網(wǎng)——每日最新資訊28at.com

結(jié)合github上的相關(guān)issue最終定位為swc_core版本不兼容的問(wèn)題導(dǎo)致。xlO28資訊網(wǎng)——每日最新資訊28at.com

原因詳解:xlO28資訊網(wǎng)——每日最新資訊28at.com

  • Rspack使用的swc_core為0.88.x~0.89.x對(duì)應(yīng)@swc/core為@swc/core@1.3.106~@swc/core@1.3.107(swc官網(wǎng)可見(jiàn))。
  • swc-plugin-auto-css-modules的@1.6.0雖然在文檔上寫著是兼容>= 1.3.106版本,但實(shí)際上由于其內(nèi)部使用了swc_core@0.90.13(詳見(jiàn)Github源碼)。
  • 但swc在0.90.x進(jìn)行了ast的重構(gòu),跟之前的版本有了較大出入,導(dǎo)致無(wú)法生成的wasm調(diào)用無(wú)法兼容。

問(wèn)題解決辦法:實(shí)際上只要通過(guò)將swc-plugin-auto-css-modules的swc_core版本修改為0.88.x~0.89.x這個(gè)范圍內(nèi),再編譯出新的wasm文件即可解決;若有其他類似情況,也可以借鑒一下。xlO28資訊網(wǎng)——每日最新資訊28at.com

具體操作步驟:xlO28資訊網(wǎng)——每日最新資訊28at.com

  • 將swc-plugin-auto-css-modules的swc_core修改版本后,在本地構(gòu)建生成一個(gè)wasm文件,并放到項(xiàng)目?jī)?nèi)。
  • swc的plugin修改為引入本地構(gòu)建的wasm文件,其配置如下。
plugins: [  // ...此處其他配置內(nèi)容  // 添加 swc-plugin-auto-css-modules 插件執(zhí)行?modules的注入  // 刪掉原有的 swc-plugin-auto-css-modules 引入  - [require.resolve('swc-plugin-auto-css-modules'), {}]  // 修改為引入項(xiàng)目相對(duì)目錄下的swc_plugin_auto_css_modules.wasm(因?yàn)殚_(kāi)源的發(fā)版有發(fā)版周期,先進(jìn)行自編譯使用)  + [path.join(__dirname, '../../swc-plugins/swc_plugin_auto_css_modules.wasm'), {}],]

影響編譯效率的devtool: "source-map"xlO28資訊網(wǎng)——每日最新資訊28at.com

在以往使用webpack的devtool時(shí),也能感受到有一定的性能開(kāi)銷;同時(shí)在Rspack中,官方文檔中也有說(shuō)明當(dāng)devtool開(kāi)啟并設(shè)置sourcemap時(shí)有性能開(kāi)銷。官方文檔:xlO28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片xlO28資訊網(wǎng)——每日最新資訊28at.com

實(shí)際體驗(yàn)下來(lái),source-map的模式損耗確實(shí)是大,大約會(huì)增加30%的耗時(shí),而其他一些模式在構(gòu)建損耗上會(huì)有所優(yōu)化,具體可視使用情況來(lái)選擇建議在開(kāi)發(fā)測(cè)試環(huán)境不使用,僅在線上等需要的環(huán)境開(kāi)啟。相同應(yīng)用和機(jī)器環(huán)境,不同devtool的幾種測(cè)試表現(xiàn)如下:xlO28資訊網(wǎng)——每日最新資訊28at.com

devtool: source-map(40.82s)devtool: source-map(40.82s)xlO28資訊網(wǎng)——每日最新資訊28at.com

devtool: cheap-module-source-map(39.46s)devtool: cheap-module-source-map(39.46s)xlO28資訊網(wǎng)——每日最新資訊28at.com

devtool: eval(32.94s)devtool: eval(32.94s)xlO28資訊網(wǎng)——每日最新資訊28at.com

devtool: false (31.21s)devtool: false (31.21s)xlO28資訊網(wǎng)——每日最新資訊28at.com

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

可能你不知道的低效代碼

在前面的內(nèi)容中有提到babel-plugin-import按需引入的利器,但在業(yè)務(wù)項(xiàng)目中也有發(fā)現(xiàn),應(yīng)用/組件中有直接引入.../dist/antd.less的情況。若在項(xiàng)目中有這種情況,實(shí)際上就是打包了多次antd的樣式,非但沒(méi)有作用反而讓構(gòu)建打包和應(yīng)用訪問(wèn)性能更差。xlO28資訊網(wǎng)——每日最新資訊28at.com

以下為英特爾i5芯片差異情況(M2等芯片在耗時(shí)上會(huì)縮小一些):xlO28資訊網(wǎng)——每日最新資訊28at.com

在css-moduels中(比如:大多數(shù)頁(yè)面less、組件less):每引入一次,大約增加6~7s左右構(gòu)建時(shí)間,css文件大約增加660kb。xlO28資訊網(wǎng)——每日最新資訊28at.com

在非css-moduels中(比如:global.less):每引入一次,大約增加4~5s構(gòu)建時(shí)間,css文件大約增加530kb。xlO28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-100464-0.html基于Rspack實(shí)現(xiàn)大倉(cāng)應(yīng)用構(gòu)建提效實(shí)踐

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

上一篇: 如何在 Flutter 中實(shí)現(xiàn) 2D 可滾動(dòng)的表格,探索 Flutter 中的二維可滾動(dòng)項(xiàng),表格解決方案

下一篇: 消息隊(duì)列中間件詳解,你學(xué)會(huì)了嗎?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Mate60手機(jī)殼曝光 致敬自己的經(jīng)典設(shè)計(jì)

    8月3日消息,今天下午博主數(shù)碼閑聊站帶來(lái)了華為Mate60的第三方手機(jī)殼圖,可以讓我們?cè)谡鏅C(jī)發(fā)布之前看看這款華為全新旗艦的大致輪廓。從曝光的圖片看,Mate 60背后攝像頭面積依然
  • 服務(wù)存儲(chǔ)設(shè)計(jì)模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數(shù)據(jù)從主存儲(chǔ)加載到KV緩存中,加速后續(xù)的訪問(wèn)。在存在重復(fù)度的場(chǎng)景,Cache-Aside可以提升服務(wù)性能,降低底層存儲(chǔ)的壓力,缺點(diǎn)是緩存和底
  • 使用LLM插件從命令行訪問(wèn)Llama 2

    最近的一個(gè)大新聞是Meta AI推出了新的開(kāi)源授權(quán)的大型語(yǔ)言模型Llama 2。這是一項(xiàng)非常重要的進(jìn)展:Llama 2可免費(fèi)用于研究和商業(yè)用途。(幾小時(shí)前,swyy發(fā)現(xiàn)它已從LLaMA 2更名為L(zhǎng)la
  • WebRTC.Net庫(kù)開(kāi)發(fā)進(jìn)階,教你實(shí)現(xiàn)屏幕共享和多路復(fù)用!

    WebRTC.Net庫(kù):讓你的應(yīng)用更親民友好,實(shí)現(xiàn)視頻通話無(wú)痛接入! 除了基本用法外,還有一些進(jìn)階用法可以更好地利用該庫(kù)。自定義 STUN/TURN 服務(wù)器配置WebRTC.Net 默認(rèn)使用 Google 的
  • 2023年,我眼中的字節(jié)跳動(dòng)

    此時(shí)此刻(2023年7月),字節(jié)跳動(dòng)從未上市,也從未公布過(guò)任何官方的上市計(jì)劃;但是這并不妨礙它成為中國(guó)最受關(guān)注的互聯(lián)網(wǎng)公司之一。從2016-17年的抖音強(qiáng)勢(shì)崛起,到2018年的“頭騰
  • ESG的面子與里子

    來(lái)源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大“烤”之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報(bào)告。ESG是“環(huán)境保
  • 華為HarmonyOS 4.0將于8月4日發(fā)布 或搭載AI大模型技術(shù)

    華為宣布HarmonyOS4.0將于8月4日正式發(fā)布。此前,華為已經(jīng)針對(duì)開(kāi)發(fā)者公布了HarmonyOS4.0,以便于開(kāi)發(fā)者提前進(jìn)行適配,也因此被曝光出了一些新系統(tǒng)的特性
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價(jià)位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個(gè)版本,其中標(biāo)準(zhǔn)版搭載高通驍龍8+,而Pro版更是首發(fā)搭載了聯(lián)發(fā)科天璣9200+旗艦
  • 蘋果MacBook Pro 2021測(cè)試:仍不支持平滑滾動(dòng)

    據(jù)10月30日9to5 Mac 消息報(bào)道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯(cuò)的評(píng)價(jià),亮點(diǎn)包括行業(yè)領(lǐng)先的性能,令人印象深刻的電池續(xù)航,精美豐
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲校园激情| 一区二区黄色| 国产精品久久波多野结衣| 欧美日韩一级视频| 国产欧美日韩综合一区在线播放| 国产日韩精品一区二区| 在线观看亚洲a| 亚洲精品少妇30p| 亚洲尤物在线| 久久久蜜臀国产一区二区| 欧美va亚洲va国产综合| 欧美午夜精品一区二区三区| 国产日韩欧美视频在线| 最近看过的日韩成人| 亚洲性视频h| 久久深夜福利免费观看| 欧美国产在线视频| 国产精品视频一区二区三区| 在线精品国精品国产尤物884a| 久久久久久日产精品| 亚洲欧美中文日韩在线| 久久青青草综合| 国产精品ⅴa在线观看h| 国内外成人免费视频 | 亚洲高清在线精品| 一本色道久久88综合亚洲精品ⅰ| 欧美一区影院| 欧美屁股在线| 国产一区日韩二区欧美三区| 99精品国产在热久久下载| 久久精品国产精品亚洲| 欧美日韩一区二区免费在线观看| 国产一区二区日韩精品| 一区二区冒白浆视频| 久久亚洲高清| 国产精品人人做人人爽人人添| 亚洲国产精品成人精品| 欧美一级视频免费在线观看| 欧美精品久久久久a| 国产在线精品一区二区中文| 亚洲天堂av图片| 欧美a级片网| 国产一区二区黄色| 亚洲视频精选| 欧美第一黄色网| 韩国三级电影久久久久久| 亚洲视频免费在线观看| 免费观看30秒视频久久| 国产欧美一级| 亚洲视频一区二区| 欧美成人一区二区| 极品少妇一区二区三区| 亚洲一区影院| 欧美日韩午夜在线视频| 亚洲国产精品国自产拍av秋霞| 久久riav二区三区| 国产精品老牛| 国产精品99久久久久久有的能看| 欧美电影在线观看| 1000部精品久久久久久久久 | 欧美日本在线观看| 亚洲国产成人在线播放| 久久激情五月婷婷| 国产精品美女一区二区| 一区二区三区你懂的| 欧美激情1区2区3区| 亚洲大片一区二区三区| 久久久久久香蕉网| 狠狠色丁香久久综合频道| 欧美伊人久久久久久久久影院| 国产精品igao视频网网址不卡日韩| 亚洲精品永久免费精品| 欧美大片国产精品| 亚洲国产欧美一区二区三区丁香婷| 久久青草久久| 在线免费日韩片| 久久综合给合久久狠狠色| 韩国女主播一区| 久久久91精品国产| 国外精品视频| 久久久久高清| 激情成人亚洲| 久久综合激情| 亚洲黄色免费电影| 欧美国产另类| 亚洲麻豆视频| 欧美色精品在线视频| 亚洲无限乱码一二三四麻| 欧美丝袜一区二区| 亚洲一区二区三区欧美| 国产精品a久久久久| 亚洲一区二区成人| 国产精品一区二区欧美| 欧美亚洲视频在线看网址| 国产日韩精品在线播放| 久久精品国产69国产精品亚洲| 国内精品久久久久久 | 欧美日韩一区二区三区在线| 一区二区三区日韩欧美| 国产精品成人观看视频免费| 午夜精品www| 国产综合欧美| 麻豆freexxxx性91精品| 亚洲精品久久久久久久久久久久| 欧美精品激情| 亚洲天堂av在线免费| 国产精品一区二区三区久久久 | 91久久精品www人人做人人爽| 欧美精品日韩| 亚洲永久精品大片| 国产亚洲成人一区| 麻豆成人精品| 99国产精品国产精品久久| 欧美婷婷久久| 欧美影院视频| 亚洲国产毛片完整版| 欧美日韩一区自拍| 欧美在线不卡| 亚洲激情网址| 国产精品日韩二区| 久久一区二区三区av| 亚洲精品一区二区三区樱花| 国产精品高清网站| 久久久精品2019中文字幕神马| 亚洲欧洲日本一区二区三区| 国产精品高潮久久| 久久免费国产精品1| 亚洲精品国产精品久久清纯直播 | 性感少妇一区| 亚洲高清视频的网址| 欧美日韩一区国产| 久久爱另类一区二区小说| 亚洲日本中文字幕| 国产精品资源| 欧美国内亚洲| 欧美一区激情视频在线观看| 亚洲茄子视频| 国产欧美一区二区三区久久| 欧美成人免费网| 亚洲欧美激情在线视频| 亚洲国产成人av好男人在线观看| 国产精品国产福利国产秒拍| 六月婷婷一区| 亚洲中字在线| 亚洲激情在线激情| 国产欧美一区二区精品忘忧草| 欧美乱妇高清无乱码| 久久高清国产| 国产精品99久久久久久人| 亚洲第一福利在线观看| 国产精品久久久久久久电影 | 亚洲欧美国产视频| 亚洲国产日韩在线| 国产深夜精品福利| 欧美日韩一区成人| 美脚丝袜一区二区三区在线观看 | 欧美亚洲动漫精品| 欧美福利视频在线| 久久久国际精品| 亚洲一区在线看| 亚洲精品一区二区在线| 黑人操亚洲美女惩罚| 国产精品久久二区| 欧美日韩大片| 久久夜色精品国产欧美乱极品| 亚洲欧美日韩另类精品一区二区三区| 最新亚洲激情| 有码中文亚洲精品| 国产日韩精品在线观看| 欧美三级电影一区| 国产亚洲欧洲997久久综合| 免费成人你懂的| 久久精品99国产精品日本| 亚洲一区二区毛片| 日韩亚洲欧美高清| 亚洲国产欧美不卡在线观看| 国内精品美女av在线播放| 国产精品久久综合| 欧美三级电影大全| 欧美激情一区二区在线 | 欧美影院成人| 亚洲欧美一区二区三区极速播放| 一本色道久久综合亚洲91| 亚洲国产经典视频| 伊人久久大香线蕉综合热线 | 亚洲欧美日韩第一区| av成人老司机| 亚洲欧洲偷拍精品| 欧美日韩国产探花| 国产欧美va欧美va香蕉在| 亚洲日本中文字幕免费在线不卡| 欧美一区二区三区免费视频| 99亚洲精品| 国内精品一区二区三区| 欧美亚洲一级片| 亚洲青涩在线| 国产精品免费网站在线观看| 午夜精品一区二区三区电影天堂 | 亚洲欧美一区二区视频| 欧美肉体xxxx裸体137大胆| 欧美一区二区大片| 亚洲一区二区欧美| 最近中文字幕日韩精品| 国产精品久久久亚洲一区|