Повторное использование модуля Fullstack с веб-пакетом

Я работаю над проектом, который использует машинописный текст как на сервере (nodejs), так и на интерфейсе. В проекте задействована некоторая криптография, что означает, что я использую WebCrypto - на бэкэнде, который я используюnode-webcrypto-ossl как шим, так что я могу поделиться кодом между клиентом и сервером.

Есть ли способ заставить модуль экспортировать одну вещь на клиенте, а другую на сервере, чтобы я мог просто сделать import * as crypto from './webcrypto' выставить интерфейс обычным способом?

На сервер он должен экспортировать node-webcrypto-ossl а на клиенте просто выставь window.crypto,

Я пробовал разные вещи, но веб-пакет продолжает пытаться вытащить node-webcrypto-ossl в браузер, который неудивительно, что не удается.

Вот моя (неудачная) попытка:

let crypto = null;

if (typeof window === 'undefined') {
    const WebCrypto = require('node-webcrypto-ossl');
    crypto = new WebCrypto();
} else {
    crypto = window.crypto;
}

export {
    crypto as webcrypto
};

1 ответ

Сам подход в основном правильный, вам может понадобиться настроить externals хранить node-webcrypto-ossl быть загруженным только в контексте nodejs. Самый короткий псевдо выглядит

webpack.config.js
...
externals: {
  'node-webcrypto-ossl: {
    commonjs: 'node-webcrypto-ossl'
   },

тогда webpack не будет пытаться связать конкретный модуль, а выйдет require как и для этих модулей.

В дополнение к ним, вы можете настроить definePlugin а также для контекста node.js / browser, поэтому ваш криптомодуль может быть статически скомпилирован для каждой среды во время сборки, а не для поиска объекта во время выполнения.

Другие вопросы по тегам