【问题标题】:Getting "Error: Plugin/Preset files are not allowed to export objects, only functions." from babel-preset-react-app/index.js得到“错误:插件/预设文件不允许导出对象,只有功能。”来自 babel-preset-react-app/index.js
【发布时间】:2018-09-27 03:42:35
【问题描述】:

所以我有一个使用 create-react-app 引导的项目,当尝试使用 react-scripts build 构建时,我收到以下错误输出:

Module build failed: Error: Plugin/Preset files are not allowed to export objects, only functions.

根据输出,错误来自node_modules/babel-preset-react-app/index.js,如下所示:

'use strict';

const create = require('./create');
var env = process.env.BABEL_ENV || process.env.NODE_ENV;

module.exports = create(env);

我正在使用 Babel 7 及以下是来自package.json 的相关依赖包列表:

"dependencies": {
    ...
    "react": "^16.5.2",
    "react-dom": "^16.4.0",
    "react-loadable": "^5.4.0",
    "react-router-dom": "^4.3.1",
    "react-scripts": "1.1.5"
},
"devDependencies": {
    "@babel/cli": "^7.1.0",
    "@babel/core": "^7.1.0",
    "@babel/preset-env": "^7.1.0",
    "@babel/preset-flow": "^7.0.0",
    "@babel/preset-react": "^7.0.0",
    "babel-core": "^7.0.0-bridge.0",
    "babel-eslint": "^9.0.0"
    ...
}

我的babel.config.js 如下:

module.exports({
 presets: ['@babel/preset-env', '@babel/preset-react', '@babel/preset-flow']
})

我已尽我所能通过互联网进行挖掘以尝试解决此问题。最终找到了许多与此类似的帖子,但是没有一个建议的解决方案对我有用。我在babel.config.js 中看到了一两个提到的包括@babel/preset-env@babel/preset-react 预设,我已经拥有了。希望社区有一些见解可以分享。

【问题讨论】:

  • 如果这是在干净的create-react-app 安装上,那么这是在github.com/facebook/create-react-app/issues 上提出的问题。这也可能是第一个要问的地方,而不是 SO,因为创建 create-react-app 的人会在那里寻找问题/错误报告。
  • @Mike'Pomax'Kamermans 谢谢你的建议。我就是这样做的,并且能够解决我的问题。将在 SO 上发布答案,其中包含我在 GitHub 上与他们一起开始的问题线程的链接。在我与两位贡献者的谈话中,我发现了一些很好的信息。
  • 旁注 - 您的 reactreact-dom 版本应该始终匹配。

标签: javascript reactjs babeljs create-react-app


【解决方案1】:

我在 GitHub 上发布了一个围绕这个问题的问题线程,并通过与两个 Create React App 贡献者合作解决了这个问题。关于 Babel 在使用 Create React App 时的工作方式,一些非常微妙的地方引起了人们的注意。我绝对建议为那些遇到与我在这里遇到的同样问题的人阅读对话。

https://github.com/facebook/create-react-app/issues/5135

对于那些使用 Create React App 的人,我要强调一件事:删除所有 babel 相关的 devDependencies 并重新安装你的 node_modules。创建 React 应用程序关心或查找模块中的 .babelrcbabel.config.js 文件。它们是无用的(至少目前是这样,因为只有时间会证明这种行为是否会发生变化)。如果这不起作用,请另外删除您的 package-lock.json 文件以及您的 node_modules 并重试。

我保存在我的包中的唯一babeldevDepdendency(很可能不会导致我的问题)是babel-eslint,因为我在我的项目中使用了 ESLint。

【讨论】:

  • 我遇到了类似的问题;但我不能删除 babel,因为我必须执行用 jest 和酵素编写的测试。你有这样的场景吗?
  • @PritamSadhukhan 如果您的应用程序是使用 Create React App 引导的,那么您不需要显式将 Babel 声明为依赖项或 devDependency。它内置在 CRA 中。您应该能够删除手动安装的 Babel 依赖项,而不会出现通过 react-scripts test --env=jsdom 运行测试的问题。但是,如果您退出了,那么您将手动管理所有依赖项,并且需要显式声明 Babel。你处于哪种情况?
【解决方案2】:

从 Babel7 开始,他们希望配置从函数返回。它更适合缓存。

现在要解决您的问题,试试这个

function loadConfig() {
  return {
    presets: ['@babel/preset-env', '@babel/preset-react', '@babel/preset-flow']
  }
}
module.exports = loadConfig;

【讨论】:

  • 原来当使用create-react-app 时,所有.babelrcbabel.config.js 文件都会被忽略。不幸的是,除非你决定从 Create React App 中退出,否则这不会起作用。不过,这将是一个不同的故事。
  • 那你应该在哪里调用这个函数呢?
猜你喜欢
  • 2020-02-28
  • 2019-06-12
  • 1970-01-01
  • 2019-06-09
  • 2018-12-19
  • 1970-01-01
  • 2019-02-08
  • 2018-05-29
  • 1970-01-01
相关资源
最近更新 更多