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

React Native中Property 'require'不存在错误求助

React Native 「Property 'require' doesn't exist」错误排查与解决

我在开发React Native时遇到了「Property 'require' doesn't exist」错误,推测该错误来自Metro Bundler,错误截图如下:
错误截图

我已经尝试了React Native官方GitHub issue中的所有解决方案,包括:

  • 删除node_modules
  • 重启缓存

但终端没有显示任何错误,仅在设备端抛出该错误,恳请提供解决帮助。

项目配置文件

babel.config.js

module.exports = {
  presets: ['module:metro-react-native-babel-preset', '@babel/preset-typescript','@babel/preset-env'],
  plugins: [
    ['@babel/plugin-proposal-class-properties'],
    ['module:react-native-dotenv',
      {
        moduleName: '@env',
        path: '.env',
      },
    ],
    'react-native-reanimated/plugin',
    [
      'module-resolver',
      {
        root: ['./src/'],
        alias: {
          '@assets': './src/assets',
          '@components': './src/components',
          '@constants': './src/constants',
          '@navigation': './src/navigations',
          '@screens': './src/screens',
          '@utils': './src/utils',
          '@styles': './src/styles',
          '@redux': './src/redux',
          '@config': './src/config',
        },
      },
    ],
  ],
};

metro.config.js

module.exports = {
  transformer: {
    getTransformOptions: async () => ({
      transform: {
        experimentalImportSupport: false,
        inlineRequires: true,
      },
    }),
  }, 
};

jestConfig.ts

import mockAsyncStorage from '@react-native-async-storage/async-storage/jest/async-storage-mock';
import 'react-native-gesture-handler/jestSetup';

jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter');

jest.mock('react-native-keyboard-controller', () => ({}));
jest.mock('react-native-bootsplash', () => {
  return {
    hide: jest.fn(),
    show: jest.fn(),
  };
});

jest.mock('@notifee/react-native', () => ({}));

jest.mock('@react-native-async-storage/async-storage', () => mockAsyncStorage);

jest.mock('axios', () => {
  return {
    create: () => {
      return {
        get: jest.fn(),
        post: jest.fn(),
        put: jest.fn(),
        interceptors: {
          request: {eject: jest.fn(), use: jest.fn()},
          response: {eject: jest.fn(), use: jest.fn()},
        },
      };
    },
  };
});

export {};

package.json

{
  "name": "name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "start": "react-native start",
    "test": "jest",
    "lint": "eslint . --ext .js,.jsx,.ts,.tsx"
  },
  "dependencies": {
    "@notifee/react-native": "^7.2.0",
    "@react-native-async-storage/async-storage": "^1.17.10",
    "@react-native-masked-view/masked-view": "^0.2.8",
    "@react-navigation/bottom-tabs": "^6.4.0",
    "@react-navigation/native": "^6.0.13",
    "@react-navigation/native-stack": "^6.9.1",
    "@reduxjs/toolkit": "^1.8.6",
    "@shopify/flash-list": "^1.3.1",
    "@types/lodash": "^4.14.191",
    "axios": "^1.2.1",
    "babel-plugin-module-resolver": "^4.1.0",
    "native-base": "^3.4.22",
    "react": "18.1.0",
    "react-native": "0.70.6",
    "react-native-bootsplash": "^4.3.2",
    "react-native-dotenv": "^3.4.2",
    "react-native-fast-image": "^8.6.3",
    "react-native-gesture-handler": "^2.7.1",
    "react-native-keyboard-controller": "^1.4.2",
    "react-native-modal": "^13.0.1",
    "react-native-pager-view": "^6.1.2",
    "react-native-pusher-push-notifications": "^2.5.1",
    "react-native-reanimated": "^2.11.0",
    "react-native-responsive-screen": "^1.4.2",
    "react-native-safe-area-context": "3.3.2",
    "react-native-screens": "^3.18.2",
    "react-native-svg": "12.1.1",
    "react-native-tab-view": "^3.3.4",
    "react-native-vector-icons": "^9.2.0",
    "react-native-webview": "^11.26.0",
    "react-redux": "^8.0.4",
    "redux": "^4.2.0",
    "redux-logger": "^3.0.6",
    "redux-persist": "^6.0.0",
    "redux-thunk": "^2.4.2",
    "ts-jest": "^29.0.3"
  },
  "devDependencies": {
    "@babel/core": "^7.12.9",
    "@babel/preset-env": "^7.20.2",
    "@babel/preset-react": "^7.18.6",
    "@babel/preset-typescript": "^7.18.6",
    "@babel/runtime": "^7.12.5",
    "@react-native-community/eslint-config": "^2.0.0",
    "@tsconfig/react-native": "^2.0.2",
    "@types/jest": "29.0.3",
    "@types/react": "^18.0.21",
    "@types/react-native": "^0.70.6",
    "@types/react-native-dotenv": "^0.2.0",
    "@types/react-native-vector-icons": "^6.4.12",
    "@types/react-test-renderer": "^18.0.0",
    "@types/redux-logger": "^3.0.9",
    "@types/redux-persist": "^4.3.1",
    "@typescript-eslint/eslint-plugin": "^5.37.0",
    "@typescript-eslint/parser": "^5.37.0",
    "babel-jest": "29.0.3",
    "babel-plugin-transform-require-context": "^0.1.1",
    "eslint": "^7.32.0",
    "jest": "29.0.3",
    "metro-react-native-babel-preset": "0.72.3",
    "react-native-typescript-transformer": "^1.2.13",
    "react-test-renderer": "18.1.0",
    "typescript": "^4.8.3"
  },
  "jest": {
    "preset": "react-native",
    "moduleFileExtensions": [
      "ts",
      "tsx",
      "js",
      "jsx",
      "json",
      "node"
    ],
    "setupFiles": [
      "./jestConfig.ts"
    ],
    "transformIgnorePatterns": [
      "node_modules/node_modules/react-native-responsive-screen/index.js"
    ]
  }
}

排查与解决建议

1. 修复TypeScript类型配置

这个错误基本是TypeScript无法识别全局require变量导致的。在tsconfig.json中确保包含React Native和Node的类型声明:

{
  "extends": "@tsconfig/react-native/tsconfig.json",
  "compilerOptions": {
    "types": ["react-native", "node"]
  }
}

如果项目没有tsconfig.json,直接创建并添加上述内容。

2. 调整Babel预设顺序

你的babel.config.js中预设顺序可能冲突,@babel/preset-env可能覆盖React Native的内置配置。尝试把module:metro-react-native-babel-preset放在最后:

presets: ['@babel/preset-typescript', '@babel/preset-env', 'module:metro-react-native-babel-preset'],

3. 关闭Metro的inlineRequires

inlineRequires可能导致require解析异常,修改metro.config.js:

module.exports = {
  transformer: {
    getTransformOptions: async () => ({
      transform: {
        experimentalImportSupport: false,
        inlineRequires: false, // 改为false
      },
    }),
  }, 
};

4. 彻底清理缓存并重建

执行以下命令完全清理缓存后重新构建:

# 重置Metro缓存
npx react-native start --reset-cache

# iOS环境额外操作
cd ios && pod deintegrate && pod install && cd ..

# Android环境额外操作
cd android && ./gradlew clean && cd ..

# 重装依赖
rm -rf node_modules package-lock.json yarn.lock
npm install

5. 检查代码中的require用法

排查代码里是否有错误的require调用,比如在TypeScript文件中使用require导入模块时的类型不兼容问题,可尝试将部分require替换为ES6 import语法测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:25:51