我正在做一个在后端(nodejs)和前端都使用typescript的项目。这个项目涉及到一些密码学,这意味着我使用的是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
};
发布于 2018-01-01 12:27:26
方法本身大部分是正确的,您可能需要配置webpack的externals
来保持node-webcrypto-ossl
仅在nodejs上下文中加载。最短的伪函数看起来像
webpack.config.js
...
externals: {
'node-webcrypto-ossl: {
commonjs: 'node-webcrypto-ossl'
},
然后,webpack将不会尝试捆绑特定的模块,而是让那些模块的require
保持原样。
除此之外,您还可以为node.js /浏览器上下文配置definePlugin
,以便可以在构建时为每个环境静态编译加密模块,而不是在运行时查看对象。
https://stackoverflow.com/questions/48046736
复制相似问题