Windows上的Node的PhantomJS[英] PhantomJS from Node on Windows

问题描述

我已经使用节点编写了电子应用程序, electron Boilerplate phantom .在我的Linux机器上,它对我来说很好,我将源复制到Windows 10,然后用npm start运行,所有这些都顺利进行.

但是,当我尝试使用npm run release使用样板模块构建应用程序时,情况的顺利顺利.我可以很好地安装和打开应用程序,但是当我单击激活幻影模块的按钮时,窗口全是白色的,什么也不会发生.我能够使用开发工具记录一些错误.

首先,我有:

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

我对类似问题进行了一些研究,即在这里在我看来,问题是启动儿童过程,phantomjs和NPM模块幻影.最初,我正在使用C#中写的WPF应用程序来启动该过程,这很好.这使我相信幻影模块是罪魁祸首.

所以我尝试将NPM幻影模块换成 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和MISS匹配的二进制文件

Phantom和许多其他节点模块使用为其将要运行的特定操作系统构建的二进制文件.有时,在NPM日志文件中,您会看到对Node-GYP的引用.节点GYP只是有助于在节点模块中构建本机附加组件.建造二进制文件时,它们通常是针对执行安装的三个主要参数,即操作系统,CPU体系结构和版本.

我认为您需要将phantomjs重建为节点电子的版本.在大多数情况下,您在计算机上安装的节点版本,并且在电子中运行的节点版本并不相同.电子竭尽所能,但是由于保持最新所需的工作和测试,总会有一些滞后.

当您通过运行npm install phantom安装幻影>时,它将假定它需要安装或构建节点版本您的计算机正在使用的二进制文件.然后,当您的电子应用程序试图运行幻影时,它试图调用 electon的节点版本的二进制.当它不存在时,孩子的过程立即出现错误.

如何修复

幸运的是,还有其他人弄清楚如何解决此问题并创建了一个很好的工具来帮助生成正确的二进制文件.

输入electron-rebuild:

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

电子重建可以在命令行中运行,它将将所有本机模块重建为您的项目使用的电子版本.

安装:

npm install electron-prebuilt

使用(在Windows中):

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

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

其他想法

有时您可以使用使用称为node-pre-gyp的依赖项的软件包.例如. sqlite3.当试图重建电子包装时,我最终遇到了一个已知的问题.基本上,为了避免此问题(如果遇到此问题),只需将--pre-gyp-fix附加到上述命令中.

对于那些遇到gyp-fix问题的人的切线

在gyp-fix上还有一件事:如果您的依赖项的一个或多个取决于需要gyp-fix的一个模块,那么他们将在错误的位置寻找二进制的模块在电子中运行.所有的GYP二进制文件都存储在类似于此的文件夹中:

.\node_modules\sqlite3\lib\binding

在我当前的项目中,我在这里有三个文件夹,一个用于电子v1.4,两个用于node-v46和node-v50. ( hack Alert )为了使SQLite3与其他依赖关系一起使用,我会复制Electron-V1.4文件夹中的二进制文件,并将其放入两个Node-V*文件夹中.这样,在电子运行时,即使在错误的位置寻找它们,所有依赖性都在运行正确的二进制文件. ( end hack警报)

结论

我无法确定这与您看到的问题有关.但是值得一试,看看它是否解决了您的问题.如果不是这样,至少我希望我能帮助其他人经历我遇到的同样问题的人.

本文地址:https://www.itbaoku.cn/post/1740077.html