PhantomJS从Windows上的节点

我已经使用Node, Electron Boilerplate和phantom编写了一个Electron应用程序。 在我的linux机器上,它对我来说工作得非常好,我把源代码拷贝到了Windows 10上,并且运行了npm start ,一切顺利。

但是,当我尝试使用npm run release构build样板模块的应用程序时,情况npm run release得不那么顺利。 我可以安装并打开应用程序,但是当我点击激活幻像模块的button时,窗户全白,没有任何反应。 我能用开发工具logging一些错误。

首先,我有:

 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(…) 

我对类似的问题进行了一些研究,也就是在这里 ,在我看来,问题是用npm模块幻像启动subprocessPhantomJS。 最初,我使用的是我在C#中编写的WPF应用程序来启动这个过程,而且工作得很好。 这使我相信,幻影模块是罪魁祸首。

所以我试着换了nma幻影模块换骑士 ,但得到了类似的结果:

 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和许多其他节点模块使用为其将运行的特定操作系统构build的二进制文件。 有时在你的npm日志文件中,你会看到对node-gyp的引用。 Node-gyp只是帮助在节点模块中构build本地附加组件。 在构build二进制文件时,它们通常是针对三个主要参数构build的,即操作系统,CPU架构和正在进行安装的节点版本。

我认为你需要重buildphantomjs到Electron正在使用的节点的版本。 大多数情况下,您的计算机上安装的节点版本和在Electron中运行的节点版本不一样。 Electron尽最大努力维持,但由于工作量和testing需要保持最新状态,总会有一点滞后。

当您通过运行npm install phantomnpm install phantom ,它将假定它需要安装或构build您的机器正在使用的节点版本的二进制文件。 然后,当你的Electron应用程序尝试运行幻像时,它会尝试调用Electron节点版本的二进制文件。 如果不存在,则subprocess立即退出并显示错误。

怎么修

幸运的是,还有其他人已经想出了如何解决这个问题,并创造了一个伟大的工具来帮助生成正确的二进制文件。

进入electron-rebuild

https://github.com/electron/electron-rebuild

电子重build可以在命令行中运行,它会将所有本地模块重build为您的项目使用的Electron版本。

安装:

npm install electron-prebuilt

要使用(在Windows中):

.\node_modules\.bin\electron-rebuild.cmd

这应该足以把正确的二进制文件放在正确的位置。

其他想法

有时候可以使用一个使用名为node-pre-gyp的依赖项的包。 例如sqlite3。 有一个已知的问题,我试图重build我的电子包时遇到了。 基本上,为了避免这个问题(如果你遇到这个问题)只需要在上面的命令中--pre-gyp-fix

切线为那些遇到pre-gyp-fix问题的人

pre-gyp-fix还有一件事:如果你的一个或多个依赖关系依赖于需要pre-gyp-fix的模块之一,那么即使他们正在运行,他们也会在错误的地方寻找二进制文件电子。 所有的pre-gyp二进制文件都存储在类似于以下的文件夹中:

.\node_modules\sqlite3\lib\binding

在我目前的项目中,我有三个文件夹,一个用于Electron-v1.4,另外两个用于node-v46和node-v50。 ( 黑客警报 )为了让sqlite3与我的其他依赖项一起工作,我复制在Electron-v1.4文件夹中find的二进制文件,并将它放在两个node-v *文件夹中。 在Electron中运行时,所有的依赖关系都运行正确的二进制文件,即使它们在错误的位置上查找它们。 ( 结束黑客警报

结论

我无法确定这与你所看到的问题有什么关系。 但值得一试,看看它是否能解决你的问题。 如果不是的话,至less我希望能帮助其他人遇到同样的问题。