Windows 来自 Node 的 PhantomJS
PhantomJS from Node on Windows
我已经使用 Node 编写了一个 Electron 应用程序,Electron Boilerplate, and phantom。它在我的 linux 机器上对我来说工作得很好,我将源代码复制到 Windows 10,然后 运行 和 npm start
,一切顺利。
但是,当我尝试使用 npm run release
使用样板模块构建应用程序时,事情进展得有点不顺利。我可以很好地安装和打开应用程序,但是当我单击激活 phantom 模块的按钮时,windows 变为全白并且没有任何反应。我能够使用开发工具记录一些错误。
首先,我有:
C:\...\dist\win-unpacked\resources\app.asar\node_modules\phantom\lib\phantom.js:361
Uncaught (in promise) Error: Error reading from stdin: Error: write EPIPE(…)
我对类似的问题做了一些研究,即 here,在我看来问题是使用 npm 模块 phantom 启动子进程 PhantomJS。最初,我使用我用 C# 编写的 WPF 应用程序来启动该过程,并且运行良好。这让我相信幻影模块是罪魁祸首。
所以我尝试将 npm phantom 模块换成 horseman,但得到了类似的结果:
Unhandled rejection HeadlessError: Phantom immediately exited with: 4294967295
at ChildProcess.immediateExit (C:\...\dist\win-unpacked\resources\app.asar\node_modules\node-horseman\node_modules\node-phantom-simple\node-phantom-simple.js:153:23)
at ChildProcess.g (events.js:286:16)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at Process.ChildProcess._handle.onexit (internal/child_process.js:204:12)
这是在黑暗中拍摄的照片。我不确定这会解决您的问题,但它是这样的:
GYP 和不匹配的二进制文件
Phantom 和许多其他节点模块使用为特定 OS 构建的二进制文件,它将 运行ning on。有时在您的 npm 日志文件中,您会看到对 node-gyp 的引用。 Node-gyp 只是帮助在节点模块中构建本机附加组件。构建二进制文件时,通常会根据三个主要参数构建它们:操作系统、cpu 体系结构和执行安装的节点版本。
我认为您需要将 phantomjs 重建为 Electron 正在使用的节点版本。大多数时候你在你的机器上安装的节点版本和 Electron 中的节点版本 运行ning 是不一样的。 Electron 尽最大努力跟上,但由于保持最新状态所需的大量工作和测试,总会有一点滞后。
当您通过 运行ning npm install phantom
安装 phantom 时,它会假设它需要为 您的机器 正在使用的节点版本安装或构建二进制文件.然后,当您的 Electron 应用程序尝试 运行 幻像时,它会尝试调用 Electron 的 节点版本的二进制文件。当它不存在时,子进程会立即错误退出。
如何修复
幸运的是,还有其他人想出了解决这个问题的方法,并创建了一个很棒的工具来帮助生成正确的二进制文件。
输入electron-rebuild
:
https://github.com/electron/electron-rebuild
Electron-rebuild 可以在命令行中 运行,它会将所有本机模块重建为项目正在使用的 Electron 版本。
要安装:
npm install electron-prebuilt
使用(在Windows):
.\node_modules\.bin\electron-rebuild.cmd
这应该足以将正确的二进制文件放在正确的位置。
其他想法
有时您可以使用一个包,该包使用名为 node-pre-gyp 的依赖项。例如。 sqlite3。在尝试为 Electron 重建我的包时,我最终 运行 遇到了一个已知问题。基本上,为了避免这个问题(如果你 运行 进入它)只需将 --pre-gyp-fix
附加到上面的命令。
那些 运行 进入 gyp 修复前问题的人的切线
关于 pre-gyp-fix 的另一件事:如果您的一个或多个依赖项依赖于需要 pre-gyp-fix 的模块之一,那么它们甚至会在错误的位置寻找二进制文件如果他们在 Electron 中 运行ning。所有 pre-gyp 二进制文件都存储在类似于此的文件夹中:
.\node_modules\sqlite3\lib\binding
在我当前的项目中,我在这里有三个文件夹,一个用于 Electron-v1.4,两个用于 node-v46 和 node-v50。 (hack alert) 为了让 sqlite3 与我的其他依赖项一起工作,我复制了在 Electron-v1.4 文件夹中找到的二进制文件并将其放入两个 node-v* 文件夹中。这样,当 运行ning 在 Electron 中时,所有依赖项都会 运行ning 正确的二进制文件,即使它们在错误的位置寻找它们。 (结束黑客警报)
结论
我无法确定这与您遇到的问题有任何关系。但值得一试,看看它是否能解决您的问题。如果没有,那么至少我希望我可以帮助遇到我 运行 遇到的相同问题的其他人。
我已经使用 Node 编写了一个 Electron 应用程序,Electron Boilerplate, and phantom。它在我的 linux 机器上对我来说工作得很好,我将源代码复制到 Windows 10,然后 运行 和 npm start
,一切顺利。
但是,当我尝试使用 npm run release
使用样板模块构建应用程序时,事情进展得有点不顺利。我可以很好地安装和打开应用程序,但是当我单击激活 phantom 模块的按钮时,windows 变为全白并且没有任何反应。我能够使用开发工具记录一些错误。
首先,我有:
C:\...\dist\win-unpacked\resources\app.asar\node_modules\phantom\lib\phantom.js:361
Uncaught (in promise) Error: Error reading from stdin: Error: write EPIPE(…)
我对类似的问题做了一些研究,即 here,在我看来问题是使用 npm 模块 phantom 启动子进程 PhantomJS。最初,我使用我用 C# 编写的 WPF 应用程序来启动该过程,并且运行良好。这让我相信幻影模块是罪魁祸首。
所以我尝试将 npm phantom 模块换成 horseman,但得到了类似的结果:
Unhandled rejection HeadlessError: Phantom immediately exited with: 4294967295
at ChildProcess.immediateExit (C:\...\dist\win-unpacked\resources\app.asar\node_modules\node-horseman\node_modules\node-phantom-simple\node-phantom-simple.js:153:23)
at ChildProcess.g (events.js:286:16)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at Process.ChildProcess._handle.onexit (internal/child_process.js:204:12)
这是在黑暗中拍摄的照片。我不确定这会解决您的问题,但它是这样的:
GYP 和不匹配的二进制文件
Phantom 和许多其他节点模块使用为特定 OS 构建的二进制文件,它将 运行ning on。有时在您的 npm 日志文件中,您会看到对 node-gyp 的引用。 Node-gyp 只是帮助在节点模块中构建本机附加组件。构建二进制文件时,通常会根据三个主要参数构建它们:操作系统、cpu 体系结构和执行安装的节点版本。
我认为您需要将 phantomjs 重建为 Electron 正在使用的节点版本。大多数时候你在你的机器上安装的节点版本和 Electron 中的节点版本 运行ning 是不一样的。 Electron 尽最大努力跟上,但由于保持最新状态所需的大量工作和测试,总会有一点滞后。
当您通过 运行ning npm install phantom
安装 phantom 时,它会假设它需要为 您的机器 正在使用的节点版本安装或构建二进制文件.然后,当您的 Electron 应用程序尝试 运行 幻像时,它会尝试调用 Electron 的 节点版本的二进制文件。当它不存在时,子进程会立即错误退出。
如何修复
幸运的是,还有其他人想出了解决这个问题的方法,并创建了一个很棒的工具来帮助生成正确的二进制文件。
输入electron-rebuild
:
https://github.com/electron/electron-rebuild
Electron-rebuild 可以在命令行中 运行,它会将所有本机模块重建为项目正在使用的 Electron 版本。
要安装:
npm install electron-prebuilt
使用(在Windows):
.\node_modules\.bin\electron-rebuild.cmd
这应该足以将正确的二进制文件放在正确的位置。
其他想法
有时您可以使用一个包,该包使用名为 node-pre-gyp 的依赖项。例如。 sqlite3。在尝试为 Electron 重建我的包时,我最终 运行 遇到了一个已知问题。基本上,为了避免这个问题(如果你 运行 进入它)只需将 --pre-gyp-fix
附加到上面的命令。
那些 运行 进入 gyp 修复前问题的人的切线
关于 pre-gyp-fix 的另一件事:如果您的一个或多个依赖项依赖于需要 pre-gyp-fix 的模块之一,那么它们甚至会在错误的位置寻找二进制文件如果他们在 Electron 中 运行ning。所有 pre-gyp 二进制文件都存储在类似于此的文件夹中:
.\node_modules\sqlite3\lib\binding
在我当前的项目中,我在这里有三个文件夹,一个用于 Electron-v1.4,两个用于 node-v46 和 node-v50。 (hack alert) 为了让 sqlite3 与我的其他依赖项一起工作,我复制了在 Electron-v1.4 文件夹中找到的二进制文件并将其放入两个 node-v* 文件夹中。这样,当 运行ning 在 Electron 中时,所有依赖项都会 运行ning 正确的二进制文件,即使它们在错误的位置寻找它们。 (结束黑客警报)
结论
我无法确定这与您遇到的问题有任何关系。但值得一试,看看它是否能解决您的问题。如果没有,那么至少我希望我可以帮助遇到我 运行 遇到的相同问题的其他人。