1

我正在开发一个在后端(nodejs)和前端都使用打字稿的项目。该项目涉及一些密码学,这意味着我正在使用WebCrypto - 在后端我node-webcrypto-ossl用作垫片,因此我可以在客户端和服务器之间共享代码。

有没有办法让模块在客户端导出一个东西,在服务器上导出另一个东西,这样我就可以import * as crypto from './webcrypto'以一种常见的方式公开接口?

在服务器上它应该导出node-webcrypto-ossl,而在客户端上只是暴露window.crypto.

我尝试了各种方法,但 webpack 一直试图拉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
};
4

1 回答 1

2

方法本身大部分是正确的,您可能需要配置 webpackexternals以保持node-webcrypto-ossl仅在 nodejs 上下文中加载。最短的伪看起来像

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

然后 webpack 将不会尝试捆绑特定模块,而是保留require这些模块。

除此之外,您还可definePlugin以为 node.js / 浏览器上下文进行配置,以便您的加密模块可以在构建时为每个环境静态编译,而不是在运行时查找对象。

于 2018-01-01T04:27:25.527 回答