Webpack5 多頁面的項目實踐
更新時間:2025年07月11日 11:13:19 作者:藍精靈001
本文主要介紹了Webpack5 多頁面的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
特性維度 | 單頁面應用-SPA | 多頁面統(tǒng)一目錄-MPA | 多頁面單獨部署-MPA |
---|---|---|---|
入口數量 | 單個,只有一個 HTML 文件 | 多個,多個 HTML 文件 | 多個,多個 HTML 文件,分別打包輸出 |
資源輸出結構 | 所有資源輸出到統(tǒng)一目錄(如 js/, css/) | 所有頁面的資源共用 js/, css/ 等目錄 | 每頁資源放在各自目錄(如 index/js/, index/css/) |
公共資源復用 | 高:依賴打入主包或懶加載 chunk,資源完全共享 | 中:可通過 splitChunks 提取公共模塊,多個頁面共用依賴 | 低:默認每個頁面依賴重復打包,需通過 CDN 或構建優(yōu)化共享資源 |
首屏加載速度 | 中低:主包體積大需優(yōu)化 | 高:每頁只加載自身資源 | 高:每頁打包獨立、加載自身資源 |
項目推薦模式 | 用戶交互復雜、狀態(tài)集中、路由頻繁 | 頁面之間結構清晰、流程獨立但資源共用 | 需要頁面級灰度、子模塊獨立開發(fā)與部署 |
1. 示例多頁面配置
- 配置外部依賴、CDN 資源以及頁面級 CDN 擴展
- 自動生成入口和 HtmlWebpackPlugin 實例
- 導出生成的入口配置、插件配置、依賴過濾配置
- entries:入口配置對象(用于 entry)
- plugins:HtmlWebpackPlugin 實例數組(用于 plugins)
- externals:供主配置使用(用于排除模塊打包)
1.1多頁面統(tǒng)一目錄(MPA)
dist/ ├── test1.html ├── test2.html ├── js/ │ ├── test1.[hash].js │ └── test2.[hash].js └── 圖片、字體等資源
const path = require("path"); const glob = require("glob"); const { merge } = require("webpack-merge"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const resolve = (dir) => path.resolve(__dirname, "..", dir); // 打包排除某些依賴 const externals = { vue: "Vue", vuex: "Vuex", "vue-router": "VueRouter", axios: "axios", vant: "vant", }; // cdn資源 const assetsCDN = { // 開發(fā)環(huán)境 dev: { css: ["http://xxx/npm/vant@2.12/lib/index.css"], js: ["http://xxx/npm/eruda@2.4/eruda.min.js"], }, // 生產環(huán)境 build: { css: ["http://xxx/npm/vant@2.12/lib/index.css"], js: [ "http://xxx/npm/vue@2.6/dist/vue.min.js", "http://xxx/npm/vuex@3.6/dist/vuex.min.js", "http://xxx/npm/vue-router@3.5/dist/vue-router.min.js", "http://xxx/npm/axios@0.21/dist/axios.min.js", "http://xxx/npm/vant@2.12/lib/vant.min.js", ], }, }; const entryCDN = { test: { dev: merge(assetsCDN.dev, { css: [], js: ["http://res.wx.qq.com/open/js/jweixin-1.6.0.js"], }), build: merge(assetsCDN.build, { css: [], js: ["http://res.wx.qq.com/open/js/jweixin-1.6.0.js"], }), }, }; const getEntry = () => { // 多頁面打包的入口集合 const entries = {}; // 多頁面打包的模板集合 const plugins = []; // 借助 glob 獲取 src 目錄下的所有入口文件 const globPath = resolve("src/views/**/main.js"); // 遍歷文件集合,生成所需要的 entries、plugins 集合 glob.sync(globPath).map((item) => { const match = item.match(/src/views/(.*)/main.js$/); const name = match?.[1]; entries[name] = [item]; // CDN配置 const env = process.env.NODE_ENV === "production" ? "build" : "dev"; const pageCDN = (entryCDN[name] && entryCDN[name][env]) || assetsCDN[env]; if (!entryCDN[name]) { console.warn(`頁面 ${name} 未配置 entryCDN,已使用默認配置`); } // 多頁面所需要的模板集合 plugins.push( new HtmlWebpackPlugin({ title: "", filename: `${name}.html`, template: "public/index.html", favicon: "public/favicon.ico", chunks: [name], minify: process.env.NODE_ENV === "production" ? { //壓縮HTML文件 removeComments: true, // 移除HTML中的注釋 collapseWhitespace: true, // 刪除空白符和換行符 } : false, cdn: process.env.NODE_ENV === "production" ? entryCDN[name].build : entryCDN[name].dev, }) ); }); // 對外輸出頁面打包需要的 入口集合、依賴過濾 return { entries, plugins, externals }; }; module.exports = getEntry();
const { entries, plugins, externals } = require("./entry"); entry: { base: ["core-js/stable", "regenerator-runtime/runtime"], ...entries }
1.2多頁面單獨部署(MPA)
dist/ ├── test1/ │ ├── index.html │ └── js/ │ └── test1.[hash].js └── test2/ ├── index.html └── js/ └── test2.[hash].js
// 在多頁面統(tǒng)一目錄的基礎上新增配置 const CopyWebpackPlugin = require("copy-webpack-plugin"); const getEntry = () => { // 多頁面打包的入口集合 const entries = {}; // 多頁面打包的模板集合 const plugins = []; // 借助 glob 獲取 src 目錄下的所有入口文件 const globPath = resolve("src/views/**/main.js"); const base = ["core-js/stable", "regenerator-runtime/runtime"]; // 遍歷文件集合,生成所需要的 entries、plugins 集合 glob.sync(globPath).map(item => { const match = item.match(/src/views/(.*)/main.js$/); const name = match?.[1]; entries[name] = [...base, item]; const env = process.env.NODE_ENV === "production" ? "build" : "dev"; const pageCDN = (entryCDN[name] && entryCDN[name][env]) || assetsCDN[env]; if (!entryCDN[name]) { console.warn(`頁面 ${name} 未配置 entryCDN,已使用默認配置`); } // 多頁面所需要的模板集合 plugins.push( new HtmlWebpackPlugin({ title: "", filename: `${name}/index.html`, template: "public/index.html", // favicon: "public/favicon.ico", chunks: [name], minify: process.env.NODE_ENV === "production" ? { //壓縮HTML文件 removeComments: true, // 移除HTML中的注釋 collapseWhitespace: true // 刪除空白符和換行符 } : false, cdn: pageCDN }), new CopyWebpackPlugin({ patterns: [{ from: "public/favicon.ico", to: `${name}/favicon.ico` }] }) ); }); // 對外輸出頁面打包需要的 入口集合、依賴過濾 return { entries, plugins, externals }; };
// 1. 注釋掉 entry base 的配置 // 2. css、img、font的filename 增加 [name]/ splitChunks: false // ? 禁用公共拆包
到此這篇關于Webpack5 多頁面的項目實踐的文章就介紹到這了,更多相關Webpack5 多頁面內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
javascript 限制輸入和粘貼(IE和火狐3.x下測試通過)
限制輸入和粘貼的js代碼2008-11-11不用AJAX和IFRAME,說說真正意義上的ASP+JS無刷新技術
注明:以下方法都經過實例和開發(fā)的長期驗證,其實這些技術早就有,今天只不過自己歸納一下2008-09-09BootStrap Table復選框默認選中功能的實現代碼(從數據庫獲取到對應的狀態(tài)進行判斷是否為選中狀態(tài))
本文通過實例代碼給大家介紹了BootStrap Table復選框默認選中功能(從數據庫獲取到對應的狀態(tài)進行判斷是否為選中狀態(tài)),代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-07-07