You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cz-hjjc-oa/错误诊断和解决方案.md

198 lines
5.0 KiB

3 months ago
# OA模块资源加载404错误诊断和解决方案
## 错误现象
```
GET http://192.167.20.118:8080/oa/static/css/chunk-libs.19fab405.css net::ERR_ABORTED 404 (Not Found)
GET http://192.167.20.118:8080/oa/static/js/chunk-libs.62099ae1.js net::ERR_ABORTED 404 (Not Found)
app.173e33f7.js:1 Uncaught SyntaxError: Unexpected token '<<' (at app.173e33f7.js:1:1)
```
## 问题分析
### 1. 资源文件不匹配
- **浏览器请求的文件**(旧版本):
- `chunk-libs.19fab405.css`
- `chunk-libs.62099ae1.js`
- `app.173e33f7.js`
- **实际构建后的文件**(新版本):
- `chunk-libs.6087fcbe.css`
- `chunk-libs.0f03f944.js`
- `app.edef6360.js`
### 2. 根本原因
浏览器加载的HTML文件是**缓存的旧版本**,其中引用的资源文件名与当前构建后的文件名不匹配。
## 解决方案
### 方案1清除浏览器缓存快速解决
1. **Chrome/Edge浏览器**
-`Ctrl+Shift+Delete` (Windows) 或 `Cmd+Shift+Delete` (Mac)
- 选择"缓存的图片和文件"
- 时间范围选择"全部时间"
- 点击"清除数据"
2. **强制刷新**
- Windows: `Ctrl+F5``Ctrl+Shift+R`
- Mac: `Cmd+Shift+R`
3. **开发者工具禁用缓存**
- 打开开发者工具 (F12)
- 在Network标签页勾选"Disable cache"
- 刷新页面
### 方案2重新构建并部署推荐
#### 步骤1检查环境变量
确保构建时设置了正确的环境变量:
```bash
cd /Users/weizongsong/www/cz_hjjc/cz-hjjc-oa
# 检查是否有 .env 文件
ls -la .env*
# 如果没有,创建 .env.production 文件
cat > .env.production << EOF
VUE_APP_MODULE_NAME=oa
VUE_APP_BASE_API=/api
EOF
```
#### 步骤2重新构建
```bash
# 清理旧的构建文件
rm -rf dist
# 使用正确的环境变量构建
VUE_APP_MODULE_NAME=oa npm run build:prod
# 或者如果已有 .env.production 文件
npm run build:prod
```
#### 步骤3检查构建输出
```bash
# 检查构建后的文件
ls -la dist/static/css/chunk-libs.*
ls -la dist/static/js/chunk-libs.*
ls -la dist/static/js/app.*
# 检查 index.html 中的引用
grep -o 'chunk-libs\.[^"]*' dist/index.html
```
#### 步骤4部署到服务器
```bash
# 将构建后的文件复制到后端public目录
cp -r dist/* /Users/weizongsong/www/cz_hjjc/backend/public/oa/
```
### 方案3配置服务器缓存策略
如果使用Nginx需要配置正确的缓存策略
```nginx
# 对于HTML文件禁用缓存或设置短缓存时间
location ~* \.html$ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
# 对于静态资源CSS/JS可以设置长期缓存
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
```
### 方案4在HTML中添加版本号长期方案
修改 `vue.config.js`在HTML中添加版本号参数
```javascript
// vue.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// ... 其他配置
chainWebpack(config) {
// ... 现有配置
// 在HTML中添加版本号防止缓存
config.plugin('html').tap(args => {
args[0].templateParameters = {
...args[0].templateParameters,
version: Date.now() // 或使用 package.json 中的版本号
}
return args
})
}
}
```
然后在 `public/index.html` 中引用资源时添加版本号:
```html
<link rel="stylesheet" href="<%= BASE_URL %>static/css/app.css?v=<%= version %>">
```
## 验证步骤
1. **清除浏览器缓存后访问**
```
http://192.167.20.118:8080/oa/
```
2. **检查网络请求**
- 打开开发者工具 (F12)
- 查看Network标签页
- 确认请求的文件名与构建后的文件名一致
3. **检查控制台错误**
- 应该不再有404错误
- 应该不再有语法错误
## 预防措施
1. **构建脚本**:在构建脚本中自动清理旧文件
2. **部署脚本**:使用部署脚本确保文件正确同步
3. **版本控制**在HTML中添加构建版本号或时间戳
4. **服务器配置**正确配置Web服务器的缓存策略
## 常见问题
### Q: 为什么会出现 `Uncaught SyntaxError: Unexpected token '<<'` 错误?
A: 这通常表示浏览器请求的JS文件实际上返回的是HTML错误页面如404页面而不是真正的JS文件。HTML内容以 `<!DOCTYPE``<html>` 开头导致JS解析失败。
### Q: 如何确认服务器上的文件是否正确?
A: 直接访问资源URL
```
http://192.167.20.118:8080/oa/static/css/chunk-libs.6087fcbe.css
http://192.167.20.118:8080/oa/static/js/chunk-libs.0f03f944.js
```
如果能正常访问说明文件存在如果404说明文件不存在或路径不正确。
### Q: 构建后文件名每次都不同怎么办?
A: 这是正常的Vue CLI使用内容哈希来生成文件名。只要HTML文件中的引用与构建后的文件名匹配即可。问题在于HTML文件被缓存了。
3 months ago
3 months ago
3 months ago
3 months ago