ReactNative中把js编译成bundle后,js引用的图片的去向

标签(空格分隔): ReactNative


前言

这篇文章我们来讲解,使用react-native bundle 命令将js文件编译成bundle文件后,ReactNative(以下简称RN)对我们的Android工程都做了什么。

正文

首先,假设我们已经在原有的android工程中增加了对RN的支持,RN工程目录结构如下图:

imgs文件夹存放js文件中需要用到的图片,RNDemo就是我们的android工程,我们在index.android.js中的代码很简单

import React, {    Component,} from 'react';import {     AppRegistry,     Image,     Text,     View, } from 'react-native';class DemoProject extends Component {     constructor(props) {         super(props);     }     render() {         return (                              './imgs/mypic.png')} />                     );     } }; AppRegistry.registerComponent('RNDemo', () => DemoProject);

仅仅是展示一个imgs文件夹中名为mypic.png的图片

接下来,我们在命令窗口中cd到我们的RN工程根目录,执行

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output RNDemo/app/src/main/assets/index.android.bundle --assets-dest RNDemo/app/src/main/res/my_floder

接下来解读一下这行命令的意思:

  • –platform android 意思是编译为android平台所需要的代码,
  • –entry-file index.android.js 意思是入口文件是RN工程下的index.android.js,因为我们命令是在RN工程目录下执行的,index.android.js也在RN工程根目录,所以不用加相对路径
  • –bundle-output RNDemo/app/src/main/assets/index.android.bundle 意思是把编译后的bundle输出到哪里,在这里我们和官网要求的一样,输出到我们Android工程的assets目录下,最后定义我们bundle文件的全名称index.android.bundle
  • –assets-dest RNDemo/app/src/main/res/my_floder 意思是资源文件输出的位置,例如我们最开始提到的RN工程下的imgs文件夹,用于存放图片,就属于资源文件,所有的RN工程需要的资源文件会被copy到RNDemo/app/src/main/res/my_floder这个目录下,需要注意的是,my_floder是我为了看清RN会产生哪些资源文件而故意这样写的。

这个图中我们可以看到RN将我们的js文件编译成了bundle文件,在文件的最末尾,可以看到这样一行代码

不难看出,RN已经将我们的图片资源文件路径编译了进来,那么这个图片到底去了哪里?为什么我们的Android工程可以不依赖RN工程目录下面的imgs资源而独立运行了呢?答案就在my_folder文件夹中,如图:

最终我们在drawable-mdpi中找到了我们的图片资源,图片资源已经被命名为imgs_mypic.png,不难看出,命名规则是按照RN工程目结构来的。

需要注意两点:

  • 1.正确的bundle命令是不能带上最后一个my_folder的,我这样写只是为了方便大家看清楚RN所引用的图片的去向,之前被怀疑图片被编译成了二进制,其实并不是。
  • 2.android工程中已经存在的目录不会被bundle命令删除,同名的文件会被覆盖更新,如果RN工程中不再需要mypic.png,而需要mypic2.png,再次执行bunlde命令后,会在这个目录下生成imgs_mypic2.png,原来的imgs_mypic.png还是存在的,不会被删除。
    下图说明上述第2点:

所以在开发过程中,一定要注意编译到android工程中的图片资源,不要产生无用的多余资源。

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android创建桌面快捷方式两种方法
  6. Android(安卓)远程图片获取和本地缓存策略
  7. Android(安卓)使用AudioRecord录音相关和音频文件的封装
  8. 初次安装开发工具Android(安卓)studio所做配置
  9. 何为原生开发

随机推荐

  1. android dumpsys使用
  2. Configuring a New Product of Android(
  3. 字符画
  4. android_7 editView
  5. android下拉菜单制作
  6. 自定义dialog
  7. MediaRecorder
  8. 线程池工具类
  9. Android-生命周期方法
  10. Handler的理解