HTML 加载,但脚本不加载 运行
HTML loads, but scripts don't run
我已经通过 Parcel 编译了这个脚本:
import { app, BrowserWindow, Menu } from 'electron';
alert('Hi');
document.title = 'Xxx';
console.log('Hello');
包裹条目 HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<title>Empty Electron App</title>
</head>
<body>
<script>alert('Aaaaah!');
</script>
<script src="./Main.ts"></script>
</body>
</html>
我使用以下方式与 Parcel 捆绑:
// ...
const entry = './src/Main.html';
const options = {
outDir: './build',
publicUrl: './',
sourceMaps: false,
autoInstall: false,
hmr: false,
target: 'electron',
};
// ...
(async () => {
// ...
bundler.bundle();
})();
似乎 Electron 不是 运行 入口点 HTML 中包含的脚本(既不提醒也不改变页面标题也不登录到控制台)。就像我说的,console.log()
不会对主机环境终端 运行 Electron 产生任何东西。我通过在 HTML 中插入文本节点进一步测试了这一点,如下所示:
<!DOCTYPE HTML>
<html>
<head>
<!-- ... -->
</head>
<body>
Foo foo foo foo foo
</body>
</html>
应用呈现 Foo foo foo foo foo
成功;脚本什么都不做。我是否缺少某些配置?
这里有更多来源:
这是输出 HTML 的样子:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<title>Empty Electron App</title>
</head>
<body>
<script>alert('Aaaaah!');</script>
<script src="Main.d562fc5b.js"></script>
</body>
</html>
文件结构(/build
):
在您的 build.js
文件中,将 target
选项替换为 web
而不是 electron
。
更新:我实际上找到了一个更好的解决方案来解决您的问题,因为您有时可能需要在应用程序中使用正确的目标。见下文:
问题是 nodeIntegration
没有在您的 BrowserWindow
上启用,尽管您在选项中指定了它。这是因为默认情况下 contextIsolation
处于打开状态,这两个选项不能一起使用。在构建 window 时在 webPreferences
中添加 contextIsolation: false
也应该可以解决您的问题,同时将包裹目标保持在 electron
.
我已经通过 Parcel 编译了这个脚本:
import { app, BrowserWindow, Menu } from 'electron';
alert('Hi');
document.title = 'Xxx';
console.log('Hello');
包裹条目 HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<title>Empty Electron App</title>
</head>
<body>
<script>alert('Aaaaah!');
</script>
<script src="./Main.ts"></script>
</body>
</html>
我使用以下方式与 Parcel 捆绑:
// ...
const entry = './src/Main.html';
const options = {
outDir: './build',
publicUrl: './',
sourceMaps: false,
autoInstall: false,
hmr: false,
target: 'electron',
};
// ...
(async () => {
// ...
bundler.bundle();
})();
似乎 Electron 不是 运行 入口点 HTML 中包含的脚本(既不提醒也不改变页面标题也不登录到控制台)。就像我说的,console.log()
不会对主机环境终端 运行 Electron 产生任何东西。我通过在 HTML 中插入文本节点进一步测试了这一点,如下所示:
<!DOCTYPE HTML>
<html>
<head>
<!-- ... -->
</head>
<body>
Foo foo foo foo foo
</body>
</html>
应用呈现 Foo foo foo foo foo
成功;脚本什么都不做。我是否缺少某些配置?
这里有更多来源:
这是输出 HTML 的样子:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'">
<title>Empty Electron App</title>
</head>
<body>
<script>alert('Aaaaah!');</script>
<script src="Main.d562fc5b.js"></script>
</body>
</html>
文件结构(/build
):
在您的 build.js
文件中,将 target
选项替换为 web
而不是 electron
。
更新:我实际上找到了一个更好的解决方案来解决您的问题,因为您有时可能需要在应用程序中使用正确的目标。见下文:
问题是 nodeIntegration
没有在您的 BrowserWindow
上启用,尽管您在选项中指定了它。这是因为默认情况下 contextIsolation
处于打开状态,这两个选项不能一起使用。在构建 window 时在 webPreferences
中添加 contextIsolation: false
也应该可以解决您的问题,同时将包裹目标保持在 electron
.