ReactNative 加载bundle包-android
当我们的项目接入react_native之后,下一步就是考虑如何加载bundle包了,首先,我们要了解Android加载js代码有哪些方式。
1.从本地服务器加载
这种方式是支持热部署的, 在启用开发服务器的情况下,修改了代码,立马可以在设备上看到改动后的效果。 按照下面描述的任意一种方法来使你的运行在电脑上的开发服务器可以从设备上访问到。
启动服务
在项目根目录执行npm start,启动提供jsbundle的Node.js服务器(它会默认监听本地的8081端口,请确保不被占用)
注意
现在大部分安卓设备已经没有了硬件"Menu"按键,这是我们用来调出开发者菜单的。在这种情况下你可以通过摇晃设备来打开开发者菜单(重新加载、调试,等等……)
(Android 5.0及以上)使用adb reverse命令
注意,这个选项只能在5.0以上版本(API 21+)的安卓设备上使用。
首先把你的设备通过USB数据线连接到电脑上,并开启USB调试(关于如何开启USB调试,参见上面的章节)。
- 运行
adb reverse tcp:8081 tcp:8081
- 不需要更多配置,你就可以使用
Reload JS
和其它的开发选项了。
(Android 5.0以下)通过Wi-Fi连接你的本地开发服务器
- 首先确保你的电脑和手机设备在同一个Wi-Fi环境下。
- 在设备上运行你的React Native应用。和打开其它App一样操作。
- 你应该会看到一个“红屏”错误提示。这是正常的,下面的步骤会解决这个报错。
- 摇晃设备,或者运行
adb shell input keyevent 82
,可以打开开发者菜单。 - 点击进入
Dev Settings
。 - 点击
Debug server host for device
。 - 输入你电脑的IP地址和端口号(譬如10.0.1.1:8081)。在Mac上,你可以在系统设置/网络里找查询你的IP地址。在Windows上,打开命令提示符并输入
ipconfig
来查询你的IP地址。在Linux上你可以在终端中输入ifconfig
来查询你的IP地址。 - 回到开发者菜单然后选择
Reload JS
。
补充一点
关于rn的热部署,有篇文章写的挺好,可参考React Native 热部署
2.本地加载
当我们无法通过usb或者wifi进行调试的时候,只能通过打离线包来调试,同时在项目发版的时候同样需要打离线包。离线包就是ReactNative 和你写的 js文件、图片等资源都打包放进App。
使用 react-native bundle --help 来查看打包的具体参数
eact-native bundle [options]
builds the javascript bundle for offline use
Options:
--entry-file <path> Path to the root JS file, either absolute or relative to JS root
--platform [string] Either "ios" or "android"
--transformer [string] Specify a custom transformer to be used
--dev [boolean] If false, warnings are disabled and the bundle is minified
--bundle-output <string> File name where to store the resulting bundle, ex. /tmp/groups.bundle
--bundle-encoding [string] Encoding the bundle should be written in (https://nodejs.org/api/buffer.html#buffer_buffer).
--sourcemap-output [string] File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map
--sourcemap-sources-root [string] Path to make sourcemap's sources entries relative to, ex. /root/dir
--sourcemap-use-absolute-path Report SourceMapURL using its f%
对于以上官方给出的参数说明,可自行尝试演练下。
本人是android开发人员,在实际项目使用的命令如下(针对android):
node --max-old-space-size=4096 node_modules/react-native/local- cli/cli.js bundle --entry-file index.js --platform android --dev false --bundle-output ../app/src/main/assets/index.android.bundle --assets-dest ../app/src/main/res/ --sourcemap-output /tmp/sourcemap.txt"
可能遇到的问题:
1.通过打包命令失败,提示 ENOENT: no such file or directory, open '../app/src/main/assets/index.android.bundle'
这个问题其实很简单,检查一下app模块是不是存在assets目录,若不存在,手动创建即可。
- 问:点击Dev Settings导致程序崩溃
答:如果需要访问 DevSettingsActivity 界面,需要在 AndroidManifest.xml 中声明: <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
3.8081端口被占用了,无法调试js代码?
首先尝试杀死占用8081的进程,若无法杀死,可考虑使用8088端口。参考Troubleshooting来解决