Повторное использование модуля 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, поэтому ваш криптомодуль может быть статически скомпилирован для каждой среды во время сборки, а не для поиска объекта во время выполнения.