Рубрики
Без рубрики

Сделайте свой пакет NPM работать на обоих Node.js и браузере

Недавно я работал над пакетом NPM, который должен быть потребляется на обоих средах Node.js, так и T … Помечено NPM, узел, учебник, JavaScript.

Я недавно работал на пакете NPM, который должен быть потребляется на обоих средах Node.js, так и в браузере (с использованием React/Angular/etc ..).

Все начало осложнить, когда узел ветвь кода необходимо требовать нативных пакетов Node.js – как ФС Отказ

Рассмотрим следующий (упрощенный) код:

// node-handler.js
const fs = require('fs');

export const handle = () => { 
  fs.readFileSync(…);
  …
};

// browser-handler.js
export const handle = () => { … };

// index.js
const nodeHandler = require('./node-handler').handle;
const browserHandle = require('./browser-handler').handle;
const isNode = require('./config').isNode;

const handle = isNode ? nodeHandler : browserHandle;

При тестировании модуля в моем ATT + WebPack App приложение разбилось:

Это произошло, даже если Узел обработчик Файл не был выполнен, это связано с природой WebPack создания пакета, содержащего весь код.

Шаг 1: отложить свой требует

Вместо того, чтобы требовать ФС В глобальном объеме мы можем потребовать его только там, где нам это действительно нужно, то, как нам не требуется, при запуске в браузере:

// node-handler.js
export const handle = () => { 
  require('fs').readFileSync(…);
  …
};

// browser-handler.js
export const handle = () => { … };

// index.js
const nodeHandler = require('./node-handler').handle;
const browserHandle = require('./browser-handler').handle;
const isNode = require('./config').isNode;

const handle = isNode ? nodeHandler : browserHandle;

Прохладный! Наше приложение React не разбивается! Но мы получаем раздражающее предупреждение о компиляции прямо сейчас:

Хотя мы можем жить с предупреждением ⚠️, наши конечные пользователи, вероятно, не понравится это слишком много, и в конечном итоге не устанавливает наш пакет.

Шаг 2: Eval Ваше требуется

Это не самое элегантное решение (чтобы сказать наименее ..), Но он сохраняет WebPack тихий и ваши конечные пользователи счастливы. Вместо использования требуют ('fs') мы собираемся использовать Eval («Требовать») («FS») :

// node-handler.js
export const handle = () => { 
  eval('require')('fs').readFileSync(…);
  …
};

// browser-handler.js
export const handle = () => { … };

// index.js
const nodeHandler = require('./node-handler').handle;
const browserHandle = require('./browser-handler').handle;
const isNode = require('./config').isNode;

const handle = isNode ? nodeHandler : browserHandle;

И это все! Всего две простые шаги, чтобы сделать ваш пакет NPM работать на обоих Node.js и браузере.

Удачи и можете ли вы быть благословлены тоннами звезд 🌟

Оригинал: “https://dev.to/aspecto/make-your-npm-package-work-on-both-node-js-and-browser-30n7”