Есть решение. Абсолютно нестабильный и непроверенный, попробуйте на свой страх и риск. И, конечно, если вы можете найти и исправить ошибки, которые появляются как побочный эффект, не стесняйтесь делиться ими :)
Мы собираемся использовать модуль с именем pkg
, чтобы связать скрипт с node
. Также для простоты мы будем использовать npx
.
Были некоторые побочные эффекты, но это было впервые, когда что-то работало с electron
и nightmare
.
Рассмотрим следующий скрипт,
const Nightmare = require("nightmare");
const nightmare = Nightmare({
show: true
});
nightmare
.goto("https://example.com")
.title()
.end()
.then(console.log)
.catch(error => {
console.error(error);
});
Это простой скрипт, который говорит, перейдите на example.com
и дайте мне название.
Cool! Давайте попробуем использовать его через npx
и pkg
. Код для этого,
npx pkg app.js --target 'host'
Однако мы получили несколько неприятных ошибок,
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
node_modules/nightmare/lib/runner.js
path-to-executable/nightmare/runner.js
> Warning Cannot include file %1 into executable.
The file must be distributed with executable as %2.
node_modules/nightmare/lib/frame-manager.js
...
и т. Д., И файл не запустится.
Error: spawn /home/someone/Desktop/a/electron/dist/electron ENOENT
Не удается найти необходимые файлы, так как они не были в комплекте. Мы будем использовать process.cwd()
, чтобы получить те данные, которые находятся в соответствующей папке.
const nodeDir = process.cwd() + "/node_modules/"; // <- Get node modules folder
const nightmareDir = nodeDir + "nightmare"; // <-- Get nightmarejs path
const electronDir = nodeDir + "electron"; // <-- Get electron path
const Nightmare = require(nightmareDir);
const electronPath = require(electronDir);
const nightmare = Nightmare({
show: true,
electronPath // <-- use the specific electron path
});
nightmare
.goto("https://example.com")
.title()
.end()
.then(console.log)
.catch(error => {
console.error(error);
});
Когда я запустил его, он показал мне еще одно предупреждение, но это потому, что я еще не оптимизировал process.cwd()
. Тогда я запустил его и вуаля!
➜ a npx pkg app.js --target 'host'
> pkg@4.3.1
> Warning Cannot resolve 'nightmareDir'
/home/someone/Desktop/a/app.js
Dynamic require may fail at run time, because the requested file
is unknown at compilation time and not included into executable.
Use a string literal as an argument for 'require', or leave it
as is and specify the resolved file name in 'scripts' option.
> Warning Cannot resolve 'electronDir'
/home/someone/Desktop/a/app.js
Dynamic require may fail at run time, because the requested file
is unknown at compilation time and not included into executable.
Use a string literal as an argument for 'require', or leave it
as is and specify the resolved file name in 'scripts' option.
➜ a ./app
Example Domain // <-- Our sweet result :D
➜ a
Это можно улучшить и настроить, но я оставлю это вам.