uuid.js не использует crypto.getRandomValues ​​при сборке с browserify

Я столкнулся с проблемой при использовании библиотеки node-uuid. Я строил с browserify и обнаружил, что, несмотря на работу в современном браузере, который поддерживает API-интерфейс crypto, он фактически не использовал метод crypto.getRandomValues ​​для генерации случайности.

1 ответ

Решение

Короткий ответ:

Мы обнаружили, что проблема была вызвана неправильной настройкой 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 не возвращает никаких значений, поэтому вызывающая среда настроена как анонимный объект.

Другие вопросы по тегам