Vue.config.js中的Webpack配置、優化及多頁面應用開發

Vue.config.js中的Webpack配置、優化及多頁面應用開發

在Vue CLI 3+項目中,vue.config.js文件是工程化配置的核心入口,它通過集成Webpack配置、優化策略和多頁面開發支持,為項目構建提供高度可定制化的解決方案。本文將從基礎配置、性能優化、多頁面開發三個維度展開,結合實際案例與配置技巧,幫助開發者系統性掌握Vue項目的工程化實踐。

一、基礎配置:從環境適配到資源管理

1. 部署路徑與靜態資源管理

publicPath是Vue項目部署的核心參數,它決定了靜態資源的引用路徑。在生產環境中,若項目部署在CDN或非根目錄時,需顯式配置:

module.exports = {publicPath: process.env.NODE_ENV === 'production' ? 'https://cdn.example.com/subpath/' : '/'
}

通過環境變量動態切換路徑,可避免硬編碼導致的部署問題。對于靜態資源輸出目錄,outputDirassetsDir可實現精細化控制:

module.exports = {outputDir: 'dist/server', // 構建輸出目錄assetsDir: 'static/assets' // 靜態資源子目錄
}

此配置將CSS/JS文件輸出至dist/server/static/assets,便于Nginx等服務器配置靜態資源路徑。

2. 開發環境優化

devServer配置通過反向代理解決跨域問題,并支持熱更新策略:

