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