RN组件开发时也不放弃热重载,做10倍程序员

1,701 阅读4分钟

做过ReactNative(简称RN)开发的小伙伴,往往被RN的热重载功能所打动。

当你修改完代码保存文件后,无论是手机还是模拟器上对应的界面都能立刻刷新,而不需要重新加载页面。

但是如果你想开发一个可复用的组件,往往不能如愿使用热重载。

经过长期的搜寻和摸索,我总结了一套高效开发组件的方法。

现在分享出来,希望能帮助小伙伴们节约探索的时间。

着急的小伙伴可以直接跳到标题3.2

1 热重载是高效开发的必备神器

当你调试一个页面的时候,每次改动无需重新安装应用,无需重新一层层的打开页面。

这无疑给开发者节约了大量时间。我们真的很需要热重载。

Hot Reloading

热重载是基于 Hot Module Replacement(简称HMR)的。

原理是RN中使用watchman监听项目文件变更,当发现文件被修改后,以补丁的形式更新bundle文件。

我们平时写当js代码都会打包到这个bundle文件中,最终被框架执行。

How Hot Reloading

当开发可复用的组件时,我们需要将组件代码写到单独的组件工程里面,发布到npm上以便于复用。

我们可以想一些办法在本地调试,而不是改完代码就发布一版npm,安装后再看效果。

2 组件代码放在什么地方合适?

2.1 组件代码放在node_modules目录中:容易被不小心清理掉

有时我们不得不清空node_modules 做过RN开发的小伙伴通常对这个错误很熟悉:“Module xxx does not exist in the Haste module map”。

错误

一旦你忘了备份正在开发的node_modules下的组件代码。

又按照提示执行到第二步:

rm -rf node_modules。

这时候,你就能更好的理解这些成语:欲哭无泪、痛不欲生、从头再来。

2.2 组件代码放在App工程内node_modules外:git不好管理

懒癌发作,如不清楚,可在评论区留言,我将展开讨论

2.3 组件代码放在App工程目录外:无法热重载

懒癌发作,如不清楚,可在评论区留言,我将展开讨论

3 解决方案

尝试使用yarn link 未果

在调用工程根目录执行:

yarn link "@zhike-private/rn-protocal-view"

输出:

yarn link v1.17.3
success Using linked package for "@zhike-private/rn-protocal-view".
✨ Done in 0.08s.

本质上这个操作相当于 将组件工程目录链接到 调用工程node_modules 目录下面。

这适用于js,但是对于RN,

呵呵,不能工作。

3.1 初步解决方案

做十倍程序员,需要全身心投入,不应该提心吊胆时不时的备份项目。

做十倍程序员,离不开git,想提交就提交,想回退就回退。

做十倍程序员,需要热重载,避免将时间消耗在不断的安装和打开页面上。

因此,要做十倍程序员,必须解决前面的问题。

上面3个问题中,貌似第三个是最容易解决的问题。

我们可以把代码放在项目外,需要的时候将代码拷贝到App工程的node_module目录下。

为了便于拷贝,还可以专门写个拷贝的脚本。貌似完美了。

然而,这样你就满足了吗?

想象这样调试的场景:

改代码,考代码,看结果
改代码,考代码,看结果
改代码,考代码,看结果
...
改代码,考代码,看结果

这个考代码的动作好碍眼啊。

3.2 终极解决方案:wml

最后在这里找到了解决方案:RN中使用同步链接的包, 不过这里面说的有点啰嗦。

简单总结如下:

3.2.1 wml的作用

使用wml,你可以监控一个目录下的文件变化,自动将该目录同步到另一个目录。

3.2.2 如何使用wml之安装

yarn global add wml

3.2.3 如何使用wml之配置

wml add ~/my-package ~/main-project/node_modules/my-package

3.2.4 如何使用wml之开启

wml start

进阶

如果你感兴趣可以研究一下wml start后生成的.watchmanconfig文件。

这里面记录了一些可以忽略的目录比如.git目录 组件自己的node_modules目录。

当然你可以添加新的,比如说你组件的例子的目录。