【工程化】淺談前端構建工具

一、前端構建工具概述?

前端構建工具是輔助開發者將源代碼轉換為瀏覽器可直接運行的靜態資源的工具集合。隨著前端技術的發展,源代碼往往包含瀏覽器無法直接解析的語法(如 TypeScript、Sass)、模塊化規范(如 ES Modules、CommonJS)以及需要優化的資源(如未壓縮的圖片、冗余代碼),構建工具通過一系列自動化處理(轉譯、打包、壓縮、優化等),降低開發復雜度并提升應用性能。?

構建工具的核心價值體現在三個方面:一是語法轉換,將高級編程語言或語法(如 ES6+、JSX)轉換為瀏覽器兼容的代碼;二是資源整合,將分散的模塊和資源(JS、CSS、圖片等)按規則合并,減少網絡請求;三是優化輸出,通過代碼壓縮、Tree-shaking、懶加載等技術提升應用加載和運行效率。?

所有前端構建工具的核心目標都是將源代碼轉換為可運行的靜態資源,其流程可概括為四個階段:初始化配置、模塊解析與依賴分析、資源處理與轉換、打包優化與輸出。不同工具在具體實現上存在差異,但整體遵循這一邏輯框架。?

初始化配置階段是構建流程的起點,工具會讀取配置文件(如 webpack.config.jsvite.config.js)或默認配置,確定入口文件、輸出路徑、處理規則等核心參數。模塊解析與依賴分析階段則是構建工具的 “大腦”,通過解析入口文件,遞歸識別所有依賴的模塊,構建完整的依賴關系圖。資源處理與轉換階段是對模塊內容的 “加工”,將非標準語法(如 ES6+、Sass)轉譯為瀏覽器兼容的代碼,對圖片、字體等資源進行編碼或壓縮。最后,打包優化與輸出階段將處理后的模塊按依賴關系合并,通過壓縮、分割、Tree-shaking 等技術優化資源,并輸出到指定目錄。?

二、主流打包型構建工具

2.1 Webpack?

Webpack 是一個功能全面的模塊化打包工具,以 “一切皆模塊” 為核心理念,將 JS、CSS、圖片等所有資源都視為模塊,通過依賴分析構建依賴關系圖,最終打包為瀏覽器可識別的靜態資源。其核心特征包括:

  • 支持多種模塊化規范(ES Modules、CommonJS、AMD),可處理各種類型的資源;?
  • 基于 Loader 機制轉換非 JS 資源(如 css-loader 處理 CSS,babel-loader 轉譯 ES6+);?
  • 通過 Plugin 擴展功能(如 HtmlWebpackPlugin 生成 HTML,MiniCssExtractPlugin 提取 CSS);?
  • 支持代碼分割(Code Splitting),將代碼拆分為多個 chunk 實現按需加載;?
  • 提供開發環境熱模塊替換(HMR),修改代碼后無需刷新頁面即可更新。
    ?

Webpack 的構建流程以 “插件驅動” 為核心,通過 Tapable 插件系統串聯起各個階段,具體包括:?

  • 初始化:執行webpack命令后,首先解析命令行參數和webpack.config.js配置,初始化 Compiler 對象(包含所有配置信息和插件),并觸發entry-option鉤子。?
  • 入口解析:根據entry配置找到入口文件,調用resolve模塊解析入口路徑,將其轉換為絕對路徑,觸發after-resolve鉤子確認入口。?
  • 模塊依賴分析:對入口文件進行解析,通過acorn庫將代碼解析為抽象語法樹(AST),遍歷 AST 識別import、require等依賴聲明,遞歸解析所有依賴模塊,形成依賴關系圖(ChunkGraph)。在此過程中,每個模塊會被分配唯一的 moduleId,并記錄依賴的 moduleId。?
  • 模塊轉換:對每個模塊按規則應用 Loader 鏈。例如,JS 模塊會先經babel-loader轉譯 ES6 + 語法,CSS 模塊會經 css-loader 處理@import和url(),再經style-loader轉換為 JS 模塊。Loader 處理后的模塊內容會被包裹在 module.exports 中,便于 Webpack 跟蹤。?
  • Chunk 生成:根據依賴關系圖將模塊分組為 Chunk。入口模塊所在的 Chunk 為初始 Chunk,通過 splitChunks 配置可將公共依賴(如lodash)提取為獨立 Chunk,動態導入的模塊(import())會生成新的異步 Chunk。?
  • 優化與輸出:對每個 Chunk 應用優化插件,如 TerserPlugin 壓縮 JS、CssMinimizerPlugin壓縮 CSS、TreeShakingPlugin 移除未使用代碼。最后,根據output配置將 Chunk 輸出為bundle.js等文件,同時生成 manifest.json 記錄 Chunk 與模塊的映射關系。?
  • 開發環境特殊處理:在 --mode development 模式下,Webpack 會啟動開發服務器(webpack-dev-server),通過watch模式監聽文件變化,觸發增量構建(僅重新處理修改的模塊),并通過 WebSocket 推送更新到瀏覽器,實現熱模塊替換(HMR)。

