当有 CommonJS 而不是 ES6 模块时无法构建应用 exports/imports

Cannot build an app when there is CommonJS instead of ES6 module exports/imports

我通过 create-react-app(v3.3.0 的价值)生成了一个简单的应用程序,没有弄乱它的默认设置。

在大多数情况下,我使用 ES6 语法进行导出:

export default myStuff

// Or

export const myStuff = ()=>{}

但是,我希望我的脚本之一也能在节点的 CLI 中 运行。因此,一些 select 文件使用 commonJS 语法:

module.exports = myStuff

这一切都很好,直到我决定构建和部署应用程序,然后抱怨说如果我使用 commonJS 语法 myStuff 没有被导入,我得到的错误正是:

Creating an optimized production build... Failed to compile. Attempted import error: 'myStuff' is not exported from './myStuff'.

我应该指出,构建和开发脚本保留了 create-react-app 生成的任何内容。准确地说:

...
  "dev": "react-scripts start",
  "build": "react-scripts build",
...

请记住,当 运行 在本地浏览器和使用 Node CLI 时,一切都完美无缺。我错过了什么?我如何使用现有的 CommonJS 文件进行构建?

编辑:为了澄清@JustRaman 提出的问题,我在客户端应用程序中对这些导出的使用从位于同一文件夹中的 index.js 文件开始。可以这样想:

├── ...
├── lib
│   ├── myCommonJSStuff.js
│   ├── myOtherCommonJSStuff.js
│   ├── myEs6Stuff.js
│   └──  index.js

来自 myCommonJSStuff.js 我按如下方式导出:

function myCommonJSStuff () { /* Do Stuff*/ }
module.exports = {
  myCommonJSStuff,
  someOtherIrrelevantFunction
}

myOtherCommonJSStuff.js 开始,它将只是一个默认的等效导出:

module.exports = function myOtherCommonJSStuff() { /*Do more stuff*/ }

myEs6Stuff.js顾名思义,我使用ES6语法:

export default function myEs6Stuff () { /*More stuff*/ }

最后,index.js 我重新导出所有内容,以便我可以从我的 lib/ 文件夹中导入它:

import { myCommonJSStuff } from './myCommonJSStuff'
import myOtherCommonJSStuff from './myOtherCommonJSStuff'
import myEs6Stuff from './myEs6Stuff'

export {
  myCommonJSStuff,
  myOtherCommonJSStuff,
  myEs6Stuff
}

我发现了一个类似的问题https://github.com/facebook/create-react-app/issues/6163似乎除了弹出没有简单的解决方案。

  1. 如果不想弹出 CRA,可以使用 https://www.npmjs.com/package/react-app-rewired

  2. 另一个解决方案可以是一个模块加载器来加载 Node 中的 ESM 文件https://www.npmjs.com/package/esm这个包可以提供帮助。