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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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文件被缓存了。