使用 Webpack 時,需先 npm install webpack webpack-cli --save-dev 安裝webpack和webpack-cli,創建 webpack.config.js 配置文件,定義入口(entry)、輸出(output)、Loader 和 Plugin 等,例如:

module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{ test: /\.js$/, use: 'babel-loader' },{ test: /\.css$/, use: ['style-loader', 'css-loader'] }]},plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })]
};

在package.json中添加腳本"build": "webpack --mode production",運行npm run build即可執行打包。

Webpack 適用于中大型前端應用,尤其是需要處理復雜資源依賴和定制化構建流程的項目,如企業級管理系統、電商平臺等,其豐富的生態可滿足多樣化需求,但配置復雜度較高,適合有一定經驗的團隊。

2.2 Vite?

Vite 是基于瀏覽器原生 ES Modules 的新一代構建工具,采用 “開發時無打包” 和 “生產時高效打包” 的模式,開發環境下直接利用瀏覽器解析 ES Modules,生產環境則使用 Rollup 進行打包。?其核心特征包括:

  • 開發啟動速度極快,無需預打包,依賴瀏覽器原生解析模塊;?
  • 支持熱模塊替換(HMR),更新速度隨項目規模增長無明顯下降;?
  • 內置對 TypeScript、JSX、CSS 預處理器(Sass/Less)的支持,無需額外配置;?
  • 生產環境通過 Rollup 打包,輸出體積小且支持 Tree-shaking;?
  • 提供開箱即用的開發服務器,支持代理、HTTPS 等功能。?

Vite 的構建流程分為開發環境和生產環境兩個截然不同的路徑,體現 “開發時無打包” 的設計理念。

開發環境流程
  • 服務器啟動:執行vite dev后,啟動基于 Koa 的開發服務器,解析vite.config.js配置,注冊中間件(如靜態資源處理、模塊解析、熱更新)。?
  • 模塊請求處理:當瀏覽器訪問入口 HTML 時,Vite 會修改 HTML 中的script標簽,將type設為module(啟用 ES Modules),并將路徑指向服務器路由。?
  • 模塊即時轉換:瀏覽器請求 JS 模塊時,服務器攔截請求,對模塊內容進行實時處理:對 ES6 + 語法調用esbuild轉譯,對 TypeScript、JSX 直接轉換為 JS,對 CSS 預處理器(Sass/Less)編譯為 CSS 后注入import語句。?
  • 依賴預構建:首次啟動時,Vite 會掃描 node_modules 中的依賴(如react、vue),通過 esbuild 將 CommonJS 模塊轉換為 ES Modules 并緩存,避免瀏覽器重復請求依賴文件,提升后續啟動速度。?
  • 熱更新觸發:通過 chokidar 監聽文件變化,當模塊修改時,生成模塊更新信息(如修改的模塊路徑、內容哈希),通過 WebSocket 發送到瀏覽器,瀏覽器僅更新該模塊及其依賴,無需刷新頁面。?
生產環境流程?
  • 依賴分析:調用 rollup 的 resolveId 和 load 鉤子解析所有模塊,構建依賴關系圖,與 Webpack 類似但更輕量。?
  • 模塊轉換:通過 @vitejs/plugin-legacy 等插件處理兼容性,將 ES6 + 語法轉換為 ES5,生成適配舊瀏覽器的代碼。?
  • 打包優化:使用 Rollup 的 Tree-shaking 移除未使用代碼,通過 splitChunks 配置拆分公共依賴,對 CSS 單獨提取為 *.css 文件。?
  • 輸出:將處理后的模塊打包為dist目錄下的 index.html、assets/index.js、assets/index.css 等文件,同時生成 manifest.json 記錄資源映射。?
