还可以做几项关键优化:代码分割(分包)、压缩、移除 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 一网打尽,记得关注不迷路!