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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…