14-Vue2 项目构建与工程化
Vue2 项目构建与工程化现代前端开发离不开工程化工具链的支持。本章将系统讲解 Vue CLI 的使用、Webpack 配置、环境变量管理、代码规范以及打包优化策略帮助你构建生产级的 Vue 项目。一、前言随着前端项目规模的增长我们需要解决以下问题如何快速创建标准化项目结构如何管理多环境配置如何自动化代码检查和格式化如何优化打包体积和加载性能Vue CLI 是 Vue 生态的标准工具链围绕 Webpack 封装了一套完整的工程化方案。Vue 工程化项目脚手架构建配置代码规范性能优化Vue CLIWebpack环境变量ESLintPrettier代码分割压缩优化二、Vue CLI 脚手架2.1 安装与创建项目# 全局安装 Vue CLInpminstall-gvue/cli# 创建项目命令行交互vue create my-project# 使用预设快速创建vue create my-project--presetdefault2.2 预设配置选项? Please pick a preset: Default([Vue2]babel, eslint)Default(Vue3)([Vue3]babel, eslint)Manuallyselectfeatures# 手动选择? Check the features neededforyour project: ◉ Babel# JavaScript 编译器◉ TypeScript# 类型系统◉ Progressive Web App# PWA 支持◉ Router# Vue Router◉ Vuex# 状态管理◉ CSS Pre-processors# CSS 预处理器◉ Linter / Formatter# 代码规范◉ Unit Testing# 单元测试◉ E2E Testing# E2E 测试2.3 项目结构my-project/ ├── public/ # 静态资源不经过 Webpack 处理 │ ├── index.html │ └── favicon.ico ├── src/ │ ├── assets/ # 静态资源经过 Webpack 处理 │ ├── components/ # 公共组件 │ ├── views/ # 页面组件 │ ├── router/ # 路由配置 │ ├── store/ # Vuex 配置 │ ├── App.vue # 根组件 │ └── main.js # 入口文件 ├── .env # 环境变量 ├── .eslintrc.js # ESLint 配置 ├── babel.config.js # Babel 配置 ├── vue.config.js # Vue CLI 配置 └── package.json三、Vue CLI 配置3.1 vue.config.js 基础配置// vue.config.jsconst{defineConfig}require(vue/cli-service);module.exportsdefineConfig({// 基本路径publicPath:process.env.NODE_ENVproduction?/app/:/,// 输出目录outputDir:dist,// 静态资源目录assetsDir:static,// 是否使用运行时编译器runtimeCompiler:false,// 生产环境 source mapproductionSourceMap:false,// 开发服务器配置devServer:{port:8080,open:true,proxy:{/api:{target:http://localhost:3000,changeOrigin:true,pathRewrite:{^/api:}}}},// Webpack 配置configureWebpack:{plugins:[// 自定义插件]},// 链式 Webpack 配置chainWebpack:config{config.plugin(html).tap(args{args[0].titleMy App;returnargs;});}});3.2 链式配置详解// vue.config.jsmodule.exports{chainWebpack:config{// 修改已有 Loader 选项config.module.rule(vue).use(vue-loader).tap(options{return{...options,hotReload:false};});// 添加新 Loaderconfig.module.rule(markdown).test(/\.md$/).use(html-loader).loader(html-loader).end().use(markdown-loader).loader(markdown-loader);// 修改插件选项config.plugin(define).tap(args{args[0][process.env].API_URLJSON.stringify(process.env.API_URL);returnargs;});// 开发环境与生产环境不同配置config.when(process.env.NODE_ENVproduction,config{config.plugin(compression).use(require(compression-webpack-plugin),[{algorithm:gzip}]);});}};四、环境变量管理4.1 环境变量文件Vue CLI 支持通过.env文件管理环境变量# .env # 所有环境加载# .env.local # 所有环境加载不提交到 Git# .env.[mode] # 只在指定模式加载# .env.[mode].local # 只在指定模式加载不提交到 Git# .envVUE_APP_TITLEMy ApplicationVUE_APP_API_URL/api# .env.developmentVUE_APP_API_URLhttp://localhost:3000NODE_ENVdevelopment# .env.productionVUE_APP_API_URLhttps://api.example.comNODE_ENVproduction4.2 使用环境变量// 代码中使用constapiUrlprocess.env.VUE_APP_API_URL;constisDevprocess.env.NODE_ENVdevelopment;// template 中使用p{{$envTitle}}/p注意只有以VUE_APP_开头的变量才会被注入到客户端代码中。五、代码规范5.1 ESLint 配置// .eslintrc.jsmodule.exports{root:true,env:{node:true},extends:[plugin:vue/essential,eslint:recommended],parserOptions:{parser:babel/eslint-parser,requireConfigFile:false},rules:{// 自定义规则no-console:process.env.NODE_ENVproduction?warn:off,no-debugger:process.env.NODE_ENVproduction?warn:off,vue/multi-word-component-names:off,indent:[error,4],quotes:[error,single],semi:[error,always]}};5.2 Prettier 集成// .prettierrc{semi:true,singleQuote:true,tabWidth:4,trailingComma:none,printWidth:100,arrowParens:avoid}// 安装依赖npm install-Deslint-plugin-prettier eslint-config-prettier prettier// .eslintrc.js - 集成 Prettiermodule.exports{extends:[plugin:vue/essential,eslint:recommended,plugin:prettier/recommended// 添加这一行]};5.3 提交前检查npminstall-Dlint-staged husky// package.json{lint-staged:{*.{js,vue}:[eslint --fix,git add]},husky:{hooks:{pre-commit:lint-staged}}}六、打包优化6.1 代码分割// 路由懒加载constHome()import(/* webpackChunkName: home */../views/Home.vue);// 组件懒加载constHeavyComponent()import(/* webpackChunkName: heavy */../components/Heavy.vue);// 异步加载库asyncfunctionloadChart(){constechartsawaitimport(echarts);returnecharts;}6.2 优化策略// vue.config.jsmodule.exports{configureWebpack:config{if(process.env.NODE_ENVproduction){// 分离第三方库config.optimization.splitChunks{chunks:all,cacheGroups:{vendor:{name:chunk-vendors,test:/[\\/]node_modules[\\/]/,priority:10,chunks:initial},common:{name:chunk-common,minChunks:2,priority:5,chunks:initial,reuseExistingChunk:true}}};// 运行时分离config.optimization.runtimeChunk{name:runtime};}}};6.3 体积分析与优化# 分析打包体积npmrun build ----report# 或使用 webpack-bundle-analyzernpminstall-Dwebpack-bundle-analyzer// vue.config.jsconst{BundleAnalyzerPlugin}require(webpack-bundle-analyzer);module.exports{chainWebpack:config{if(process.env.ANALYZE){config.plugin(analyzer).use(BundleAnalyzerPlugin);}}};6.4 Gzip 压缩npminstall-Dcompression-webpack-plugin// vue.config.jsconstCompressionPluginrequire(compression-webpack-plugin);module.exports{configureWebpack:{plugins:[newCompressionPlugin({algorithm:gzip,test:/\.(js|css|html|svg)$/,threshold:10240,minRatio:0.8})]}};七、多页面应用配置// vue.config.jsmodule.exports{pages:{index:{entry:src/main.js,template:public/index.html,filename:index.html,title:首页,chunks:[chunk-vendors,chunk-common,index]},admin:{entry:src/admin/main.js,template:public/admin.html,filename:admin.html,title:管理后台,chunks:[chunk-vendors,chunk-common,admin]}}};八、现代模式构建Vue CLI 支持为现代浏览器构建更小的包# 现代模式生成两套 bundle现代浏览器用 ES modules旧浏览器用传统方式vue-cli-service build--modern!-- 自动注入到 index.html --scripttypemodulesrc/js/app.js/scriptscriptnomodulesrc/js/app-legacy.js/script九、Docker 部署配置# Dockerfile FROM node:16-alpine as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build FROM nginx:alpine COPY --frombuilder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80# nginx.conf server { listen 80; location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://backend:3000; } }十、总结知识点核心内容Vue CLIvue create创建项目vue.config.js配置环境变量.env文件VUE_APP_前缀ESLint/Prettier代码规范与格式化代码分割import()懒加载splitChunks 优化体积分析webpack-bundle-analyzer现代模式--modern构建下一章我们将进入 Vue2项目实战综合运用所学知识完成一个完整的后台管理系统。十一、练习使用 Vue CLI 创建一个新项目配置 TypeScript Vue Router Vuex配置 ESLint Prettier在提交前自动格式化代码为项目配置路由懒加载和代码分割分析打包体积变化编写一个多环境配置文件开发/测试/生产在不同环境显示不同 API 地址

