ERR_FILE_NOT_FOUND ;swagger-ui.css,swagger-ui-bundle.js

内容分享7小时前发布
0 0 0

ERR_FILE_NOT_FOUND ;swagger-ui.css,swagger-ui-bundle.js

ERR_FILE_NOT_FOUND 说明 浏览器根本找不到这两个文件,90 % 是由于:

  1. 你把 swagger-ui-dist 打进了 asar 包,而 file:// 协议下 Chromium 禁止读取 asar 内的静态资源
  2. 或者路径拼错 / 文件名大小写不一致。

下面给一套「asar 外 + 绝对路径」的 3 分钟修复方案,保证 file:// 能正常加载。


一、让 electron-builder 把资源放到 app 外(推荐)

  1. 安装依赖(只当普通资源,不打包)
npm i -D swagger-ui-dist
  1. electron-builder.yml 新增一条 extraResources
extraResources:
  - from: node_modules/swagger-ui-dist
    to: swagger-ui-dist
  1. 构建后会得到目录结构
dist/mac/YourApp.app/Contents/Resources/swagger-ui-dist/
├─ swagger-ui.css
├─ swagger-ui-bundle.js
└─ ...

Windows 在 resourcesswagger-ui-dist;Linux 同理。


二、在代码里生成绝对 file:// URL

import path from 'path';
import { app } from 'electron';

const SWAGGER_DIR = path.join(app.getAppPath(), '..', 'swagger-ui-dist'); // asar 外
const SWAGGER_CSS = `file://${path.join(SWAGGER_DIR, 'swagger-ui.css')}`;
const SWAGGER_BUNDLE = `file://${path.join(SWAGGER_DIR, 'swagger-ui-bundle.js')}`;

三、生成 HTML(用上面的绝对 URL)

const html = `
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"/>
  <link rel="stylesheet" href="${SWAGGER_CSS}"/>
</head>
<body>
  <div id="swagger-ui"></div>
  <script src="${SWAGGER_BUNDLE}"></script>
  <script>
    SwaggerUIBundle({ spec: ${JSON.stringify(swaggerJson)}, dom_id: '#swagger-ui' });
  </script>
</body>
</html>`;

四、Windows 兼容写法(三段式 file:///)

function fileUrl(p: string) {
  const url = path.resolve(p).replace(/\/g, '/');
  return `file:///${url}`;
}
const SWAGGER_CSS = fileUrl(path.join(SWAGGER_DIR, 'swagger-ui.css'));
const SWAGGER_BUNDLE = fileUrl(path.join(SWAGGER_DIR, 'swagger-ui-bundle.js'));

五、再跑一遍 → 网络面板应显示 200

file:///Users/.../YourApp.app/Contents/Resources/swagger-ui-dist/swagger-ui.css  200
file:///Users/.../YourApp.app/Contents/Resources/swagger-ui-dist/swagger-ui-bundle.js 200

控制台不再报 ERR_FILE_NOT_FOUND,document.querySelector('.swagger-ui') 也能正常拿到节点。


六、常见额外坑

现象

解决

路径对了仍 404

确认 大小写(Linux 严格)

作为 extraResources 后 dev 模式找不到

dev 时手动把 swagger-ui-dist 拷到 out/ 或判断 app.isPackaged 走不同路径

想保持 asar 内加载

必须改用 自定义协议
protocol.registerFileProtocol)把 asar 映射成 https://swagger/xxx,否则 Chromium 一律拒绝


30 秒复盘

  1. electron-builder.yml 里 extraResources 把 swagger-ui-dist 放到 app 外。
  2. 代码里用 file://${app.getAppPath()}/../swagger-ui-dist/xxx 拼绝对 URL。
  3. Windows 把反斜杠转 / 并加 file:///。

按上面改完,两个静态文件 200 成功,页面即能正常渲染,祝调试顺利!

© 版权声明

相关文章

暂无评论

none
暂无评论...