Как я могу импортировать модуль Node в код клиента моего приложения Electron? - PullRequest
0 голосов
/ 21 мая 2018

Я строю настольную игру из модулей ES6, используя Electron 2 (для Chromium 61 + ) и esm shim на стороне сервера.Впервые я написал изоморфный JavaScript, не говоря уже о модулях ES6;Я намерен иметь возможность запускать игровую логику на клиенте в режиме одиночной игры и на сервере в режиме сетевой игры.Пока все хорошо, я рад сообщить!И приятно не полагаться на какие-либо тяжелые транспортеры.

Теперь у меня есть проблема: я намерен использовать типы из Immutable JS на клиенте, а также на сервере, иЯ только знаю, как импортировать их в код сервера.До сих пор все операторы импорта в изоморфном коде ссылались на другие модули JS в приложении, а не на зависимости от npm.Модуль, подобный приведенному ниже, вызывает ошибку времени выполнения «Uncaught TypeError: Не удалось разрешить неизменяемый спецификатор модуля» в клиенте при загрузке приложения:

import Immutable from "immutable";
Immutable.List.of([]);
export { foo: {} };

Фактически, я практически уверен, что оператор импорта не выполняется, потому что Chromium не может преобразовать «неизменяемый» в файл JS.Но как мне решить эту проблему?И есть ли способ решить эту проблему, который бы работал для любого модуля узла, который записан как изоморфный?

1 Ответ

0 голосов
/ 21 мая 2018

TL; DR - Вы не можете обойтись без помощи упаковщика, такого как веб-пакет, если вы используете модули npm.

Большая часть экосистемы пакета node.js еще не готова к использованию собственного модуля.Около 99% опубликованных пакетов в npm в настоящее время используют систему модулей CommonJS для node.js, хотя очень мало модулей написано для поддержки esm (также синтаксис модуля ES).

esm shim предназначен для того, чтобы помочь последнему - если модуль, написанный на esm и импортируемый в текущую версию node.js, не поддерживает, это помогает разрешить эти модули.Противоположный случай не работает.Chromium может импортировать ваш код напрямую, который написан в собственном синтаксисе, а затем попытаться разрешить модуль зависимости, который вы указали и не смог разрешить как 1. он не знает, где разрешить (так как он не следует правилам разрешения модуля node.js)2. когда это будет доступно для разрешения, фактический импорт потерпит неудачу, потому что модуль будет экспортировать cjs вместо нативного.

Вернитесь к TL; DR выше - если предполагается достижение изоморфного кода для запуска в обоих процессах,используйте упаковщик соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...