Как изменить NodeJS встроенные глобальные объекты? - PullRequest
0 голосов
/ 14 апреля 2020

Я хотел бы добавить важную функциональность, которую я могу использовать на работе, не используя require () каждый раз. Итак, я подумал, что изменение встроенных объектов может сделать это, но я не смог найти расположение этих объектов для выполнения модификации.

Эти объекты в NodeJS двоичные? Значит ли это, что я должен раскошелиться на все репо NodeJS, чтобы это произошло?

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

1 Ответ

2 голосов
/ 14 апреля 2020

Прежде всего, я согласен с более ранним комментарием, что это звучит как проблема XY, в которой мы могли бы лучше помочь вам, если вы опишите, какую проблему вы действительно пытаетесь решить. Портативные node.js программы, которые работают где угодно или работают с любыми будущими версиями node.js, не зависят от какой-либо настраиваемой среды для запуска. Они используют встроенные возможности node.js и требуют / импортируют внешние объекты, которые хотят добавить в среду.


Являются ли эти объекты в NodeJS двоичными?

Да, они находятся в исполняемом файле.

Значит ли это, что я должен форкать весь репо NodeJS, чтобы это произошло?

Да.

Пожалуйста, я не хочу использовать редактирование прототипов et c, которые соответствуют требованиям. Мне нужно родное чувство.

"Родное чувство"? Это звучит так, как будто вы еще не купились на архитектуру node.js Это отличается от многих других сред. Со временем легко привыкнуть. IMO, было бы действительно лучше go с потоком и архитектурой платформы, а не делать какую-то пользовательскую версию node.js только для того, чтобы сохранить одну строку ввода в вашем коде запуска.

И, Сама концепция добавления ряда глобальных переменных, которые вы можете использовать в любом месте, в значительной степени показывает, что вы не до конца понимали преимущества дизайна, архитектуры, повторного использования кода и тестируемости в модульном дизайне, встроенные в node.js. Если бы вы это сделали, вы бы не пытались написать много кода, который не может быть повторно использован другими способами, которые вы не ожидаете сейчас.


Тем не менее, при поиске через node.js исходный код на Github, я нашел этот исходный файл node.js, в котором много вещей добавлено к глобальному объекту node.js, например setTimeout(), clearTimeout(), setImmediate(), clearImmediate() и т. Д. Итак, этот исходный файл, кажется, где node.js настраивает глобальный объект. Если вы хотите добавить свои собственные вещи туда, это будет одно место, где это будет сделано.

Чтобы предоставить пример этого кода (вы можете увидеть ссылку выше для полного кода):

if (!config.noBrowserGlobals) {
  // Override global console from the one provided by the VM
  // to the one implemented by Node.js
  // https://console.spec.whatwg.org/#console-namespace
  exposeNamespace(global, 'console', createGlobalConsole(global.console));

  const { URL, URLSearchParams } = require('internal/url');
  // https://url.spec.whatwg.org/#url
  exposeInterface(global, 'URL', URL);
  // https://url.spec.whatwg.org/#urlsearchparams
  exposeInterface(global, 'URLSearchParams', URLSearchParams);

  const {
    TextEncoder, TextDecoder
  } = require('internal/encoding');
  // https://encoding.spec.whatwg.org/#textencoder
  exposeInterface(global, 'TextEncoder', TextEncoder);
  // https://encoding.spec.whatwg.org/#textdecoder
  exposeInterface(global, 'TextDecoder', TextDecoder);

  // https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope
  const timers = require('timers');
  defineOperation(global, 'clearInterval', timers.clearInterval);
  defineOperation(global, 'clearTimeout', timers.clearTimeout);
  defineOperation(global, 'setInterval', timers.setInterval);
  defineOperation(global, 'setTimeout', timers.setTimeout);

  defineOperation(global, 'queueMicrotask', queueMicrotask);

  // Non-standard extensions:
  defineOperation(global, 'clearImmediate', timers.clearImmediate);
  defineOperation(global, 'setImmediate', timers.setImmediate);
}

Этот код встроен в исполняемый файл node.js, поэтому единственный известный мне способ напрямую изменить его (без хаки sh исправления самого исполняемого файла) - это изменить файл и затем перестроить node.js для ваша платформа в пользовательскую сборку.


На более практичном замечании вы также можете использовать -r module аргумент командной строки , чтобы node.js указать require(module) перед запуском вашего основного скрипта. Таким образом, вы можете сделать другой способ запуска node.js из файла оболочки, который всегда передает аргумент -r fullPathToYourModule в node.js, поэтому он всегда будет запускать ваш модуль запуска, который добавляет вещи в глобальный объект.

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

...