Загрузите ReactNativeHost для Android с помощью пакета с удаленного хоста

Я предварительно скомпилировал свой пакет для реагирования и загрузил его на свой сервер (поддельный URL-адрес):

http://my-bundle-server.com/index.android.bundle.js

Для iOS я могу просто создать представление, используя это место, и оно отлично работает:

 jsCodeLocation = "http://my-bundle-server.com/index.android.bundle.js";
 RCTRootView *rootView = [[RCTRootView alloc]
     initWithBundleURL:jsCodeLocation                                                      
     moduleName:@"MyCoolComponent"
     initialProperties:nil                                                  
     launchOptions:launchOptions];

С Android это другая история, я не мог найти способ определить этот путь для удаленного пакета. Я нашел документацию для ReactNativeHost и попытался установить getJSBundleFile, но это дает мне сообщение «Не удалось загрузить файл http: //....js»:

https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.java

Returns a custom path of the bundle file. This is used in cases the bundle should be loaded from a custom path. By default, it is loaded from Android assets, from a path specified by {@link getBundleAssetName}. e.g. "file://sdcard/myapp_cache/index.android.bundle"

Похоже, что с удаленными местами работать не будет. Стоит упомянуть, что я создаю свой хост в приложении, чтобы я мог повторно использовать его в разных фрагментах моего приложения.

Как я могу определить местоположение предварительно скомпилированного пакета для загрузки для приложения Android?

3
0
839
2

Ответы 2

Реализация по умолчанию, похоже, использует реализацию файловой системы:

https://github.com/facebook/react-native/blob/4466b6fa7ce5325cac3233a23b10ffcb4ff038a7/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java#L93

Но, похоже, есть возможность выставить сборщик, который может загружать здесь удаленный URL-адрес (в противном случае, как бы dev server url загружал пакет из localhost-rite?):

https://github.com/facebook/react-native/blob/4466b6fa7ce5325cac3233a23b10ffcb4ff038a7/ReactAndroid/src/main/java/com/facebook/react/bridge/JSBundleLoader.java#L65

вместе с внешним интерфейсом api, чтобы установить здесь пользовательский загрузчик пакетов:

https://github.com/facebook/react-native/blob/4466b6fa7ce5325cac3233a23b10ffcb4ff038a7/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java#L112

P.S. Я не пробовал ничего из вышеперечисленного, но это работает.

Что такое sourceUrl и т. д.? Как мне это использовать? Я здесь java noob. Пытаюсь использовать это как обходной путь для запуска моего сервера разработки. Кажется, не подключается, но отлично работает на localhost: 8081 /…

evanjmg 27.03.2021 15:51

В продолжение ответа Джея: вот рабочая реализация удаленного пакета

    ReactInstanceManager.builder()
            .setApplication(getApplication())
            .setCurrentActivity(this).setJSBundleLoader(
                                JSBundleLoader.createCachedBundleFromNetworkLoader(
                                "index.android.bundle",
                                "http://localhost:8081/index.bundle?platform=android&dev=false&hot=false&minify=false"
                                )
                        )

Однако я получаю эту ошибку: / TypeError: React.useEffect не является функцией, но сборщик работает и запускается

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