You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:52:39