uuid.js在使用browserify构建时不使用crypto.getRandomValues

时间:2015-11-03 04:02:14

标签: browserify browserify-shim node-uuid

我使用node-uuid库遇到了问题。我正在使用browserify构建,我发现尽管在支持加密API的现代浏览器中运行,但它实际上并没有使用crypto.getRandomValues方法来生成随机性。

1 个答案:

答案 0 :(得分:0)

简答:

我们发现问题是由browserify-shim的错误配置引起的。在package.json中,添加以下行:

  "browserify-shim": {
    "node-uuid": "uuid"
  }

更长的回答:

在uuid.js中,它具有以下初始化:

if (!_rng && _global.crypto && crypto.getRandomValues) {
    // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto
    //
    // Moderately fast, high quality
    var _rnds8 = new Uint8Array(16);
    _rng = function whatwgRNG() {
      crypto.getRandomValues(_rnds8);
      return _rnds8;
    };
  }

_global的值是一个匿名对象,_global.crypto的值未定义。添加上述配置后,_global的值为window_global.crypto的值为预期值。

原因是,当你配置browserify-shim时,我们告诉它node-uuid库会将变量uuid导出到调用环境中。在浏览器中,调用环境将是window,因此当它运行node-uuid的初始化时,它会设置为调用环境为窗口。

如果你没有这样配置,那么browserify-shim认为node-uuid没有返回任何值,所以调用环境被设置为匿名对象。