ripple-lib использует определенные зависимости, которые используют специальные или глобально доступные модули для node.js и получают к ним доступ через require
или напрямую из контекста global
. В действительности среда NativeScript отличается как от node.js, так и от браузера, поэтому мы должны убедиться, что все зависимости соблюдаются и доступны для работы в среде {N}.
Для многих вариантов использования плагин nativescript-nodeify выполняет свою работу, но в случае использования ripple-lib
это не решает проблему, поэтому мы должны позаботиться о совместимости вручную:
1) ripple-lib
зависимость bignumber.js использует собственную библиотеку узлов crypto . Поскольку он недоступен во время выполнения {N}, мы должны использовать специально разработанный модуль nativescript-randombytes и сделать его доступным глобально с помощью веб-пакета веб-пакета * providePlugin :
Добавить плагин NativeScript в проект:
tns plugin add nativescript-randombytes
Создайте файл, который будет частичной реализацией crypto
модуля:
// Example path: project/app/shims/crypto.js
module.exports.randomBytes = require('nativescript-randombytes')
Добавьте его к webpack.config.js
в конфигурации плагинов:
plugins: [
..., // other plugins
new webpack.ProvidePlugin({
crypto: resolve(__dirname, 'app/shims/crypto.js')
})
]
Добавьте resolve.alias
для нашей версии crypto
в webpack.config.js
, поэтому дочерние зависимости require
наша crypto
реализация:
alias: {
..., // Other aliases
'crypto': resolve(__dirname, 'app/shims/crypto.js')
}
2) Отсутствует несколько обязательных модулей, хотя мы можем установить их вручную, поскольку они совместимы со средой выполнения NativeScript:
npm i -S lodash bufferutil tls utf-8-validate
3) ripple-lib
, похоже, не работает с доступной реализацией веб-сокетов, поэтому мы должны использовать кроссплатформенное решение для NativeScript - nativescript-websockets
Добавить плагин к проекту:
tns plugin add nativescript-websockets
И импортировать его до ripple-lib
Импорт:
import 'nativescript-websockets'
import { RippleAPI } from 'ripple-lib'
4) net
Модуль node.js также необходим для установления соединения, которое можно смоделировать с помощью конфигурации webpack node mocks. Добавьте следующее в node
опции конфигурации в webpack.config.js
:
node: {
..., // Other default NativeScript shims
"net": 'mock',
},
5) Некоторые библиотеки не уверены в среде, в которой они работают, и по умолчанию используют Node, что заставляет их запрашивать недоступные модули. Чтобы исправить это, установите resol.aliasFields в 'browser', как показано ниже:
resolve: {
// other options, aliases, etc
aliasFields: ['browser']
}
6) Еще одна библиотека, которая не может работать сама, так как зависит от crypto
модуля: create-hash
. Хорошо, что он поставляется со сборкой браузера, которую мы можем использовать для ее исправления. Добавьте еще alias
в resolve
опциях для webpack.config.js
:
alias: {
..., // Other aliases
'create-hash': 'create-hash/browser'
}
7) После того, как все шаги будут выполнены, обязательно очистите файлы проекта. Сделайте следующее:
Удалить папки:
rm -rf platforms/android # or ios
rm -rf hooks
rm -rf node_modules
Переустановите пакеты и добавьте платформы:
npm i
tns platform add android # or ios