Автономное приложение Node.js

Я подумываю о разработке настольного приложения, состоящего из 2 частей:

  • пользовательский интерфейс (например, Java-приложение)
  • внутренний сервер Node.js

2 части соединяются через гнезда. Не спрашивайте, почему я знаю, что это странно.

Я хочу иметь возможность предоставить клиентам приложение с установщиком. Я не хочу, чтобы пользователи сами устанавливали Node.js.

Есть ли способ, чтобы сервер Node.js был установлен как автономный, т.е. нет необходимости устанавливать Node.js глобально в системе.

Это вопрос для любой среды (Windows, Linux, Mac OS X...).

9 ответов

Решение

Вы можете связать двоичные файлы с вашим приложением. Не нужно ничего устанавливать для запуска приложения Node. Двоичные файлы доступны на той же странице, что и установщики.

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

// To start the node process
$ /path/to/binaries/npm install
$ /path/to/binaries/node myApp.js

Обновление 2017-05-04: И в городе появился новый ребенок:

Обновление 2016-11-14: На сегодняшний день Electron и nwjs кажутся лучшими вариантами.

Оригинал:

Есть несколько шагов, которые вы должны пройти, чтобы создать установщик, и он варьируется для каждой операционной системы. Например:

Node-Webkit является опцией, но на самом деле он не настроен на выполнение отношений типа "сервер-клиент".

Другим вариантом является упаковка установщиков node.js вместе с установщиком приложения. Затем при загрузке приложения вы можете ускорить процесс node.js. Я знаю, что некоторые разработчики делали это с титаном, вот немного больше информации.

Надеюсь это поможет!

Вот вариант: Light Table - это приложение для узлов, но оно прекрасно устанавливается и аккуратно интегрирует GUI (webkit) в большинстве операционных систем.

Для этого он использует node-webkit. (Запускает код узла прямо со страницы html.) Вот документация по упаковке.

Стоит упомянуть Electron от GitHub. Используется для сборки Atom, Slack, Visual Studio Code и многого другого.

Я только что наткнулся на nexe - инструмент, который "создает один исполняемый файл из вашего приложения node.js".

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

Начиная с node.js 18.16.0, вы можете создавать отдельные исполняемые приложения.

Пользователи могут создать одно исполняемое приложение из встроенного сценария с самим двоичным файлом узла и любым инструментом, который может вводить ресурсы в двоичный файл.

Вот шаги по созданию одного исполняемого приложения с использованием одного такого инструмента, postject:

  1. Создайте файл JavaScript:
      echo 'console.log(`Hello, ${process.argv[2]}!`);' > hello.js
  1. Создайте файл конфигурации, создающий большой двоичный объект, который можно внедрить в одно исполняемое приложение ( подробнее см. в разделе Создание отдельных подготовительных больших двоичных объектов ):
      echo '{ "main": "hello.js", "output": "sea-prep.blob" }' > sea-config.json
  1. Создайте большой двоичный объект для инъекции:
      node --experimental-sea-config sea-config.json
  1. Создайте копию исполняемого файла узла и назовите его в соответствии с вашими потребностями:
  • В системах, отличных от Windows:

            cp $(command -v node) hello
    
  • В Windows:

    Использование PowerShell:

            cp (Get-Command node).Source hello.exe
    

    Использование командной строки:

            for /F "tokens=*" %n IN ('where.exe node') DO @(copy "%n" hello.exe)
    

    Расширение .exe необходимо.

  1. Удалите подпись двоичного файла (только для macOS и Windows):
  • В macOS:
      codesign --remove-signature hello
  • В Windows (необязательно):

Signtool можно использовать из установленного Windows SDK. Если этот шаг пропущен, игнорируйте любые предупреждения postject, связанные с подписью.

      signtool remove /s hello.exe
  1. Вставьте большой двоичный объект в скопированный двоичный файл, запустив postject со следующими параметрами:
  • hello/hello.exe— Имя копии исполняемого файла узла, созданной на шаге 4.
  • NODE_SEA_BLOB— Имя ресурса/заметки/раздела в двоичном файле, где будет храниться содержимое блоба.
  • sea-prep.blob– Имя большого двоичного объекта, созданного на шаге 1.
  • --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2— Предохранитель, используемый проектом Node.js для определения того, был ли внедрен файл.
  • --macho-segment-name NODE_SEA(требуется только в macOS) — имя сегмента в двоичном файле, в котором будет храниться содержимое большого двоичного объекта.

Подводя итог, вот необходимая команда для каждой платформы:

  • В Linux:
      npx postject hello NODE_SEA_BLOB sea-prep.blob \
    --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 
  • В Windows — PowerShell:
      npx postject hello.exe NODE_SEA_BLOB sea-prep.blob `
    --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2
  • В Windows — командная строка:
      npx postject hello.exe NODE_SEA_BLOB sea-prep.blob ^
    --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 
  • В macOS:
      npx postject hello NODE_SEA_BLOB sea-prep.blob \
    --sentinel-fuse NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2 \
    --macho-segment-name NODE_SEA
  1. Подпишите двоичный файл (только для macOS и Windows):
  • В macOS:
      codesign --sign - hello
  • В Windows (необязательно):

Для работы необходимо наличие сертификата. Однако неподписанный двоичный файл по-прежнему будет работоспособен.

      signtool sign /fd SHA256 hello.exe
  1. Запустите бинарный файл:
  • В системах, отличных от Windows
      $ ./hello world
Hello, world!
  • В Windows
      $ .\hello.exe world
Hello, world! 

Основано на рекомендациях Microsoft Nodejs.

Возможно, здесь есть еще один вариант: установка и запуск приложений node.js в IIS в Windows.

Я попал сюда в поисках фреймворка для настольных приложений Node.js (хотя вопрос OP об установке сервера node.js в виде пакета, а не о приложении с пользовательским интерфейсом).

Я хотел бы упомянуть Proton Native, поскольку он здесь пока отсутствует. Он все еще новый, но выглядит многообещающе. Он позволяет использовать компоненты React Native для создания настольных приложений для различных платформ (под капотом используется Qt).

Другие вопросы по тегам