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

uuid.js not using crypto.getRandomValues when built with browserify

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

简答:

我们发现问题是由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 的初始化时,它会设置调用环境为 window.

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