当前位置: 首页 > backend >正文

理解vue-cli中的webpack

🌱 什么是 Vue CLI?

Vue CLI(Command Line Interface) 是 Vue.js 官方提供的项目构建工具,可以快速构建标准化的 Vue 项目结构,内置开发服务器、热更新、构建优化、插件系统等功能。

特点

  • ✅ 快速搭建项目结构
  • ✅ 内置开发服务器(基于 webpack-dev-server)
  • ✅ 开箱即用的构建配置(Webpack、Babel、PostCSS 等)
  • ✅ 插件式架构,灵活扩展
  • ✅ GUI 图形界面(vue ui)

🔧 安装与初始化项目

安装 Vue CLI

npm install -g @vue/cli

yarn global add @vue/cli

安装成功后可用命令:

vue --version

创建新项目

vue create my-project

你将看到交互提示:

  • 手动选择功能(如 Babel, Router, Vuex, CSS 预处理器等)
  • 选择 Vue 版本(2 或 3)
  • 保存为预设配置

启动开发服务器

cd my-project
npm run serve

默认运行在 http://localhost:8080

🧱 项目结构说明

my-project/
├── public/                  # 静态资源,index.html 模板在此
├── src/
│   ├── assets/              # 静态资源
│   ├── components/          # Vue 组件
│   ├── views/               # 页面视图(通常配合 Vue Router)
│   ├── App.vue              # 根组件
│   ├── main.js              # 入口文件
├── package.json             # 项目信息和依赖
├── babel.config.js          # Babel 配置
└── vue.config.js            # CLI 配置文件(可选)

Vue CLI 中的 Webpack

🌐 Vue CLI 中的 Webpack 是如何工作的?

Vue CLI 使用 Webpack 作为构建工具的核心引擎,但它通过封装和插件化,让开发者不需要手动编写繁杂的 webpack.config.js,而是通过插件和配置项间接控制 Webpack 行为。

默认集成:

创建项目时,Vue CLI 自动为你配置:
• Babel(通过 babel-loader)
• CSS 预处理器
• .vue 文件处理(vue-loader)
• Dev Server 热更新(webpack-dev-server)
• 文件资源(file-loader, url-loader)
• 懒加载支持(splitChunks)
• Hash 命名和 Tree-shaking 优化

🛠 方式一:通过 vue.config.js 覆盖 Webpack 配置

vue.config.js 是 Vue CLI 提供的配置文件,用于修改 Webpack 配置,支持三种方式:

✅ 简单配置方式

// vue.config.js
module.exports = {outputDir: 'dist',assetsDir: 'static',lintOnSave: true,productionSourceMap: false
}

✅ 通过 configureWebpack 修改配置

适合简单合并 Webpack 配置:

module.exports = {configureWebpack: {resolve: {alias: {'@img': '@/assets/images'}},externals: {vue: 'Vue'}}
}

✅ 通过 chainWebpack 使用 webpack-chain 精细控制

适合复杂修改(推荐方式):

module.exports = {chainWebpack: config => {// 删除预加载config.plugins.delete('preload')config.plugins.delete('prefetch')// 添加别名config.resolve.alias.set('@components', '@/components')// 修改 loader 选项config.module.rule('vue').use('vue-loader').tap(options => {options.compilerOptions.whitespace = 'preserve'return options})}
}

🔍 常见 Webpack 配置项详解

alias(别名)

config.resolve.alias.set('@utils', path.resolve(__dirname, 'src/utils'))

externals(防止打包外部库)

configureWebpack: {externals: {vue: 'Vue',axios: 'axios'}
}

然后你需要手动引入 CDN:

<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>

修改 CSS 相关 Loader

module.exports = {chainWebpack: config => {config.module.rule('scss').oneOf('vue').use('sass-loader').tap(options => {options.additionalData = `@import "@/styles/variables.scss";`return options})}
}

SVG 精细处理

chainWebpack: config => {const svgRule = config.module.rule('svg')svgRule.uses.clear()svgRule.use('svg-sprite-loader').loader('svg-sprite-loader').options({symbolId: 'icon-[name]'})
}

📦自定义 Loader & Plugin 示例

添加自定义 Loader

chainWebpack: config => {config.module.rule('txt').test(/\.txt$/).use('raw-loader').loader('raw-loader')
}

添加自定义 Plugin

const WebpackBar = require('webpackbar')configureWebpack: {plugins: [new WebpackBar()]
}

🧬查看 Webpack 最终配置的方法

使用 CLI 命令:

vue inspect > output.js

会将完整的 Webpack 配置导出到 output.js 中,非常适合调试和学习。

你也可以直接打印部分信息:

vue inspect --rules
vue inspect --plugins

🚀 构建优化相关 Webpack 方法

代码分包(Code Splitting)

Vue Router 支持懒加载:

const Home = () => import('@/views/Home.vue')

自动被打包为独立 chunk。

分离 vendor 和 runtime(优化缓存)

configureWebpack: {optimization: {splitChunks: {chunks: 'all'},runtimeChunk: 'single'}
}

关闭生产环境 source map

productionSourceMap: false

可减少打包体积和防止源码泄露。

🧭 Vue CLI 中 Webpack 的使用方法对比表

方法功能适用场景
vue.config.js 常规配置快速调整路径、端口、map 等基础修改
configureWebpack合并对象,简单增强添加插件、externals 等
chainWebpack精细修改、链式调用修改 loader、plugin、规则顺序等
vue inspect查看实际配置调试或学习
自定义 plugin / loader注入复杂逻辑特殊构建需求
http://www.xdnf.cn/news/9362.html

相关文章:

  • Minktec 柔性弯曲传感器,灵敏捕捉坐姿弓背、精准监测行走姿态,守护儿童背部健康,为科学健身提供数据支撑,开启职业健康与背痛 AI 干预新方向。
  • vue + ant-design + xlsx 实现Excel多Sheet页导出功能
  • 如何通过ETL对WebService进行调用
  • 顶会新方向:卡尔曼滤波+目标检测
  • Java 程序求圆弧段的面积(Program to find area of a Circular Segment)
  • Mico 1.33.1 | 解锁高级版 上千种自定义组件 动态壁纸
  • Java String函数的使用
  • 016搜索之广度优先BFS——算法备赛
  • word中表格拉不动以及插入图片有间距
  • MySQL的参数 innodb_force_recovery 详解
  • vue3+element-plus el-date-picker日期、年份筛选设置本周、本月、近3年等快捷筛选
  • JavaEE初阶-网络编程
  • 使用Mathematica绘制随机多项式的根
  • OpenCV---findCountours
  • [java八股文][JavaSpring面试篇]SpringBoot
  • 前端Vue3列表滑动无限加载实现
  • 佰力博科技与您谈谈高温介电温谱仪如何保养
  • ROS2学习(15)------ROS2 TF2 机器人坐标系管理器
  • MySQL问题:MySQL中使用索引一定有效吗?如何排查索引效果
  • LeetCode-栈-最小栈
  • 现代 CSS 高阶技巧:实现平滑内凹圆角的工程化实践
  • UDP 传输时间(延迟)
  • 关于Oracle SGA内存抖动
  • FastAPI 异常处理
  • vscode ssh远程服务端设置
  • OpenCV视觉图片调整:从基础到实战的技术指南
  • PH热榜 | 2025-05-26
  • hive 笔记
  • WEB安全--RCE--webshell HIDS bypass4
  • PostgreSQL auto_explain