使用方式
  • 初始化項目:npm create vite@latest,選擇框架(如 Vue、React)和語言;?
  • 進入項目目錄安裝依賴:npm install;?
  • 開發環境啟動:npm run dev,訪問 localhost:5173 即可實時預覽;?
  • 生產環境打包:npm run build,輸出到 dist 目錄。?

使用場景:適合現代前端框架(Vue、React、Svelte 等)的開發,尤其適合對開發效率要求高的中小型項目。其零配置特性降低了入門門檻,同時生產環境的優化輸出也能滿足性能需求,是目前前端開發的主流選擇之一。

2.3 Rollup

Rollup 是一個專注于 JavaScript 庫打包的構建工具,以輸出簡潔、高效的代碼為目標,主要采用 ES Modules 規范進行模塊處理。其核心特征包括:(1)支持 Tree-shaking 技術,自動移除未使用的代碼,輸出體積更小;(2)默認輸出 ES Modules 格式的代碼,也支持轉換為 CommonJS、UMD 等格式;(3)配置簡潔,API 設計直觀,專注于模塊打包的核心需求;(4)對 ES6 + 語法支持良好,生成的代碼可讀性高。

Rollup 的流程以 “簡潔高效” 為特點,專注于模塊打包,步驟包括:?
(1)配置解析:讀取rollup.config.js,解析input(入口)、output(輸出)等配置,初始化 Rollup 對象。?
(2)模塊解析:從入口文件開始,使用@rollup/plugin-node-resolve解析第三方依賴,@rollup/plugin-commonjs將 CommonJS 模塊轉換為 ES Modules,構建模塊依賴樹。?
(3)AST 分析與 Tree-shaking:將每個模塊解析為 AST,標記導出的變量和被引用的變量,移除未被引用的代碼(如未使用的函數、變量),這一過程比 Webpack 更徹底,因為 Rollup 僅處理 ES Modules,依賴分析更精確。?
(4)模塊合并:按依賴樹的順序將模塊內容合并,通過 output.format 配置生成不同格式的代碼(如es、cjs、umd),umd格式會自動包裹 (function (global, factory) { ... }) 匿名函數,適配瀏覽器和 Node.js 環境。?
(5)輸出:將合并后的代碼寫入output.file指定的文件,不生成額外的輔助代碼(如 Webpack 的__webpack_require__),因此輸出代碼更簡潔。

使用 Rollup 時,npm install rollup --save-dev 安裝后?創建配置文件rollup.config.js,示例如下:

export default {input: 'src/index.js',output: [{ file: 'dist/index.esm.js', format: 'es' },{ file: 'dist/index.cjs.js', format: 'cjs' }]
};

添加腳本"build": "rollup -c",運行npm run build執行打包。

使用場景:主要用于開發 JavaScript 庫或框架(如 Vue、React 的核心庫),因其輸出代碼簡潔且支持 Tree-shaking,能有效減小庫的體積。對于依賴復雜資源(如圖片、樣式)或需要大量插件擴展的應用,Rollup 的靈活性不如 Webpack。

三、任務自動化工具

3.1 Gulp?

Gulp 是基于流(Stream)的任務自動化工具,通過定義一系列自動化任務(如文件編譯、壓縮、監聽),實現前端工作流的自動化。其核心特征包括:采用流處理機制,文件在內存中流轉,減少磁盤 IO 操作,性能高效;任務定義基于代碼(而非配置),邏輯清晰,易于維護;支持任務依賴管理,可按順序執行多個任務(如先編譯 Sass,再壓縮 CSS);插件生態豐富,可處理各類任務(如 gulp-sass 編譯 Sass,gulp-uglify 壓縮 JS)。?

