Expo iOS构建报错:无法解析Node.js fs模块(NextJS+Solito单体仓库)
解决方案
1. 调整Metro配置,排除Node核心模块与gzip-size打包
在项目根目录的metro.config.js中修改配置,让Metro在打包React Native代码时跳过Node.js核心模块(如fs)和gzip-size模块:
const { getDefaultConfig } = require('expo/metro-config'); const config = getDefaultConfig(__dirname); config.resolver = { ...config.resolver, // 禁用Node核心模块的polyfill,避免RN尝试加载fs extraNodeModules: { ...(config.resolver.extraNodeModules || {}), fs: false, path: false, stream: false, }, // 直接排除gzip-size模块的打包 blockList: [ ...(config.resolver.blockList || []), /node_modules\/gzip-size\/.*/, ], }; module.exports = config;
2. 排查RN端代码是否误引入Next.js专属模块
检查React Native入口文件(如apps/expo/App.js)及所有RN使用的组件,确保没有直接引入Next.js的服务器/构建相关模块(如next/server、next/build等)——这类模块会间接依赖gzip-size,而RN环境完全不需要它们。Solito项目应严格区分shared跨平台代码与两端专属代码。
3. 清理所有缓存并重新安装依赖
缓存异常可能导致依赖树混乱,执行以下命令彻底清理:
- 删除依赖目录与锁文件:
rm -rf node_modules rm package-lock.json # 若用npm,yarn用户删yarn.lock - 清除Expo与Metro缓存:
npx expo start --clear npx react-native start --reset-cache - 重新安装依赖:
npm install # 或 yarn install
4. 用Babel插件移除RN环境下的gzip-size导入
安装babel-plugin-transform-remove-imports:
npm install babel-plugin-transform-remove-imports --save-dev
修改babel.config.js,针对React Native环境自动移除所有gzip-size相关导入:
module.exports = function(api) { api.cache(true); const isRN = api.env('react-native'); const plugins = []; if (isRN) { plugins.push([ 'transform-remove-imports', { test: /gzip-size/ }, ]); } return { presets: ['babel-preset-expo'], plugins, }; };
5. 验证Solito配置正确性
检查项目根目录的solito.config.js,确保Web与Native端的路径配置正确,避免RN打包时误包含Web端依赖:
module.exports = { web: './apps/next', native: './apps/expo', shared: './packages/shared', };
内容的提问来源于stack exchange,提问作者mfang
相关产品推荐
相关产品推荐

