crypto.createHmac 在汇总后未定义



我正在尝试将库的代码rollupdist文件夹中。
现在我对内置crypto库有问题。

端子输出:

$ yarn run build
...
lib/helpers/security.js
createHmac is not exported by node_modules/rollup-plugin-node-builtins/src/es6/empty.js
...

汇总配置

...
plugins: [
builtins(),
resolve(),
json(),
babel({
exclude: ['node_modules/**','**/*.json']
})
]
...

源代码

我的源代码片段:

// lib/helpers/security.js
import * as crypto from 'crypto'
crypto.createHmac('sha256',nonce).update(text).digest('base64');

结果

汇总的捆绑js输出:

undefined('sha256', nonce).update(text).digest('base64');

加密.js源代码

作为参考,github上node/crypto.js中的相关export语句显示createHmac正在导出。

节点/加密.js L147

更新 1 ( 解决方案 ?

似乎从security.js中删除import行可以解决问题。我知道crypto是一个内置的节点模块。

我想了解为什么在这种情况下我不应该import,而文档中的示例确实导入了模块。

所以这就是我想出的解决方案,对我来说效果很好。

将项目中的rollup-plugin-node-builtins作为开发依赖项安装。并将其导入您的rollup.config.js

import builtins from 'rollup-plugin-node-builtins'

使用builtins()时将crypto设置为false。它默认为browserify中的commonjs版本。那不是我想要或需要的。

// set crypto: false when using builtins()
...
builtins({crypto: false}),
...

确保将crypto添加到external选项中:

// add `crypto` to the `external` option
// you probably already have 
// one or more libs defined in there
let external = ['crypto']

现在,我可以在库中使用crypto,而不会在使用构建的文件时出现以前的问题。

import { createHmac } from "crypto";

结果是一个大小为 4KB 的模块,它取决于几个外部依赖项,而不会将它们包含在构建的文件中。

对于上下文:我的源代码是用 ES6 编写的,我正在构建模块的三个版本:cjsumdes

我会避免使用babel服务器端文件,这是可以做到的,但我不喜欢这样做。 因此,如果您使用 require(( 而不是 import(导入未内置在 Node.js v8 中(,则可能不会遇到错误:

var crypto = require("crypto");

最新更新