首页 > 解决方案 > 为什么 Electron 没有运行我的预加载脚本?

问题描述

我正在尝试使用预加载脚本来解决 Electron 4.2.3 中的CORS 标头问题。但是,我无法运行预加载脚本。一个最小的复制案例:

包.json

{
  "name": "your-app",
  "version": "0.1.0",
  "main": "main.js",
  "dependencies": {
    "electron": "^4.2.3"
  }
}

main.js

const { app, BrowserWindow } = require('electron')

app.on('ready', function() {
  const win = new BrowserWindow({
    webPreferences: {
      preload: `file://${__dirname}/preload.js`,
    }
  })
  win.webContents.openDevTools()
  win.loadFile('index.html')
})

preload.js

window.preloadWasRun = 'preload was run'

索引.html

<body>
  <script>
    document.write(window.preloadWasRun || 'preload was not run')
  </script>
</body>

无论我为webSecurity,nodeIntegration和使用什么设置contextIsolation,我的脚本似乎preload都被忽略了。即使我在脚本中出现语法错误,它也不会在任何地方显示任何错误。

标签: electron

解决方案


原来它必须是绝对路径名,而不是绝对 URL。这些都不起作用:

      preload: `file://${__dirname}/preload.js`,
      preload: './preload.js',
      preload: 'preload.js',

但这像宣传的那样有效:

      preload: `${__dirname}/preload.js`,

由于它似乎是文件系统路径而不是 URL,因此使用path.join奇怪的路径分隔符来解释平台也可能是明智的:

      preload: path.join(__dirname, 'preload.js'),

推荐阅读