
vue + node.js 应用部署后 js/css 文件返回 404,通常并非服务器路由配置错误,而是 vite 构建时资源路径(`base`)未适配生产环境部署路径所致。
在 Vue(Vite)+ Node.js 全栈项目中,本地开发一切正常但上线后出现 /assets/xxx.js 或 /assets/xxx.css 404 错误,是一个典型且易被忽视的构建配置问题。虽然 Express 的静态文件服务(app.use(express.static(...)))和兜底路由(app.get('*', ...))逻辑完全正确,但关键在于:浏览器请求的资源路径,必须与实际文件在 express.static 托管目录下的可访问路径严格匹配。
回顾你 index.html 中的引用:
这里的 /assets/... 是绝对路径,表示从域名根目录(https://yourdomain.com/assets/...)发起请求。而你的 Express 配置是:
app.use(express.static(path.join(__dirname, '../client/dist')));
这意味着 Express 只会响应形如 https://yourdomain.com/assets/xxx.js 的请求——前提是该文件真实存在于 client/dist/assets/ 目录下,且服务器能将 /assets/ 映射到该子路径。
立即学习“前端免费学习笔记(深入)”;
问题根源正在于此:Vite 默认以 / 为 base(即所有资源按根路径解析),但若你的应用并非部署在域名根目录(例如部署在子路径如 https://example.com/myapp/),或服务端静态托管路径与前端期望路径存在层级偏差(如 dist 目录本身需被“隐式”作为上下文),则资源请求必然失败。
你最终通过修改 vite.config.js 解决问题:
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
plugins: [vue()],
base: '/client/dist/' // ✅ 关键修正:让 Vite 构建时生成的资源路径前缀与服务端静态托管路径对齐
});⚠️ 注意:base: '/client/dist/' 并非推荐做法(它会使 HTML 中资源路径变为 /client/dist/assets/xxx.js,要求服务器在 /client/dist/ 路径下提供静态服务)。更通用、更符合生产实践的方案是:
✅ 推荐配置(标准部署场景):
若应用部署在域名根路径(如 https://myapp.com/),且 Express 正确托管 dist 目录,则 base 应设为 '/'(默认值),并确保 index.html 中的资源路径为 /assets/xxx.js —— 这正是你原始代码的状态。此时 404 往往源于:
- dist 目录未完整上传(尤其 .gitignore 误删了 dist/);
- 服务器文件权限不足,无法读取 assets/ 下的文件;
- Nginx/Apache 等反向代理未透传静态请求,或缓存了旧版 index.html。
✅ 若必须部署在子路径(如 https://myapp.com/sub/):
则应在 vite.config.js 中设置:
base: '/sub/' // 构建后所有资源路径自动加上 /sub/
同时,Express 需调整静态托管路径(保持 dist 内容不变):
// 仍托管整个 dist 目录,但前端请求会带 /sub/ 前缀
app.use('/sub', express.static(path.join(__dirname, '../client/dist')));
// 兜底路由也需适配
app.get('/sub/*', (req, res) => {
res.sendFile(path.join(__dirname, '../client/dist/index.html'));
});? 快速排查清单:
- 检查浏览器开发者工具 Network 标签页:确认 404 请求的真实 URL(如 https://domain.com/assets/xxx.js 还是 https://domain.com/client/dist/assets/xxx.js?);
- 直接在浏览器访问该 URL,验证文件是否真能被服务器返回(排除路径/权限问题);
- 运行 ls -la client/dist/assets/ 确认文件存在且非空;
- 在服务器端临时添加日志,确认 express.static 是否收到请求:
app.use('/assets', (req, res, next) => { console.log('Assets request:', req.url); next(); }); app.use('/assets', express.static(path.join(__dirname, '../client/dist/assets')));
总结:Vite 的 base 配置是控制构建产物资源路径的“总开关”,它必须与服务端静态文件托管策略协同设计。不要盲目修改 base,而应先明确部署拓扑(根路径 or 子路径?有无反向代理?),再选择最简洁、最符合约定的配置组合。










