【问题标题】:resolving assets relative to react native bundle file outside project root解析与项目根目录外的本机捆绑文件相关的资产
【发布时间】:2020-03-28 01:34:35
【问题描述】:

问题(android):如果捆绑文件位于项目根目录之外,则相对于 js 捆绑文件放置图像资产的位置?

我们有一个小型服务,我们在每次构建时上传 JS 包。因此,例如我们有应用程序com.example,如果我们想更新我们的应用程序(当应用程序商店中的应用程序审查待定时),那么我们:

  1. 下载JS bundle到安卓路径/data/data/com.example/files/bundle/android.bundle
  2. 通过https://github.com/mauritsd/react-native-dynamic-bundle将此捆绑包设置为活动状态

想象一下,在 react App 组件中,我们有一个路径为 star.png 的图像。

当我们激活一个新的捆绑包时,星形图像不会显示。

我在发布版本中通过 https://reactnative.dev/docs/image#resolveassetsource 检查了图像路径,图像 uri 仅解析为 star

所以我尝试了以下文件结构:

№1

data
--data
----com.example
------files
--------bundle
----------android.bundle <= dynamic bundle from remote server
----------star // <= our image

№2

data
--data
----com.example
------files
--------bundle
----------android.bundle <= dynamic bundle from remote server
----------star.png // <= our image

但如果捆绑文件位于项目根目录之外,则不会显示静止图像。

问题:

  1. 我做错了什么? https://github.com/Microsoft/react-native-code-push 设法解决了这个问题。
  2. ios解决方案和android解决方案一样吗?

提前致谢

【问题讨论】:

    标签: react-native code-push react-native-code-push


    【解决方案1】:

    Bundle assets 应该放在 js bundle 文件所在的同一个文件夹中(仅在 android 上测试过)。

    您始终可以通过https://reactnative.dev/docs/image#resolveassetsource 获取捆绑资产路径。

    如何测试:

    1. 将图像star.png 放入项目根目录。
    2. 使用以下代码创建一个 React Native 应用:
    import React from 'react';
    import {
      SafeAreaView,
      Text,
      StatusBar,
      Image
    } from 'react-native';
    import Star from './star.png';
    
    const App: () => React$Node = () => {
    
      const r = Image.resolveAssetSource(Star);
      console.log(r);
    
      return (
        <>
          <StatusBar barStyle="dark-content" />
          <SafeAreaView>
            <Text>TestAssetsApp</Text>
            <Image
              style={{width: 50, height: 50}}
              source={Star}
            />
          </SafeAreaView>
        </>
      );
    };
    
    export default App;
    
    
    1. 在您的MainApplication.java中设置捆绑路径(我的应用包名为com.testassetsapp):
    public class MainApplication extends Application implements ReactApplication {
    
      private final ReactNativeHost mReactNativeHost =
          new ReactNativeHost(this) {
            @Override
            public boolean getUseDeveloperSupport() {
              return BuildConfig.DEBUG;
            }
    
            @Override
            protected List<ReactPackage> getPackages() {
              @SuppressWarnings("UnnecessaryLocalVariable")
              List<ReactPackage> packages = new PackageList(this).getPackages();
              // Packages that cannot be autolinked yet can be added manually here, for example:
              // packages.add(new MyReactNativePackage());
              return packages;
            }
    
            @Override
            protected String getJSMainModuleName() {
              return "index";
            }
    
            // Add this method
            @Override
            protected String getJSBundleFile() {
              return "/data/data/com.testassetsapp/files/android.bundle";
            }
          };
    
    1. 通过以下方式创建 android JS 包和资产:
    react-native bundle --platform android --dev false --entry-file index.js --bundle-output android.bundle --assets-dest assets
    
    1. 通过以下方式安装调试版本:
    cd android && ./gradlew installDebug
    

    注意:仅通过 ./gradlew installDebug 进行测试没有运行 Metro 捆绑器,因为它总是重写捆绑路径。

    现在,如果您运行该应用程序,您将收到“找不到捆绑包”错误。

    1. 上传android.bundle文件到/data/data/com.testassetsapp/files/android.bundle

    现在,如果您运行应用程序,它应该会启动。但是星图还没有显示出来。

    1. 将包文件从assets 文件夹上传到/data/data/com.testassetsapp/files,因此应用数据结构应如下所示:

    现在,如果您重新启动应用程序星形图像,应该会显示出来。

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      相关资源
      最近更新 更多