汇总后,crypto.createHmac未定义

时间:2018-06-11 11:13:48

标签: node.js ecmascript-6 rollupjs

我正在尝试将rollup我的图书馆代码放入dist文件夹中 现在我的内置crypto库存在问题。

终端输出:

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

Rollup config

...
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');

Crypto.js源代码

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

node/crypto.js L147

更新1(解决方案?)

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

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

2 个答案:

答案 0 :(得分:2)

这是我想出的解决方案,对我来说很好用。

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

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

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

browserify

请确保将// set crypto: false when using builtins() ... builtins({crypto: false}), ... 添加到您的external选项:

crypto

现在,使用构建文件时,我可以在图书馆中使用// add `crypto` to the `external` option // you probably already have // one or more libs defined in there let external = ['crypto'] 了,而不会出现以前的问题。

crypto

结果是一个大小为4KB的模块,它依赖于几个外部依赖项,而没有将它们包含在生成的文件中。

对于上下文:我的源代码是用ES6编写的,并且我正在构建模块的三个版本:import { createHmac } from "crypto"; cjsumd

答案 1 :(得分:0)

我会避免使用服务器端文件,它可以完成,但我不喜欢这样做。 因此,如果使用require()而不是import(导入不是Node.js v8中的内置),则可能没有错误:

var crypto = require("crypto");