Использование потока или любой библиотеки Node.js в библиотеке Node-Browser (изоморфной)

Я работаю над библиотекой Node-Browser (Isomorphic), где исходный код написан на TypeScript и перенесен в модули CJS и ES. Транспилированный код поставляется как есть и не объединяется с помощью сборщика модулей перед публикацией.

Мне нужно использовать модуль потока из ядра узла, и я планирую использовать пакет stream-browserify для части браузера.

  1. Каков наилучший способ включить использование потока Node.js или любой конкретной библиотеки узла в библиотеке?
  2. Как я могу включить stream-browserify без необходимости переписывать один и тот же код или с минимальным дублированием?
  3. Я наткнулся на несколько примеров, где поле браузера в package.json используется следующим образом:
   "browser" : {
       "stream":"stream-browserify";
   } 

Как это работает?


person Nikitha    schedule 17.02.2021    source источник


Ответы (1)


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

Если вы не связываете свой код, это означает, что вы загружаете каждый отдельный файл по мере его импорта (я не уверен, как вы это делаете или собираетесь делать с CJS, поскольку в браузере нет require() API). Однако, если I import foo from "some-library"; и some-library является сторонним пакетом, файл JavaScript, который необходимо загрузить, необходимо каким-то образом импортировать.

Это означает три вещи:

  1. Вам нужен код модуля, а это значит, что вам нужно его установить (вы сделаете это с помощью хэша dependencies в вашем package.json).
  2. Вы должны иметь возможность импортировать код. Это означает, что ваш оператор import должен быть переписан вашим транспайлером/бандлером/и т.д. указать доступный путь. import foo from 'some-library'; нужно перевести 'some-library' во что-то вроде node_modules/some-library/src/index.js. Иначе как браузер узнает, что и откуда загружать?
  3. Вам нужно сделать то же самое для внутренних компонентов библиотек, которые вы импортируете, поскольку их импорт также необходимо будет переписать.

Хэш browser, который вы упоминаете, сопоставляет имена импортированных модулей в коде с удобной для браузера версией модуля. Приведенный вами пример означает, что require('stream') становится require('stream-browserify') при компиляции для браузера и require('stream') при компиляции для Node.

Для № 2 и № 3 выше TypeScript (или, скорее, tsc) не сделает это за вас. Похоже, что вам нужен такой инструмент, как Snowpack. Тем не менее, есть некоторые вещи, которые следует отметить.

Во-первых, вы не можете запустить какой-либо модуль Node в браузере или, по крайней мере, без более продвинутого инструмента, такого как Webpack, для имитации/перезаписи/замены зависимостей, которые требуют Node и не могут запускать в браузере. Если вы импортируете модуль, для которого требуется другой модуль, небезопасный для браузера, вы не узнаете, что он небезопасен для браузера, пока он не выдаст ошибку во время выполнения (будь то ошибка JS или 404 с вашего сервера).

Во-вторых, вам, вероятно, нужен упаковщик. Если вы используете модули Node, дерево зависимостей будет довольно глубоким. Если у вас есть 5000 JS-файлов в каталоге node_modules/, это 5000 сетевых запросов, многие из которых необходимо загружать, анализировать и выполнять последовательно (т. е. после того, как модуль, который их импортирует, загружается и анализируется). Такие оптимизации, как встряхивание деревьев, не обходятся без сборщика: даже Snowpack рекомендует создать оптимизированную сборку для производственных целей.

Тем не менее, если вы публикуете пакет (то есть вы загружаете его в NPM, а не развертываете его на своих собственных серверах), это в основном спорно. Просто напишите свой код так, как вы его обычно пишете, перечислите свои зависимости в dependencies и безопасные для браузера эквиваленты в browser и опубликуйте транспилированный исходный код. Люди, фактически использующие вашу библиотеку, будут беспокоиться о том, как ее загрузить. Если вы не публикуете в NPM (то есть вы сами размещаете этот код в Интернете), подумайте о сборщике. Ничто в сборщике не мешает вам иметь изоморфную библиотеку: у вас может быть один файл JS, который запускается в браузере и Node, или вы можете иметь два выходных файла (один браузер, один Node), которые скомпилированы из одного и того же источника. Как вы этого добьетесь, зависит от ваших целей.

person mattbasta    schedule 17.02.2021