Spec-Zone.ru › Node.js 18 LTS

Одно исполняемые приложения

Добавлен в: v19.7.0, v18.16.0
Устойчивость: 1 - Экспериментальная функция: эта функция разрабатывается и будет меняться.

Исходный код: src/node_sea.cc

Эта функция позволяет удобно распространять приложение Node.js на систему, на которой Node.js не установлен.

Node.js поддерживает создание одноисполняемых приложений, позволяя встраивать JavaScript-файл в node двоичный файл. Во время запуска программа проверяет, был ли что-то встроено. Если скрипт найден, он выполняет его содержимое. В противном случае Node.js работает в обычном режиме.

Функция одноисполняемых приложений поддерживает только запуск одного встраиваемого файла CommonJS.

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

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

  1. Создайте JavaScript-файл:

    $ echo 'console.log(`Hello, ${process.argv[2]}!`);' > hello.js copy
  2. Создайте копию node исполняемого файла и назовите его в соответствии с вашими потребностями:

    $ cp $(command -v node) hello copy
  3. Встройте JavaScript-файл в скопированный двоичный файл, выполнив postject со следующими параметрами:

    • hello - Имя копии node исполняемого файла, созданного на шаге 2.
    • NODE_JS_CODE - Имя ресурса / заметки / раздела в двоичном файле, где будет храниться содержимое JavaScript-файла.
    • hello.js - Имя JavaScript-файла, созданного на шаге 1.
    • --sentinel-fuse NODE_JS_FUSE_fce680ab2cc467b6e072b8b5df1996b2 - фьюз, используемый проектом Node.js для определения, был ли файл вставлен.
    • --macho-segment-name NODE_JS (необходимо только на macOS) - Имя сегмента в двоичном файле, где будет храниться содержимое JavaScript-файла.

    В качестве примера ниже представлена команда для каждой платформы:

    • На системах, отличных от macOS:

      $ npx postject hello NODE_JS_CODE hello.js \
          --sentinel-fuse NODE_JS_FUSE_fce680ab2cc467b6e072b8b5df1996b2 copy
    • На macOS:

      $ npx postject hello NODE_JS_CODE hello.js \
          --sentinel-fuse NODE_JS_FUSE_fce680ab2cc467b6e072b8b5df1996b2 \
          --macho-segment-name NODE_JS copy
  4. Запустите двоичный файл:

    $ ./hello world
    Hello, world! copy

Примечания

require(id) во встроенном модуле не основан на файлах

require() во встроенном модуле отличается от require(), доступного модулям, которые не встроены. Он также не имеет свойств, которыми обладает не встроенный require(), за исключением require.main. Его можно использовать только для загрузки встроенных модулей. Попытка загрузить модуль, который можно найти только в файловой системе, приведет к ошибке.

Вместо того чтобы полагаться на файл require(), пользователи могут упаковать свое приложение в отдельный JavaScript-файл для встраивания в исполняемый файл. Это также гарантирует более детерминированный граф зависимостей.

Однако, если по-прежнему требуется файл require(), это тоже можно сделать:

const { createRequire } = require('node:module');
require = createRequire(__filename); copy

__filename и module.filename во встроенном модуле

Значения __filename и module.filename во встроенном модуле равны process.execPath.

__dirname во встроенном модуле

Значение __dirname во встроенном модуле равно имени каталога process.execPath.

Процесс создания одноисполняемого приложения

Инструмент, предназначенный для создания одноисполняемого приложения Node.js, должен встроить содержимое JavaScript-файла в:

  • ресурс с именем NODE_JS_CODE если node двоичный файл является файлом PE
  • раздел с именем NODE_JS_CODE в сегменте NODE_JS если node двоичный файл является файлом Mach-O
  • заметку с именем NODE_JS_CODE если node двоичный файл является файлом ELF

Найдите в двоичном файле строку NODE_JS_FUSE_fce680ab2cc467b6e072b8b5df1996b2:0 фьюз и измените последний символ на 1 для указания того, что ресурс был встроен.

Поддержка платформ

Поддержка одноисполняемых файлов регулярно тестируется на CI только на следующих платформах:

  • Windows
  • macOS
  • Linux (только AMD64)

Это связано с недостатком лучших инструментов для генерации одноисполняемых файлов, которые можно использовать для тестирования этой функции на других платформах.

Предложения по другим инструментам вставки ресурсов/потокам работы приветствуются. Пожалуйста, начните обсуждение на https://github.com/nodejs/single-executable/discussions для их документирования.

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v18.x/docs/api/single-executable-applications.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API