使用Expo构建React Native应用时Lerna依赖管理问题求助
解决Lerna + React Native/Expo项目的依赖hoisting问题
听起来你踩了Lerna默认依赖提升机制的坑——React Native和Expo的不少脚本、工具依赖得在子包的node_modules里才能被正确识别,可Lerna把它们全提到根目录了,导致mobile包找不到运行脚本对吧?我之前用Lerna管理多包React Native项目时也遇到过一模一样的问题,给你几个靠谱的解决办法:
1. 配置Lerna的nohoist规则
在项目根目录的lerna.json里,添加nohoist数组,指定哪些依赖不需要被提升到根目录,而是保留在子包自己的node_modules中。针对React Native和Expo,你可以这么配置:
{ "packages": ["packages/*"], "version": "independent", "npmClient": "yarn", "useWorkspaces": true, "nohoist": [ "**/react-native", "**/react-native/**", "**/expo", "**/expo/**", "**/@react-native-community/**", "**/@expo/**" ] }
这样Lerna就会把这些核心依赖留在你的mobile包的node_modules里,确保运行脚本能被正常找到。
2. 同步Yarn Workspace的nohoist配置
因为你用Yarn做包管理,得在根目录的package.json里同步Yarn的nohoist规则,避免Yarn自身的hoisting覆盖Lerna的设置:
{ "private": true, "workspaces": { "packages": ["packages/*"], "nohoist": [ "**/react-native", "**/react-native/**", "**/expo", "**/expo/**", "**/@react-native-community/**", "**/@expo/**" ] } }
3. 清理并重新安装依赖
配置好之后,先清理现有依赖文件确保新配置生效:
- 删除根目录和
mobile包下的node_modules文件夹 - 删除根目录的
yarn.lock文件(如果存在) - 重新执行
yarn install
4. 用根目录Yarn运行子包脚本
如果还是碰到找不到脚本的情况,你可以通过根目录的Yarn来调用mobile包的脚本,比如:
yarn workspace mobile start
这种方式下Yarn会自动处理子包的依赖路径,不需要依赖子包node_modules里的脚本入口。
额外小贴士
像expo-cli这类工具型依赖可以安装在根目录作为开发依赖,让所有子包共用;但expo、react-native这类核心依赖必须通过nohoist配置留在子包里,不然会出现Native模块找不到的问题。
内容的提问来源于stack exchange,提问作者ngoc chau nguyen
相关产品推荐
相关产品推荐

