news 2026/9/6 2:17:52

第二十八节:进阶:Vite 项目打包、多环境区分、打包优化与部署实操

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第二十八节:进阶:Vite 项目打包、多环境区分、打包优化与部署实操

第二十八节:进阶:Vite 项目打包、多环境区分、打包优化与部署实操

🎯本节目标

  1. 分清开发 / 测试 / 生产三套环境变量文件
  2. 完善 request 请求工具,根据环境自动切换接口地址
  3. vite 配置打包优化,拆分 chunk、去除 console、压缩资源
  4. 执行打包命令,生成 dist 产物
  5. dist 本地预览、nginx 部署关键配置、部署踩坑处理

步骤 1:环境变量文件说明

Vite 识别以.env开头的文件,放在项目根目录

  • .env所有环境通用
  • .env.development:开发环境pnpm dev
  • .env.production:生产环境pnpm build

变量必须以VITE_作为前缀,才可以在代码中import.meta.env.VITE_XXX获取。

① .env.development(开发环境,mock 开启)

# .env.development VITE_APP_TITLE=Vue3后台管理系统(开发) VITE_API_BASE_URL=/api VITE_MOCK=true

② .env.production(生产环境,关闭 mock,真实后端地址)

# .env.production VITE_APP_TITLE=Vue3后台管理系统 VITE_API_BASE_URL=/prod-api VITE_MOCK=false

③ src/utils/request.js 请求工具读取环境变量

import axios from 'axios' import { ElMessage } from 'element-plus' import { useUserStore } from '@/stores/user' const service = axios.create({ // ✅读取环境变量接口地址 baseURL: import.meta.env.VITE_API_BASE_URL, timeout: 10000 }) // 请求拦截器 service.interceptors.request.use(config => { const userStore = useUserStore() if(userStore.token){ config.headers.Authorization = `Bearer ${userStore.token}` } return config }) //响应拦截器 service.interceptors.response.use( res=>{ return res.data }, err=>{ ElMessage.error(err.message || '请求失败') return Promise.reject(err) } ) export default service

步骤 2:vite.config.ts 打包优化配置

import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' // mock插件 import { viteMockServe } from 'vite-plugin-mock' export default defineConfig(({mode})=>{ // 判断是否生产环境 const isProd = mode === 'production' return { plugins: [ vue(), viteMockServe({ mockPath:'src/mock', // ✅生产环境关闭mock enable: !isProd && import.meta.env.VITE_MOCK === 'true' }) ], resolve:{ alias:{ '@': resolve(__dirname,'src') } }, build:{ // 打包输出目录 outDir:'dist', // 打包清除console和debugger dropConsole: true, dropDebugger:true, // 分包策略,拆分第三方库,避免单js文件过大 rollupOptions:{ output:{ manualChunks:{ //把大依赖单独拆分 'vue-vendor': ['vue','vue-router','pinia'], 'element-plus':['element-plus'], 'echarts':['echarts'] } } } } } })

关键点:生产环境自动关闭 mock,打包删除控制台打印,分包切割大库,减少单包体积,提升页面首屏加载速度。

步骤 3:package.json 脚本命令

{ "scripts": { "dev": "vite", "build": "vite build", "preview": "vite preview" } }

执行打包

pnpm build

执行完成根目录生成dist文件夹,就是最终部署产物。

本地预览打包产物

pnpm preview

本地模拟服务器打开 dist,验证打包之后页面功能是否正常。

步骤 4:Nginx 部署配置(重点!history 模式刷新 404 问题)

我们路由使用createWebHistory()history 模式,直接打开 dist/index.html 会报跨域、路由丢失;必须用 web 服务器,nginx 配置如下。

server { listen 80; server_name localhost; # 打包后的dist目录路径 root D:/web/dist; index index.html; # history模式关键配置,解决刷新页面404 location / { try_files $uri $uri/ /index.html; } # 代理后端接口 location /prod-api/ { proxy_pass http://后端真实接口地址/; } }

部署常见坑

  1. 刷新页面 404:缺少try_files $uri $uri/ /index.html;配置,history 模式必须配置。
  2. 接口 404:确认 nginx 代理/prod-api指向后端服务地址。
  3. mock 打包后失效:viteMockServeenable生产环境关闭,打包不会打入 mock 代码。
  4. 静态资源路径错误:vite 默认相对路径,不要手动修改base,除非部署在子目录。

如果部署在子目录例如http://xxx/admin,vite.config 配置base:'/admin/'

✅测试清单

  1. 执行pnpm dev开发环境,读取.env.development,使用 mock 接口。
  2. 执行pnpm build,生成 dist 目录,无打包报错。
  3. pnpm preview预览 dist,页面、路由、按钮权限、图表全部正常。
  4. nginx 部署后,页面刷新不会出现 404,接口正常请求后端。

本项目完整学习总结

我们从零搭建仿若依 Vue3 后台管理系统,完整链路:

  1. 项目初始化,目录结构规划
  2. router 路由、Pinia 状态管理、Axios 二次封装
  3. mock 模拟后端接口
  4. layout 布局、侧边栏菜单、面包屑、标签页
  5. 用户管理 CRUD 页面,useTableSearch 组合式封装
  6. Echarts 图表工作台页面
  7. v‑perm 自定义指令按钮权限
  8. 路由守卫、动态路由、401/404 异常页面
  9. vite 多环境、打包优化、nginx 部署

🎉到此整套后台管理系统基础版本全部开发完毕。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 2:17:23

csp-s 2023复赛答案

密码锁#include<bits/stdc.h> using namespace std; const int N11,mod10; int n,ans,dp[N][N][N][N][N]; int main() {cin>>n;for(int i1;i<n;i){int a,b,c,d,e;cin>>a>>b>>c>>d>>e;for(int j1;j<9;j){dp[(aj)%mod][b][c][d]…

作者头像 李华
网站建设 2026/9/6 2:15:42

自定义CAN协议设计实战:帧ID分配、数据场编排与位定时优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 2:13:09

S7-1200与CM1241实现Modbus RTU从站调试完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/6 2:12:22

【共创稿事节】基于公开资料的3DGS技术原理分析

文章目录每日一句正能量摘要一、引言&#xff1a;为什么3DGS值得被认真对待&#xff1f;二、3DGS算法核心流程2.1 五步走策略2.2 算法伪代码三、3D高斯参数化&#xff1a;场景到底被表示成了什么&#xff1f;3.1 四个参数3.2 协方差矩阵的巧妙参数化3.3 颜色为什么用球谐&#…

作者头像 李华
网站建设 2026/9/6 2:09:35

使用内存探测bpf

一、完整实操步骤&#xff08;标准化流程&#xff09; 1. 启动KV服务端程序 执行启动命令&#xff0c;正常拉起KV存储服务&#xff0c;确保服务端口监听正常、无启动报错&#xff1a; ./kvstore 启动后保持服务常驻后台运行&#xff0c;等待客户端压测/请求访问。 2. 获取…

作者头像 李华
网站建设 2026/9/6 2:08:07

Java转AI Agent:工程经验重新定价,如何拿到翻倍offer

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华