相关新闻

5分钟快速上手:DroidCam OBS插件终极指南,让手机变身专业直播摄像头

5分钟快速上手:DroidCam OBS插件终极指南,让手机变身专业直播摄像头

5分钟快速上手:DroidCam OBS插件终极指南,让手机变身专业直播摄像头 【免费下载链接】droidcam-obs-plugin DroidCam OBS Source 项目地址: https://gitcode.com/gh_mirrors/dr/droidcam-obs-plugin DroidCam OBS插件是一款功能强大的开源工具&am…

2026/6/27 11:05:10阅读更多 →
计算机毕业设计之基于网络爬虫的游戏热度数据分析与可视化研究

计算机毕业设计之基于网络爬虫的游戏热度数据分析与可视化研究

随着互联网的快速发展,网络爬虫技术在获取大量游戏相关信息方面发挥着重要作用。本文通过网络爬虫技术收集了热门游戏的相关数据,包括游戏下载量、用户评分、论坛讨论热度等,并对这些数据进行了详细的分析。本文的主要研究目标是探索游戏热度…

2026/6/27 11:00:09阅读更多 →
医院如何制作“健康树”二维码?健康知识视频生成二维码教程分享

医院如何制作“健康树”二维码?健康知识视频生成二维码教程分享

在数字化浪潮的推动下,各地医疗机构正积极探索更接地气、更高效的健康科普模式。近期,云南景谷县推出的“健康树”二维码数字化科普载体引发广泛关注,覆盖全县15个县乡医疗机构门诊大厅及136个村卫生室。群众候诊期间,只需拿出手机…

