Обработка зависимостей в модуле es6, предназначенном для узла и браузера - PullRequest
4 голосов
/ 18 июня 2020

Я написал библиотеку javascript как модуль ES6, в первую очередь предназначенную для использования в браузере. Теперь я хочу упаковать его для узла. Я согласен с ограничением до версии 14+. Я не хочу транспилировать.

Я не знаю, как обрабатывать зависимости. Один, в частности, момент- js, доставляет мне неприятности.

В браузере (пробовал последнюю версию FF + Chrome) я ссылаюсь на библиотеку моментов в теге <script>, а затем в своем коде я могу просто использовать переменную moment, не имея чтобы сначала импортировать его.

my-module.js:

function testFn() {
  return moment.duration(300).asSeconds();
}

export { testFn }

browser code:

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.26.0/moment.min.js"></script>
<script type="module" src="my-module.js"></script>
<script>

import { testFn } from 'my-module.js';
let val = testFn();
console.log(val); 

</script>

Однако в узле мне нужно, чтобы модуль включал import, чтобы он работал:

my-module.js:

import moment from 'moment';

function testFn() {
  return moment.duration(300).asSeconds();
}

export { testFn }

Тогда я могу использовать my-module в узле:

import { testFn } from 'my-module.js';

let val = testFn();
console.log(val); 

Но теперь код браузера не работает: TypeError: Error resolving module specifier: moment

Я пробовал разные import s (import * as ..., import { moment } from ...), но не повезло - браузер все равно жалуется.

Moment- js - это просто пример - я бы хотел общее c решение, так как у меня есть и другие зависимости.

Это должна быть проблема, которую другие люди решали, не прибегая к ужасным обходным путям, например обнаружение среды и условный импорт. У кого-нибудь есть хорошее решение или ссылка? Спасибо!!

1 Ответ

0 голосов
/ 03 июля 2020

Вы пробовали import * as moment from "./moment.js"; (вам может потребоваться изменить путь в зависимости от того, где вы его устанавливаете и как момент обрабатывает файл)?

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

...