反应本机捆绑失败。错误消息:“尝试解析模块‘idb’时......实际上这些文件都不存在”:

Joh*_*ash 50 indexeddb firebase reactjs react-native expo

有问题的错误消息:

在尝试idb从文件解析模块时,成功找到了C:\Users\OG\Desktop\programming\react_native\mealstogo\MealsToGo2\node_modules\@firebase\app\dist\esm\index.esm2017.js包。C:\Users\OG\Desktop\programming\react_native\mealstogo\MealsToGo2\node_modules\idb\package.json然而,这个包本身指定了一个main无法解析的模块字段(C:\Users\OG\Desktop\programming\react_native\mealstogo\MealsToGo2\node_modules\idb\build\index.cjs。事实上,这些文件都不存在:

错误信息照片

该错误的令人困惑的部分是文件index.esm2017实际上确实存在于该目录中。'`C:\Users\OG\Desktop\programming\react_native\mealstogo\MealsToGo2\node_modules\idb\build\index.cjs'

我已经卸载并重新安装了 firebase。我已经安装并卸载了“idb”。我已经清除了yarn缓存、expo缓存、删除了node_modules并重新安装以及清除了watchman缓存,但都无济于事。我还进行了三次检查,确保文件目录实际上不在错误消息所示的位置。

当博览会安装lottie-react-native时出现错误,但似乎无关,并且在删除lottie-react-native后问题仍然存在。我已经使用 git 将代码恢复到行为开始之前,现在问题仍然存在。

看起来整个项目现在都被毁了,我该如何继续前进。

Soh*_*ran 98

如果您使用的是 expo,要解决此问题,请在项目根目录中创建一个Metro.config.js文件。在文件中添加文件扩展名cjs. 细节

const { getDefaultConfig } = require("@expo/metro-config");

const defaultConfig = getDefaultConfig(__dirname);

defaultConfig.resolver.assetExts.push("cjs");

module.exports = defaultConfig;
Run Code Online (Sandbox Code Playgroud)

截屏

React Native cli

const { getDefaultConfig } = require("metro-config");
const { resolver: defaultResolver } = getDefaultConfig.getDefaultValues();
exports.resolver = {
  ...defaultResolver,
  sourceExts: [
    ...defaultResolver.sourceExts,
    "cjs",
  ],
};
Run Code Online (Sandbox Code Playgroud)

  • @JohnyClash 实际上,firebase 使用 `.cjs` 文件扩展名,默认情况下,expo 或 React Native 不支持该扩展名。所以我们需要手动配置`metro.config`来解析它。[请在此处阅读详细信息](https://docs.expo.dev/guides/customizing-metro/#adding-more-file-extensions-to--assetexts) (9认同)
  • @Sohel 那么问题实际上是 expo 而不是 firebase 吗? (4认同)
  • 仅供参考,我必须重新安装 `node_modules` 之后它才最终起作用 (4认同)
  • 这对我有用。非常感谢。React Native 项目,所以我只是将第二个代码段粘贴到根目录下一个名为 Metro.config.js 的新文件中 (4认同)

小智 35

我遇到了同样的错误...我认为新的 firebase 版本有一些有趣的地方。我将 firebase 版本降级到 9.6.11 以暂时解决该问题...

npm uninstall firebase
npm install firebase@9.6.11
Run Code Online (Sandbox Code Playgroud)


小智 32

我刚刚将以下代码添加到metro.config.js文件中。我使用 Firebase v9.8.1

module.exports = {
  transformer: {
    getTransformOptions: async () => ({
      transform: {
        experimentalImportSupport: false,
        inlineRequires: true,
      },
    }),
  },
  //added this
  resolver: {
    sourceExts: ['jsx', 'js', 'ts', 'tsx', 'cjs'],
  },
};
Run Code Online (Sandbox Code Playgroud)


小智 5

我在世博会上尝试了一些方法来解决这个问题,该解决方案对我有用,在根目录中创建metro.config.js文件并添加以下代码;

const { getDefaultConfig } = require("@expo/metro-config");

const defaultConfig = getDefaultConfig(__dirname);

defaultConfig.resolver.assetExts.push("cjs");

module.exports = defaultConfig;
Run Code Online (Sandbox Code Playgroud)

现在重新启动您的博览会应用程序!