Перенос узла nodejs для React Native: Object.prototype undefined
Здесь мое исходное дерево в точный момент проблемы:
https://github.com/lucaszanella/jscam/tree/cf29b3cc90df7c5c7bb2d27c2205264d52b0715d/src/jscam
Я верю, что npm install
, npm start
и npm run android
его (обратите внимание, что onvif не установлен из npm, а клонирован в npm post-install
скрипт, а затем установлен, но он устанавливается в node_modules
с символической node_modules
на место, где он клонированный. Я даже пытался поместить все в node_modules
всякий случай, но ошибка сохраняется). Также не против дополнительных докеров, которые у меня есть в папке
В любом случае проблема заключается в следующем:
Я пытаюсь использовать модуль nodejs onvif в React Native, поэтому я использовал этот метод для перевода требуемых методов с помощью babel и установленных модулей браузера для реализации основных модулей nodejs. Я тестировал с помощью простых примеров, таких как криптография, и это сработало. Однако, когда я пытаюсь просто импортировать модуль onvif, я получаю следующее:
Здесь device.js строка 30, выглядит как Cam
не определено здесь
Когда я импортирую onvif.js
который импортирует cam.js
, ничего не происходит. Но затем он импортирует device.js
который, кажется, становится неопределенным при повторном импортировании cam.js
Я также пробовал этот метод, который, кажется, избегает всех переводов Babel, но на удивление проблема остается.
ОБНОВИТЬ:
Здесь новое исходное дерево: https://github.com/lucaszanella/jscam/tree/98b714219ed25b9d91ea3af275177f66fdb74fa2/src/jscam
Теперь я использую extraNodeModules, который является официальным способом. Вы можете видеть мои зависимости здесь: https://github.com/lucaszanella/jscam/blob/98b714219ed25b9d91ea3af275177f66fdb74fa2/src/jscam/rn-cli.config.js
Теперь ошибка изменилась:
На этой строке: https://github.com/isaacs/sax-js/blob/d65e3bb5049893aaab4aba05198b9cd335b5a1ad/lib/sax.js#L222
Он по-прежнему похож на тот же тип ошибок, хотя
Обновление: если вы не нашли дграмму, попробуйте
npm install lucaszanella/react-native-dgram-shim
Это уже в пакете.json, он должен быть установлен, но кто-то пожаловался, что он не
Ответы
Ответ 1
Итак, есть три вопроса, которые я нашел
-
react-native-dgram-shim
необходимо скопировать как dgram
в node_modules
-
stream: require.resolve('stream-browserify')
необходимо использовать в rn-cli.config.js
. Используемый вами потоковый модуль, по-видимому, не определял объект Stream
а доступ Stream.prototype
вызвал ошибку -
onvif
модуль имеет cam → device → cam
, это обрабатывается хорошо browserify
, webpack
и nodejs
. Но metro
упаковщика, который react-native
, похоже, не нравится циклический импортные. Это означает, что требования require.js
должны быть исправлены или необходимо удалить циклическую зависимость
Таким образом, вы либо исправляете polyfill require.js
в jscam/src/jscam/node_modules/metro/src/lib/polyfills/require.js
либо вы изменяете свои файлы, чтобы удалить циклический импорт, передав необходимые объекты, как jscam/src/jscam/node_modules/metro/src/lib/polyfills/require.js
ниже
require('./device' ) (Cam);
И обновите device.js
как device.js
ниже.
module.exports = (Cam) => {
И удалите
const Cam = require('./cam').Cam
Это позволит убедиться, что циклическая зависимость удалена, и модуль должен затем загрузить штраф
PS: На стороне примечания, поэтому его настойчивость побеждает. Это была твоя 3-я щедрость, и я смотрел, как вопрос второй раз передо мной. Но ваша третья попытка побудила меня погрузиться и посмотреть, смогу ли я помочь вам.