Skip to main content

在本地调试React外部依赖的正确姿势

前言

实际开发中,可能我们的工程结构并不仅仅只有一个,很可能我们会专门抽出一个专用的UI库,而实际开发的工程将引用这个库。UI库虽然相对于业务工程来讲,相对稳定,修改变更很少,但是不可避免的会有修改,每次修改我们如果都要重新发布的话,相当麻烦,而且一部分私有库需要认证才能安装,如果我们暂时不知道这些信息,又要引入这个库来顺利开发,应该怎么办呢?

通过 link 命令可以将我们要使用的外部依赖链接到全局的 node_modules,例如我们在 my-ui 工程中执行如下命令 yarn linknpm link,之后,我们就可以直接在 my-app 工程中执行 yarn link my-ui 来使用之前链接的 my-ui 本地版本。这种用法,编译是没有问题的,但是实际运行项目后会出现如下错误。

hooks can only be called inside the body of a function component

error TS2717: Subsequent property declarations must have the same type.

这个问题究其原因是因为 my-uimy-app 维持了2份 React 或其他依赖的副本,由此导致了各种奇怪问题,详情参考 Hooks don't work with yarn link。看回答官方貌似也不会解决这个问题,而只是考虑优化下错误提示。

那这个问题貌似无解,幸好下面有个哥们提到一个叫 Yalc 的解决方法。下面详细介绍下这个叫 Yalc 的东东。

Yalc

是一个比 npm | yarn link 更加先进的解决方法,能够避免相关依赖的问题。

yalc 在本地环境中创建了一个共享的本地开发包的本地存储库。 当在指定包目录中运行 yalc publish时,会将本来发布到 NPM 上的相关文件放到本地一个共享的全局存储中。 当在需要引用的项目中运行 yalc add my-package 时,它会将包内容拉入根目录的的 .yalc 文件夹中,并将一个文件 "file:.yalc/my-package" 注入 package.json。如果使用 yalc link my-package 的话,就类似 npm | yarn link 一样创建项目链接,不会修改 package.json。 yalc 会在项目中创建一个特殊的 yalc.lock 文件(类似于yarn.lock和package-lock.json),用于确保执行 yalc 例程时的一致性。 首先执行命令 yarn global add yalc 全局安装 yalc

我们在 my-ui 中执行 yalc publish,将其发布到本地存储库中。

然后在 my-app 工程中执行 yalc add my-ui,这里的安装方式和 npm | yarn 一样,可以指定安装版本等信息,如此我们的本地存储库可以分版本管理。

最后执行 yarn install 来更新依赖关系。我们再重新编译执行 my-app 后就不会再抛出如下异常。

hooks can only be called inside the body of a function component

如果 my-ui 发生了更新以后,我们可以直接在 my-ui 工程中执行 yalc push,它会自动的更新所有添加了 my-ui 依赖的工程,比如 my-app ,整个过程真是优雅呀。