2026/6/27 11:00:09阅读更多 →
Jetson Orin——RT-DETR目标实时检测

Jetson Orin——RT-DETR目标实时检测

本文旨在将自己微调的模型部署到jetson-Orin中,并利用官方的isaac-ROS库isaac-ros-rtdetr库运行该模型,做实时检测 一、创建环境 1.训练环境 a.创建conda基础环境 conda create -n rtdetr python3.10 -y conda activate rtdetr b.安装pytorch pip…

2026/6/27 12:40:24阅读更多 →
Python生成器与迭代器深度解析:从原理到高性能实战

Python生成器与迭代器深度解析:从原理到高性能实战

引言 在Python开发中,你或许经常用for循环遍历列表、字典甚至文件,但你是否想过,这些对象为什么能被for循环依次取出元素?背后依赖的就是迭代器协议。而yield关键字塑造的生成器,则让迭代器的定义变得异常简洁&#xf…

2026/6/27 12:40:24阅读更多 →
耐摔的UV镜多系列深度解析

耐摔的UV镜多系列深度解析

不少摄影爱好者外出采风都会遇到相同困扰:徒步、爬山、海边拍摄时相机容易磕碰,普通UV镜一撞就碎,不仅失去防护作用,碎片还可能划伤昂贵镜头;也有新手疑惑,市面上UV镜品牌众多,哪些镜片抗冲击、…

2026/6/27 12:40:24阅读更多 →
BetterNCM插件管家:让网易云音乐变身智能播放器的神奇工具

BetterNCM插件管家:让网易云音乐变身智能播放器的神奇工具

BetterNCM插件管家:让网易云音乐变身智能播放器的神奇工具 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐功能单一而烦恼吗?BetterNCM安装器帮…

2026/6/27 12:40:24阅读更多 →
为什么Mesen模拟器能让NES经典游戏在现代设备上焕发新生?

为什么Mesen模拟器能让NES经典游戏在现代设备上焕发新生?

为什么Mesen模拟器能让NES经典游戏在现代设备上焕发新生? 【免费下载链接】Mesen Mesen is a cross-platform (Windows & Linux) NES/Famicom emulator built in C and C# 项目地址: https://gitcode.com/gh_mirrors/me/Mesen Mesen是一款跨平台NES/Fami…

2026/6/27 12:40:24阅读更多 →
Gradle同步总卡在“Resolving dependencies”?IDEA专属离线缓存+代理预热双引擎提速方案(实测缩短至8.3秒)

Gradle同步总卡在“Resolving dependencies”?IDEA专属离线缓存+代理预热双引擎提速方案(实测缩短至8.3秒)

更多请点击: https://kaifayun.com 第一章:Gradle同步总卡在“Resolving dependencies”?IDEA专属离线缓存代理预热双引擎提速方案(实测缩短至8.3秒) Gradle 同步卡在 “Resolving dependencies” 是 IntelliJ IDEA 用…

2026/6/27 12:35:24阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/27 11:20:40阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/27 5:46:02阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/27 11:20:39阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →