Как мне запутать файл JS с библиотекой nightmare.js - PullRequest
0 голосов
/ 10 мая 2018

Когда я упаковываю электронное приложение в macOS, я никогда не могу запутать файл с помощью Nightmare из-за его ограничений. Нужно ли переписывать всю библиотеку, или есть ли способ обойти это?

1 Ответ

0 голосов
/ 11 мая 2018

Есть решение. Абсолютно нестабильный и непроверенный, попробуйте на свой страх и риск. И, конечно, если вы можете найти и исправить ошибки, которые появляются как побочный эффект, не стесняйтесь делиться ими :)

Мы собираемся использовать модуль с именем 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

Это можно улучшить и настроить, но я оставлю это вам.

...