Gulp 基于 “流(Stream)” 機制處理文件,流程以 “任務鏈” 的形式執行,具體為:
(1)任務注冊:執行gulp命令后解析gulpfile.js,通過gulp.task()注冊任務,將注冊的任務添加到任務隊列,通過gulp.series(串行)或gulp.parallel(并行)定義任務依賴關系;
(2)文件流創建:任務執行時,通過gulp.src()讀取源文件(如./src/sass/*.scss)創建可讀流,文件內容以二進制形式在流中傳遞;
(3)流處理:通過pipe()方法將流傳遞給插件處理,如gulp-sass將 Sass 編譯為 CSS,gulp-uglify壓縮 JS,每個插件對流中的文件進行處理后返回新的流,實現 “鏈式操作”;
(4)文件輸出:處理后的流通過 gulp.dest() 寫入目標目錄(如./dist/css),完成文件輸出;
(5)任務結束:所有任務執行完畢后,觸發 end 事件,結束流程。?例如,gulp.series('compile-sass', 'minify-js') 會先執行sass編譯,完成后再執行 JS 壓縮,確保任務按順序執行。

使用 Gulp 時,安裝后創建 gulpfile.js 定義任務,例如編譯 Sass 和壓縮 JS 的任務,通過 gulp.task() 注冊并定義默認任務,運行 npx gulp 執行默認任務或指定任務。Gulp 適用于需要定制化工作流的項目,尤其是以資源處理為主的場景(如靜態網站、多頁面應用),常與其他打包工具配合使用,彌補單一工具的功能局限。

3.2 Grunt?

Grunt 是早期流行的任務自動化工具,通過配置文件定義任務,實現前端資源的自動化處理,曾是前端工程化的主流工具之一。其核心特征包括:基于配置文件(Gruntfile.js)定義任務,插件通過配置參數實現功能;插件生態龐大,支持大多數前端任務(如代碼檢查、壓縮、合并);任務執行基于文件操作,每個任務會讀取文件、處理后寫入磁盤,性能較 Gulp 略低;支持多任務并行執行,適合簡單的自動化流程。?

Grunt 的流程以 “配置驅動” 為核心,步驟相對簡單:
(1)配置加載:執行grunt命令后,讀取 Gruntfile.js 中的 initConfig 配置,解析每個任務的參數(如uglify的壓縮選項、sass的源文件路徑);
(2)任務加載:通過 loadNpmTasks 加載插件(如grunt-contrib-uglify),將插件注冊的任務添加到任務列表;
(3)文件處理:任務執行時,按配置讀取源文件內容,調用插件的處理函數(如uglify的壓縮算法)對內容進行處理,處理后的內容寫入目標文件,與 Gulp 不同,Grunt 不使用流,而是通過文件讀寫完成處理,因此性能較低;
(4)任務完成:所有任務執行完畢后輸出執行結果。?

使用 Grunt 時,安裝后創建 Gruntfile.js 配置任務參數,加載插件并注冊任務,運行npx grunt 執行任務。目前 Grunt 已逐漸被 Gulp 和現代打包工具替代,主要用于維護舊項目,對于簡單的自動化需求仍可勝任,但在復雜工作流和性能要求高的場景下不占優勢。

四、新興高效能構建工具?

4.1 Esbuild?

Esbuild 是基于 Go 語言開發的極速 JavaScript 打包和壓縮工具,專注于 JS 和 CSS 的轉譯、打包與壓縮,以遠超傳統工具的速度著稱。其核心特征包括:速度極快,比 Webpack、Rollup 等工具快 10-100 倍,得益于 Go 語言的并行處理能力;支持 ES6 + 語法轉譯、JSX 轉換、CommonJS 與 ES Modules 互轉;內置代碼壓縮、Tree-shaking 和 Source Map 生成功能;可作為獨立工具使用,也可作為其他工具的底層依賴(如 Vite 的開發環境依賴)。?

Esbuild 以 “極速并行” 為核心,基于 Go 語言的多線程能力實現高效處理,流程包括:
(1)參數解析:解析命令行參數或配置文件,確定入口文件(entryPoints)、輸出路徑(outfile)、是否壓縮(minify)等參數;
(2)依賴解析:從入口文件開始,遞歸解析 importrequire 語句,通過內置的模塊解析器處理路徑(支持 Node.js 的node_modules查找規則),構建依賴關系圖。這一步驟通過 Go 的 goroutine 實現并行解析,速度遠超 JavaScript 單線程工具;
(3)模塊轉譯:對每個模塊進行轉譯處理。將 ES6 + 的classarrow function等語法轉換為 ES5;將 JSX 轉換為React.createElement調用;將 TypeScript 轉換為 JS(僅做語法轉換,不進行類型檢查)。所有轉譯操作通過 Go 的原生函數實現,避免 JavaScript 的性能瓶頸;
(4)打包合并:按依賴關系將模塊內容合并為單個文件(bundle: true時),通過內置的壓縮算法(如 Terser 的 Go 實現)對代碼進行壓縮,移除空格、縮短變量名、合并語句;
(5)輸出:生成最終的 JS/CSS 文件和 Source Map(若開啟sourcemap),整個流程從解析到輸出通常在毫秒級完成(處理 1000 個模塊約需 100ms)。

使用 Esbuild 時,安裝后可通過命令行或配置文件執行打包,例如 esbuild src/index.js --bundle --outfile=dist/bundle.js --minify。Esbuild 適合對構建速度要求極高的場景,如 CI/CD 流程中的快速打包、開發環境的即時編譯等,由于功能相對基礎,通常作為底層工具配合其他框架使用,而非直接用于大型應用的完整構建流程。?

4.2 Turbopack?

Turbopack 是由 Vercel 開發的新一代構建工具,基于 Rust 語言編寫,定位為 “Webpack 的替代品”,專注于增量構建和極速熱更新。其核心特征包括:支持增量構建,僅重新處理修改過的文件,大幅提升二次構建速度;開發環境熱更新性能優異,宣稱比 Vite 快 53%,比 Webpack 快 10 倍;兼容 Webpack 的配置和插件生態,降低遷移成本;原生支持 React Server Components、TypeScript 等現代特性。?

Turbopack 基于 Rust 的增量計算引擎,專注于 “只處理必要的修改”,流程包括:
(1)項目初始化:解析 turbo.json 配置,確定 pipeline 中定義的任務(如build、dev)和輸出目錄,構建項目的依賴圖譜(包括子項目、共享模塊)。
(2)增量構建準備:首次構建時,對所有模塊進行完整處理(轉譯、打包),并將每個模塊的處理結果(內容哈希、依賴列表)緩存到磁盤。
(3)開發服務器啟動:啟動基于 Rust 的 HTTP 服務器,監聽文件系統變化(通過notify庫),當文件修改時,僅重新處理該模塊及其直接依賴(通過依賴圖譜定位受影響的模塊),未修改的模塊直接使用緩存結果。
(4)熱更新推送:對修改的模塊生成更新后的代碼,通過 WebSocket 發送到瀏覽器,瀏覽器通過 import.meta.hotAPI 接收更新,替換舊模塊并重新渲染,實現無刷新更新。
(5)生產打包:調用內置的打包器(兼容 Webpack 的 webpack.config.js),對模塊進行 Tree-shaking 和壓縮,輸出優化后的資源。目前這一功能仍在完善中,主要依賴 Rust 的高性能算法提升打包速度。

使用 Turbopack 時,安裝后初始化turbo.json配置文件,添加腳本通過turbo dev啟動開發服務器。Turbopack 目前處于快速發展階段,主要用于 Next.js 等框架的開發環境,適合對構建性能有極致需求的大型 React 應用,由于生態尚未成熟,暫時不建議用于生產環境的復雜項目。?

五、構建工具的選擇與對比?

不同工具的構建流程差異主要體現在三個維度。
(1)處理模式上,Webpack、Rollup 采用 “全量構建”,Vite 和 Turbopack 采用 “按需處理”,Esbuild 則通過 “并行全量” 實現高效處理;
(2)依賴管理上,Webpack 通過moduleIdChunkGraph跟蹤依賴,Vite 依賴瀏覽器的 ES Modules 解析,Turbopack 通過增量計算引擎記錄依賴關系,Esbuild 通過 goroutine 并行解析依賴;
(3)性能優化上,傳統工具依賴 JavaScript 插件,性能受限于單線程,新興工具通過底層語言(Go、Rust)和并行處理突破性能瓶頸,構建速度提升 10-100 倍。?

這些差異直接影響工具的適用場景.全量構建工具適合生產環境的完整打包,按需處理工具適合開發環境的快速反饋,并行處理工具適合對速度要求極高的 CI/CD 流程。理解構建流程的細節,有助于開發者在遇到構建問題時(如依賴解析錯誤、打包體積過大)快速定位原因,優化構建配置。具體來看:Webpack 生態豐富、功能全面,適用于中大型復雜應用;Vite 開發速度快、配置簡單,適合中小型現代框架應用;Rollup 輸出代碼簡潔,適合 JavaScript 庫開發;Gulp 工作流靈活,適用于靜態資源處理;Esbuild 構建速度極快,適合快速打包和底層工具依賴;Turbopack 增量構建快,適合現代框架開發環境。
?
選擇構建工具時,需綜合考慮項目規模、技術棧、團隊經驗以及性能需求,理解各類工具的核心原理和適用場景,能幫助開發者在面對多樣化需求時做出合理選擇,構建高效、穩定的前端工程化體系。

Q&A

Webpack 的 HMR 和 Vite的按需處理一樣嗎?

Webpack 的 HMR 與 “按需處理” 并非同一概念。Webpack 的 “全量構建” 指的是首次啟動時會打包所有模塊并構建完整依賴關系圖,之后的 HMR 是在這個全量構建結果的基礎上,通過對比模塊哈希值定位修改的模塊,僅重新編譯該模塊及其依賴的相關 chunk,再將更新后的代碼發送到瀏覽器替換舊模塊。這種模式本質上是 “全量基礎上的增量更新”,仍依賴初始的全量打包結果,項目規模越大,初始構建和依賴圖維護的成本越高。?

而 Vite 和 Turbopack 的 “按需處理” 是開發時不進行全量打包:Vite 依賴瀏覽器的 ES Modules 機制,瀏覽器請求哪個模塊才實時處理哪個模塊,沒有初始全量構建過程;Turbopack 雖然首次構建會處理所有模塊,但后續更新時僅重新處理修改模塊及其直接依賴,且依賴圖譜維護基于更輕量的增量計算,不依賴全量打包的 chunk 結構。因此,它們的 HMR 是 “按需處理基礎上的即時更新”,更新速度幾乎不受項目規模影響,這與 Webpack 在全量構建基礎上的 HMR 有本質區別。

參考資料

漫談構建工具(一): 最近對前端構建工具的一些理解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916422.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據取證:Elcomsoft Password Digger,解密 macOS (OS X) 鑰匙串信息

Elcomsoft Password Digger(EPD)是一款在 Windows 平臺上使用的工具,用于解密存儲在 macOS 鑰匙串中的信息。該工具可以將加密的鑰匙串內容導出到一個純文本 XML 文件中,方便查看和分析。一鍵字典構建功能可以將鑰匙串中的所有密碼…

2.JVM跨平臺原理(字節碼機制)

目錄引言一、跨平臺就跟國際語言翻譯似的二、字節碼和 JVM 到底是啥玩意兒三、解決 “語言不通” 這個老難題四、實現 “一次編寫,到處運行” 就這四步五、字節碼技術給世界帶來的大改變總結引言 咱平常是不是老納悶兒,為啥同一個 Java 程序&#xff0c…

06-ES6

微任務&宏任務JS是單線程執行。所有要執行的任務都要排隊。所有的同步任務會在主線程上排隊,等待執行。異步任務:不會進入主線程,而是會進入任務隊列。等到主線程上的任務執行完成之后,通知任務隊列,執行異步任務。…

FreeSWITCH配置文件解析(10) 配置IP封禁(防暴力破解)

以下是針對FreeSWITCH配置IP封禁(防暴力破解)的完整方案,結合Fail2Ban與系統級防護策略:一、Fail2Ban核心配置(推薦方案)??啟用FreeSWITCH鑒權日志??修改SIP Profile(conf/sip_profiles/int…

【React 入門系列】React 組件通訊與生命周期詳解

🧩 第一章:組件通訊概述在 React 開發中,組件是封裝的、獨立的功能單元。為了實現組件間的數據共享與協作,需要通過組件通訊機制。組件通訊的意義: 讓多個封閉的組件能夠共享數據,實現協作功能。&#x1f4…

前端開發 Vue 狀態優化

Vue 項目中的狀態優化一般都會用Pinia替代Vuex,Pinia 是 Vue 生態系統中的一個輕量級狀態管理庫,作為 Vuex 的替代品,它提供了更簡潔的 API 和更好的性能。模塊化管理:使用 Pinia 時,建議將狀態拆分為多個 store 模塊&…

虛幻基礎:創建角色——FPS

能幫到你的話,就給個贊吧 😘 文章目錄創建角色設置模型添加攝像機添加位置:插槽彈簧臂:伸縮防止由碰撞導致攝像機穿模攝像機添加武器添加位置:插槽創建動畫藍圖:主動獲取角色數據并播放相應動畫設置角色控制…

2025年入局蘋果Vision Pro開發:從零到發布的完整路線圖

蘋果Vision Pro的發布標志著空間計算(Spatial Computing)進入主流市場。作為開發者,如何快速掌握visionOS開發?本文將為你提供詳細的路線圖、實踐建議與資源指南,涵蓋從窗口式應用到沉浸式3D應用的完整開發路徑。 一、visionOS開發的核心目標與階段劃分 visionOS的開發可…

百度文心大模型ERNIE全面解析

百度文心大模型ERNIE概述 百度推出的文心大模型(ERNIE,Enhanced Representation through kNowledge IntEgration)系列是結合知識增強技術的預訓練大模型,涵蓋自然語言處理(NLP)、跨模態、行業應用等多個方向。其開源版本為開發者提供了可商用的大模型能力支持。 ERNIE的…

【SpringAI實戰】提示詞工程實現哄哄模擬器

一、前言 二、實現效果 三、代碼實現 3.1 后端實現 3.2 前端實現 一、前言 Spring AI詳解:【Spring AI詳解】開啟Java生態的智能應用開發新時代(附不同功能的Spring AI實戰項目)-CSDN博客 二、實現效果 游戲規則很簡單,就是說你的女友生氣了&#x…

速通python加密之AES加密

AES加密 AES加密(Advanced Encryption Standard,高級加密標準)是目前全球公認的最安全、應用最廣泛的對稱加密算法之一,于2001年被美國國家標準與技術研究院(NIST)確定為替代DES的標準加密算法,…

Java 對象秒變 Map:字段自由伸縮的優雅實現

前言 在開發中,我們常常需要把對象轉成 Map 格式,用于序列化、傳輸、展示,甚至硬塞給某些第三方框架吃進去再吐出來。乍一看很簡單,字段多起來后就像打翻調色盤,維護起來一不小心就翻車。想優雅地搞定這事,必須有一套穩妥、可擴展的方案,才能寫出讓同事膜拜、領導點贊、…

激光雷達-相機標定工具:支持普通相機和魚眼相機的交互式標定

激光雷達-相機標定工具:支持普通相機和魚眼相機的交互式標定 前言 在自動駕駛、機器人導航等領域,激光雷達和相機的標定是一個基礎而重要的問題。準確的標定結果直接影響后續的感知算法性能。本文將介紹一個開源的激光雷達-相機標定工具,支持…

linux shell從入門到精通(二)——變量操作

1.什么是變量變量在許多程序設計語言中都有定義,與變量相伴地有使用范圍地定義。Linux Shell也不例外。變量,本質上就是一個鍵值對。例如:str“hello”就是將字符串值“hello”賦予鍵str。在str地使用范圍內,我們都可以用str來引用…

[Linux入門] 初學者入門:Linux DNS 域名解析服務詳解

目錄 一、域名服務基礎:從 “名字” 到 “地址” 的轉換 1??什么是域名? 2??什么是 DNS? 3??DNS 用 TCP 還是 UDP? 二、DNS 服務器:各司其職的 “導航站” 1??根域名服務器 2??頂級域名服務器 3??權…

iview表單驗證一直提示為空的幾個原因?

1.Form上的rules是否配置正確; 2.Form-item的prop是否配置正確; 3.規則的名稱和input的v-model是否對應; 4.驗證的字段是否響應,新增字段使用this. $set. © 著作權歸作者所有,轉載或內容合作請聯系作者 平臺聲明&#xff1…

SpringBoot3(若依框架)集成Mybatis-Plus和單元測試功能,以及問題解決

一、Mybatis-Plus集成 新增依賴到父級pom.xml,原先的mybatis依賴可以不動需要注意 mybatis-plus與mybatis版本之間的沖突,不要輕易改動依賴,不然分頁也容易出現問題分類頂級pom.xml下面,如果沒有引入還是出現報錯,在co…

刪除遠程分支上非本分支的提交記錄

要刪除遠程分支上非本分支的提交記錄(即主分支的提交歷史),需要使用 Git 的重寫歷史功能。以下是完整解決方案: 解決方案步驟: 創建干凈的新分支(基于主分支最新提交) # 切換到主分支并更新 git…

Flask input 和datalist結合

<input list"categories" name"category" id"category" class"form-control" placeholder"任務分類" required> 這段代碼是一個 HTML 輸入控件&#xff0c;結合了 <input> 和 <datalist>&#xff0c;用來…

嵌入式分享#27:原來GT911有兩個I2C地址(全志T527)

最近在調試全志T527的觸摸功能時&#xff0c;發現GT911觸摸芯片的I2C地址有時是0x5d&#xff0c;有時又識別成0x14&#xff0c;不知道大家有沒有遇到過類似這個情況。雖然最后使用0x5d地址調通了觸摸功能&#xff0c;但是一直還是很困惑&#xff0c;為什么會出現0x14和0x5d兩個…