module.exports = {devServer: {proxy: {'/api': {target: 'http://backend.example.com',changeOrigin: true,pathRewrite: {'^/api': ''}}},hotOnly: true // 僅熱更新,不自動刷新頁面}
}

hotOnly模式在熱更新失敗時僅輸出控制臺警告,避免頁面刷新導致狀態丟失,適合復雜組件開發場景。

3. 代碼質量與構建產物控制

  • ESLint集成:通過lintOnSave控制保存時是否觸發代碼檢查,開發環境建議開啟以實時發現問題。
  • Source Map生成:生產環境關閉productionSourceMap可減少構建體積:
    module.exports = {productionSourceMap: false
    }
    
  • 構建產物分析:集成webpack-bundle-analyzer插件可視化分析包體積:
    const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
    module.exports = {configureWebpack: {plugins: [new BundleAnalyzerPlugin()]}
    }
    
    運行npm run build后,瀏覽器自動打開分析頁面,直觀展示模塊依賴關系。

二、性能優化:從代碼壓縮到資源預加載

1. 代碼壓縮與Tree Shaking

Vue CLI默認啟用TerserPlugin進行JS壓縮,但可通過自定義配置進一步優化:

module.exports = {configureWebpack: config => {if (process.env.NODE_ENV === 'production') {config.optimization.minimizer = [new TerserPlugin({terserOptions: {compress: { drop_console: true } // 移除console.log}})];}}
}

此配置在生產環境移除所有console語句,減少代碼體積。

2. 資源預加載與懶加載

  • Preload/Prefetch:Vue CLI默認對初始渲染所需資源生成preload提示,對異步加載模塊生成prefetch提示。若需禁用:
    module.exports = {chainWebpack: config => {config.plugins.delete('preload');config.plugins.delete('prefetch');}
    }
    
  • 動態導入:結合Vue Router實現路由級懶加載:
    const routes = [{path: '/dashboard',component: () => import('./views/Dashboard.vue') // 動態導入}
    ];
    

3. 圖片與字體優化

  • 圖片壓縮:使用image-webpack-loader在構建時壓縮圖片:
    module.exports = {chainWebpack: config => {config.module.rule('images').test(/\.(png|jpe?g|gif|svg)$/).use('image-webpack-loader').loader('image-webpack-loader').options({ mozjpeg: { progressive: true }, optipng: { enabled: false } });}
    }
    
  • 字體文件處理:通過url-loader將小字體文件轉為Base64內聯:
    config.module.rule('fonts').test(/\.(woff2?|eot|ttf|otf)$/).use('url-loader').loader('url-loader').options({ limit: 8192 }); // 小于8KB的文件轉為Base64
    

4. Gzip壓縮

通過compression-webpack-plugin生成.gz文件,減少服務器傳輸體積:

const CompressionPlugin = require('compression-webpack-plugin');
module.exports = {configureWebpack: {plugins: [new CompressionPlugin({algorithm: 'gzip',test: /\.(js|css|html|svg)$/,threshold: 10240, // 大于10KB的文件才壓縮minRatio: 0.8})]}
}

Nginx需配置gzip_static on以優先使用預壓縮文件。

三、多頁面開發:從配置到路由管理

1. 多入口配置

pages選項是Vue CLI實現多頁面開發的核心,通過定義入口文件、模板和輸出配置生成多個HTML:

module.exports = {pages: {index: {entry: 'src/pages/index/main.js',template: 'public/index.html',filename: 'index.html',title: '首頁',chunks: ['chunk-vendors', 'chunk-common', 'index']},admin: {entry: 'src/pages/admin/main.js',template: 'public/admin.html',filename: 'admin.html',title: '管理后臺',chunks: ['chunk-vendors', 'chunk-common', 'admin']}}
}

每個頁面需獨立創建入口文件(如src/pages/index/main.js)和Vue實例:

import Vue from 'vue';
import App from './App.vue';
new Vue({ render: h => h(App) }).$mount('#app');

2. 路由與狀態管理

  • 獨立路由配置:每個頁面可維護自身路由表,例如管理后臺的路由:
    // src/pages/admin/router.js
    import Vue from 'vue';
    import Router from 'vue-router';
    import Dashboard from './views/Dashboard.vue';
    Vue.use(Router);
    export default new Router({routes: [{ path: '/', component: Dashboard },{ path: '/users', component: () => import('./views/Users.vue') }]
    });
    
    在入口文件中引入路由:
    import router from './router';
    new Vue({ router, render: h => h(App) }).$mount('#app');
    
  • 狀態管理隔離:使用Vuex時,建議為每個頁面創建獨立Store實例,避免全局狀態污染。

3. 公共代碼提取

通過splitChunks優化公共依賴加載:

module.exports = {chainWebpack: config => {config.optimization.splitChunks({cacheGroups: {vendor: {test: /[\\/]node_modules[\\/]/,name: 'chunk-vendors',chunks: 'all'},common: {name: 'chunk-common',minChunks: 2,chunks: 'async',reuseExistingChunk: true}}});}
}

此配置將node_modules中的依賴打包至chunk-vendors.js,被至少兩個頁面引用的代碼打包至chunk-common.js

4. 動態標題與SEO優化

通過html-webpack-plugintitle選項實現動態標題:

module.exports = {pages: {index: { title: '首頁 - MyApp' },admin: { title: '管理后臺 - MyApp' }}
}

在模板文件中使用EJS語法插入標題:

<!-- public/index.html -->
<!DOCTYPE html>
<html>
<head><title><%= htmlWebpackPlugin.options.title %></title><meta name="description" content="首頁描述">
</head>
<body><div id="app"></div>
</body>
</html>

四、進階實踐:工程化與自動化

1. 環境變量管理

通過.env文件定義環境變量,實現差異化配置:

# .env.production
VUE_APP_API_BASE_URL=https://api.example.com
VUE_APP_ENV=production

在代碼中通過process.env.VUE_APP_API_BASE_URL訪問變量。

2. 自動化部署腳本

package.json中定義構建與部署命令:

{"scripts": {"build:prod": "vue-cli-service build --mode production","deploy": "npm run build:prod && rsync -avz dist/ user@server:/var/www/myapp"}
}

結合CI/CD工具(如Jenkins、GitHub Actions)可實現全自動部署。

3. 自定義Webpack插件

通過configureWebpackchainWebpack集成第三方插件,例如添加版權聲明:

const { BannerPlugin } = require('webpack');
module.exports = {configureWebpack: {plugins: [new BannerPlugin('Copyright (c) 2025 MyApp')]}
}

五、總結與展望

Vue.config.js的配置體系覆蓋了從基礎構建到高級優化的全流程,其核心價值在于:

  1. 靈活性:通過chainWebpackconfigureWebpack支持鏈式調用與函數式配置,滿足復雜場景需求。
  2. 約定優于配置:Vue CLI預設合理默認值,開發者僅需關注差異化配置,降低學習成本。
  3. 生態整合:無縫集成Webpack、Babel、ESLint等工具,形成標準化開發流程。

未來,隨著Vue 3的普及和Vite的崛起,構建工具將向更快的啟動速度和更簡潔的配置演進。但無論技術棧如何變化,工程化思維——包括代碼分割、性能優化、多頁面管理等核心原則——仍將是前端開發者必備的技能體系。

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

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

相關文章

行業學習【電商】:直播電商的去頭部化、矩陣號?

聲明&#xff1a;以下部分內容含AI生成這兩個詞是當前直播電商和MCN領域的核心戰略&#xff0c;理解了它們就理解了行業正在發生的深刻變化。一、如何理解“去頭部化”&#xff1f;“去頭部化” 指的是平臺或MCN機構有意識地減少對超頭部主播&#xff08;如曾經的李佳琦、薇婭&…

【MFC視圖和窗口基礎:文檔/視圖的“雙胞胎”魔法 + 單文檔程序】

大家好&#xff0c;我是你的MFC編程小伙伴&#xff01;學MFC就像探險古墓&#xff1a;到處是神秘的“房間”&#xff08;窗口&#xff09;和“寶藏”&#xff08;數據&#xff09;。今天咱們聊聊核心概念 – 視圖、窗口和文檔。這些是MFC的“骨架”&#xff0c;懂了它們&#x…

深度學習(六):代價函數的意義

在深度學習的浩瀚世界中&#xff0c;代價函數&#xff08;Cost Function&#xff09;&#xff0c;又稱損失函數&#xff08;Loss Function&#xff09;或目標函數&#xff08;Objective Function&#xff09;&#xff0c;扮演著至關重要的角色&#xff0c;它就像一個導航員&…

Kable使用指南:Android BLE開發的現代化解決方案

概述 Kable&#xff08;com.juul.kable:core&#xff09;是一個專為Android藍牙低功耗&#xff08;BLE&#xff09;開發設計的Kotlin協程友好庫。它通過提供簡潔的API和響應式編程模式&#xff0c;極大地簡化了BLE設備交互的復雜性。本文將詳細介紹Kable的使用方法&#xff0c;…

Android圖案解鎖繪制

使用到的庫是Pattern Locker,根據示例進行了修改,把默認樣式和自定義樣式進行了合并調整。 設置密碼 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xm…

Kotlin 協程之 Flow 的理解使用及源碼解析

前言 在前面的文章中&#xff0c;我們已經討論了 Channel 的概念和基本使用以及 Channel 的高階應用。這篇我們來看日常開發中更常用的Flow。 “冷流” 和 “熱流” 的本質 先來梳理一下所謂的 “冷流” 和 “熱流”。 核心概念 我們已經知道 Channel 是 “熱流”&#xff…

簡述ajax、node.js、webpack、git

本系列可作為前端學習系列的筆記&#xff0c;HTML、CSS和JavaScript系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查看&#xff01; 點贊關注不迷路&#xff01;您的點贊、關注和收藏是對小編最大的支持和鼓勵&#xff01; 系列文章目錄 簡述ajax、…

經營幫會員經營:全方位助力企業高效發展,解鎖商業新可能

在商業競爭愈發激烈的當下&#xff0c;企業若想脫穎而出&#xff0c;高效的經營管理體系至關重要。經營幫的會員經營板塊&#xff0c;憑借豐富且實用的功能&#xff0c;為企業打造了一站式的經營助力平臺&#xff0c;從多維度賦能企業&#xff0c;讓發展之路更順暢。會員經營與…

Vue 封裝Input組件 雙向通信

子組件<template><div class"box"><div class"box-left"><input blur"handleBlur" v-model"localInput" class"box-left-input"> </div><div class"box-right"><p style…

伽馬(gamma)變換記錄

此只記錄伽馬變換原理及其應用結果&#xff08;文章所有內容基于數字圖像處理-岡薩雷斯&#xff09;&#xff0c;和直接用MATLAB代碼生成伽馬變換代碼。一、原理伽馬變換的公式很簡答 就是一個有規律的冪運算 公式如下&#xff1a;一般在圖像中進行應用是 C1 y為不同值時r的輸…

電路學習(六)三極管

三極管是一種電流驅動元器件&#xff08;MOS管為電壓驅動&#xff09;&#xff0c;在電路中可以充當開關&#xff0c;放大電流等作用。本文章參考了尚硅谷的視頻資料。1. 什么是三極管&#xff1f;三極管又被稱為晶體三極管&#xff08;Bipolar Junction Transistor&#xff0c…

配置docker常見問題

輸入sudo yum install -y yum-utils device-mapper-persistent-data lvm2出現Cannot find a valid baseurl for repo: base/7/x86_64一、檢查網絡輸入ping www.baidu.com出現PING www.a.shifen.com (220.181.111.1) 56(84) bytes of data. 64 bytes from 220.181.111.1 (220.18…

Python 實戰:票據圖像自動矯正技術拆解與落地教程

在日常辦公自動化&#xff08;OA&#xff09;或財務數字化場景中&#xff0c;拍攝的票據常因角度問題出現傾斜、變形&#xff0c;不僅影響視覺呈現&#xff0c;更會導致 OCR 文字識別準確率大幅下降。本文將從技術原理到代碼實現&#xff0c;手把手教你用 Python 打造票據圖像自…

vue3+TS項目配置unocss

配置unocss &#xff08;1&#xff09;安裝依賴 npm i unocss unocss/preset-uno unocss/preset-attributify -D npm install unocss/transformer-directives&#xff08;2&#xff09;根目錄新建uno.config.ts文件 import { defineConfig } from "unocss"; impor…

嵌入式硬件工程師的每日提問

一、LDO與DC-DC的對比1&#xff09;同&#xff1a;兩者都是將不穩定的直流輸入電壓轉換為穩定的直流輸出電壓。2&#xff09;異&#xff1a;LDO&#xff1a;線性調節&#xff0c;通過內部功率晶體管&#xff0c;工作在線性區&#xff0c;穩定輸出電壓。類比&#xff1a;將湍急的…

從零到一使用Linux+Nginx+MySQL+PHP搭建的Web網站服務器架構環境——LNMP(下)

從零到一使用LinuxNginxMySQLPHP搭建的Web網站服務器架構環境——LNMP&#xff08;上&#xff09;https://coffeemilk.blog.csdn.net/article/details/151350565 一、Nginx與PHP-FPM整合原理 1.1、PHP-FPM配置文件 Nginx與PHP-FPM整合原理序號說明1 PHP-FPM是一個第三方的Fast…

論文閱讀-Correlate and Excite

文章目錄1 背景2 創新點3 方法3.1 總體結構3.2 代價體計算3.3 引導式代價體激勵&#xff08;GCE&#xff09;3.4 TopK視差回歸4 效果參考資料1 背景 在IGEV中構建幾何編碼體CGC_GCG?時用到了本文將要描述的CoEx&#xff0c;IGEV中沒有說明為什么要這樣做&#xff0c;本文就是…

探索大語言模型(LLM):Open-WebUI的安裝

前言 Open-WebUI 是一款專為大模型設計的開源可視化交互工具&#xff0c;它通過類 ChatGPT 的直觀界面&#xff0c;讓用戶無需代碼即可管理、調試和調用本地或云端的大語言模型&#xff08;LLMs&#xff09;&#xff0c;成為私有化部署的便捷工具&#xff0c;本文將介紹如何部…

企業遠程訪問方案選擇:何時選內網穿透,何時需要反向代理?

企業遠程訪問需求日益增長&#xff0c;無論是遠程辦公、分支互聯還是服務發布&#xff0c;選擇合適的網絡方案都至關重要。內網穿透和反向代理是兩種常見的技術手段&#xff0c;但它們的設計目標和適用場景截然不同。本文將客觀分析兩者的特點&#xff0c;幫助企業做出更合理的…

ARM指令集(Instruction Set)細節

ARM指令集(Instruction Set)細節 本文旨在深入探討 ARM 指令集(Instruction Set)的細節。這是一個非常廣泛的主題&#xff0c;我會將其分解為關鍵概念、不同版本的區別以及核心特性&#xff0c;并提供一些示例。 ARM 指令集的核心在于 RISC&#xff08;精簡指令集計算機&#x…