Vue3 项目从开发到上线:环境变量、打包优化与 Nginx 部署全流程
还可以做几项关键优化:代码分割(分包)、压缩、移除 console、开启 Gzip。
在项目根目录下的vite.config.js中添加配置:
javascript
// vite.config.js import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // 用于生成 Gzip 压缩文件(可选) import viteCompression from 'vite-plugin-compression' export default defineConfig({ plugins: [ vue(), // 开启 Gzip 压缩:将打包后的文件生成对应的 .gz 文件 // Nginx 可以直接用这些文件,减小传输体积 viteCompression({ // 压缩算法:gzip algorithm: 'gzip', // 只压缩大于 10KB 的文件 threshold: 10240, // 保留原文件,Nginx 会根据请求头返回 .gz 或原始文件 deleteOriginFile: false }) ], build: { // 最终产物输出目录(默认就是 dist) outDir: 'dist', // 开启 CSS 代码分割(默认就是 true) cssCodeSplit: true, // 设置 chunk 大小警告阈值(默认 500KB) chunkSizeWarningLimit: 1000, // terserOptions 用于配置代码压缩(Vite 使用 esbuild/terser) minify: 'terser', terserOptions: { compress: { // 打包时自动去掉所有 console.log 和 debugger drop_console: true, drop_debugger: true } }, // Rollup 配置:控制代码分割和分包策略 rollupOptions: { output: { // 手动分包:把第三方库单独打包,避免业务代码变动导致缓存失效 manualChunks: { // 把 Vue 全家桶单独打一个包 'vue-vendor': ['vue', 'vue-router', 'pinia'], // 把常用的 UI 库或工具库单独打一个包(按实际项目调整) // 'element-plus': ['element-plus'], // 'axios': ['axios'] }, // 自定义 chunk 文件名(便于缓存管理) chunkFileNames: 'assets/js/[name]-[hash].js', entryFileNames: 'assets/js/[name]-[hash].js', assetFileNames: 'assets/[ext]/[name]-[hash].[ext]' } } } })关键解释:
Gzip 压缩:将大文件预先压缩成
.gz文件,服务器直接返回压缩版,减少 60%~80% 的体积。需要 Nginx 配合(后面讲)。分包策略:把 Vue 核心库、路由、状态管理单独打包。因为你不会经常更新 Vue 版本,但业务代码经常改。分开之后,用户只需要重新下载变了的业务包,Vue 包可以继续用缓存。
去掉 console:生产环境不需要调试信息,减小体积同时避免泄露敏感数据。
四、构建产物分析:看清楚包里到底装了啥
优化完配置,我们得看看包体积到底怎么样了。可以安装一个可视化分析工具:
bash
npm install -D rollup-plugin-visualizer
在vite.config.js中添加:
javascript
import { visualizer } from 'rollup-plugin-visualizer' export default defineConfig({ plugins: [ vue(), viteCompression({...}), // 打包后自动生成一个 stats.html,打开就能看到各模块的体积占比图 visualizer({ open: true, // 打包后自动在浏览器中打开 gzipSize: true, // 显示 Gzip 压缩后的大小 brotliSize: true // 显示 Brotli 压缩后的大小(比 Gzip 更优) }) ], // ... 其他配置 })执行npm run build,打包完成后会自动打开一个网页,每个方块代表一个模块,越大表示占的体积越多。你可以针对最大的几个模块进行优化(比如换成 CDN 引入)。
五、Nginx 部署:让外网能访问到你的项目
前端打包产物本质上就是一堆静态文件(HTML、CSS、JS、图片)。我们需要一个Web 服务器把这堆文件暴露出去。Nginx 是最常用的选择。
5.1 安装 Nginx
Linux (Ubuntu/Debian):
bash
sudo apt update sudo apt install nginx
Windows:去官网下载压缩包,解压后运行nginx.exe。
5.2 上传 dist 文件到服务器
将本地dist文件夹里的所有内容,上传到服务器的某个目录,比如/var/www/myapp。
bash
# 在服务器上创建目录 sudo mkdir -p /var/www/myapp # 把本地 dist 内的文件上传(用 scp 或 FTP 工具) # scp -r ./dist/* user@server:/var/www/myapp
5.3 配置 Nginx 虚拟主机
在 Nginx 的配置目录(通常是/etc/nginx/sites-available/)下创建一个新配置文件:
nginx
# /etc/nginx/sites-available/myapp server { # 监听的端口 listen 80; # 你的域名或服务器IP server_name yourdomain.com www.yourdomain.com; # 网站根目录,指向你的 dist 文件位置 root /var/www/myapp; index index.html; # 开启 Gzip 压缩(配合之前生成的 .gz 文件) gzip on; # 启用静态 Gzip:如果存在同名的 .gz 文件就直接返回 gzip_static on; # 只压缩大于 1KB 的文件 gzip_min_length 1024; # 压缩级别(1-9,越大压缩率越高但越耗CPU) gzip_comp_level 6; # 需要压缩的文件类型 gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml; # SPA 的核心配置:所有路由都指向 index.html # 因为 Vue Router 是前端路由,URL 变化不会实际请求后端 # 如果直接访问 /user/list,服务器上没有这个文件,会返回 404 # try_files 的作用:先找请求的文件,找不到就返回 index.html location / { try_files $uri $uri/ /index.html; } # 静态资源的缓存策略:文件名带 hash,可以放心强缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { # 静态资源缓存 30 天 expires 30d; add_header Cache-Control "public, immutable"; } # 禁止访问隐藏文件(以点开头的文件) location ~ /\. { deny all; } }配置核心解释:
try_files $uri $uri/ /index.html:这是解决 SPA 刷新 404 的关键。无论用户访问什么路径,Nginx 都返回index.html,然后 Vue Router 在前端处理实际路由。gzip_static on:配合 Vite 生成的.gz文件。Nginx 发现请求某个.js文件时,如果存在同名的.js.gz就直接返回压缩版,无需 CPU 实时压缩。静态资源强缓存:文件名中的 hash 是内容指纹(内容变 hash 变),所以可以放心设置长期缓存,加快回访速度。
5.4 启用配置并重启 Nginx
bash
# 创建配置文件的软链接到 sites-enabled sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/ # 检查配置文件语法是否正确 sudo nginx -t # 重启 Nginx sudo systemctl restart nginx
现在打开浏览器访问你的域名或服务器 IP,应该能看到项目正常运行了。
六、自动化部署简介(加分项)
每次手动打包、上传、重启 Nginx 太麻烦。可以用GitHub Actions或简单的 Shell 脚本实现自动部署。
6.1 简单的部署脚本(本地执行)
创建一个deploy.sh:
bash
#!/bin/bash # 部署脚本:打包、上传、重启 Nginx echo "开始打包..." npm run build echo "上传文件到服务器..." # 替换 user 和 server 为实际值 scp -r dist/* user@your-server:/var/www/myapp echo "重启 Nginx..." ssh user@your-server "sudo systemctl restart nginx" echo "部署完成!"
执行前记得给脚本权限:chmod +x deploy.sh,然后./deploy.sh一条命令上线。
6.2 GitHub Actions 自动化(可选了解)
在项目根目录创建.github/workflows/deploy.yml,每次推送代码到 main 分支时自动部署。这里给出一个简化模板:
yaml
name: Deploy on: push: branches: [main] jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node uses: actions/setup-node@v4 with: node-version: 20 - name: Install & Build run: | npm ci npm run build - name: Deploy to Server uses: easingthemes/ssh-deploy@v4 with: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} REMOTE_HOST: ${{ secrets.REMOTE_HOST }} REMOTE_USER: ${{ secrets.REMOTE_USER }} TARGET: /var/www/myapp SOURCE: dist/这样你 push 代码后,GitHub 会自动帮你完成打包、上传、重启。
七、总结
今天我们把 Vue3 项目的“最后一公里”完整走通了:
| 步骤 | 做什么 | 关键点 |
|---|---|---|
| 环境变量 | 区分开发/生产环境配置 | .env.development/.env.production |
| 打包优化 | 分包、去console、Gzip、分析 | vite.config.js中配置rollupOptions |
| Nginx部署 | 静态文件服务 + SPA路由 | try_files解决刷新404 |
| 静态资源缓存 | 长期缓存加速 | 文件名hash +expires 30d |
| 自动化 | 一键部署 | Shell脚本或GitHub Actions |
按照这套流程走下来,你的项目就能稳稳当当跑在服务器上,并且加载速度经过优化。如果在部署中遇到具体问题,欢迎评论区留言,我们一起排查。
下篇预告:前端错误监控与用户行为追踪,把线上的 bug 一网打尽,记得关注不迷路!
