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

Nx Monorepo中Expo应用Metro无法解析URL问题求助

Metro解析错误排查:Nx Expo工作区中AxiosProvider导致的无法解析URL问题

问题概述

使用npx create-nx-workspace@latest创建默认配置的工作区,移除Nx模板并替换为带表单的<Home/>组件后,用自定义AxiosProvider包裹应用时,Metro抛出来自@nx/expo/plugins/metro-resolver.js的“无法解析URL”错误,无法正常显示组件及通过useContext(AxiosContext)调用上下文。

错误信息

Metro has encountered an error: cannot resolve url: [...]/node_modules/@nx/expo/plugins/metro-resolver.js (30:15)
    return resolvePath;
  }
  throw new Error(`Cannot resolve ${chalk.bold(realModuleName)}`);
  };
}

相关代码

App.tsx

/* eslint-disable jsx-a11y/accessible-emoji */
import React from 'react';

import {
  SafeAreaProvider,
} from 'react-native-safe-area-context';
import { Home } from '../modules/Home';
import { AxiosProvider } from '../contexts/AxiosContext';

export const App = () => {
  return (
    <SafeAreaProvider>
      <AxiosProvider>
        <Home />
      </AxiosProvider>
    </SafeAreaProvider>
  );
};

export default App;

AxiosContext.tsx

import React, { createContext } from 'react';
import axios, {AxiosInstance} from 'axios';

interface AxiosContextInterface {
  authAxios: AxiosInstance;
  publicAxios: AxiosInstance;
}

const axiosContextDefaults: AxiosContextInterface = {
  authAxios: axios.create({
    baseURL: 'http://localhost:8081',
  }),
  publicAxios: axios.create({
    baseURL: 'http://localhost:8081',
  }),
};

const AxiosContext = createContext<AxiosContextInterface>(axiosContextDefaults);
const {Provider} = AxiosContext;
const AxiosProvider = ({children}:{children: JSX.Element | JSX.Element[]}) => {
  const authAxios = axiosContextDefaults.authAxios;
  const publicAxios = axiosContextDefaults.publicAxios

  return (
    <Provider value={{authAxios, publicAxios}}>
      {children}
    </Provider>
  );
};

export {AxiosProvider}

解决方案

1. 版本兼容性检查

确保@nx/expo与expo版本匹配,Nx对Expo版本有严格兼容要求。执行命令更新到兼容版本:

npm install @nx/expo@latest --save-dev

或使用yarn/pnpm对应命令:

yarn add @nx/expo@latest --dev
pnpm add @nx/expo@latest --save-dev

2. 修复Metro配置

在项目根目录的metro.config.js(或metro.config.ts)中调整Nx Metro配置,确保解析逻辑正确:

const { getDefaultConfig } = require('@expo/metro-config');
const { withNxMetro } = require('@nx/expo');

const config = getDefaultConfig(__dirname);

module.exports = withNxMetro(config, {
  projectRoot: __dirname,
  resolver: {
    ...config.resolver,
    sourceExts: [...config.resolver.sourceExts, 'ts', 'tsx'],
  },
});

3. 清理缓存与重新安装依赖

彻底清除Metro缓存及依赖文件,避免缓存导致的解析问题:

# 清除Metro缓存
npx expo start --clear

# 删除依赖文件并重新安装
rm -rf node_modules package-lock.json
npm install

4. 验证导入路径正确性

检查App.tsx中AxiosProvider的导入路径是否正确,确保文件目录结构与路径一致(Metro对文件名大小写敏感)。

5. 确认Axios安装

验证axios是否已正确安装到项目中:

npm list axios

若未安装,执行以下命令安装:

npm install axios

内容的提问来源于stack exchange,提问作者brpinto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:16:13