节点模块问题:每个模块只允许一个默认导出

Posted

技术标签:

【中文标题】节点模块问题:每个模块只允许一个默认导出【英文标题】:Node modules issue: Only one default export allowed per module 【发布时间】:2017-01-02 19:16:15 【问题描述】:

这是我们在为 node_modules 加载新版本集的服务器上执行 npm install 时遇到的问题。

我们有一个看起来像这样的模块

export default class DemoComponent extend React.Component 
  render() 
    return(
      <h1>Hello</h1>
    );
  


export default connect(
  mapStateToProps,
   ... 
)(DemoComponent);

在我们使用 npm install 加载新版本的开发依赖项之前,它曾经可以正常工作。

错误日志:

每个模块只允许一个默认导出。 在 File.buildCodeFrameError (/home/workspace/node_modules/babel-core/lib/transformation/file/index.js:431:15) 在 NodePath.buildCodeFrameError (/home/workspace/node_modules/babel-traverse/lib/path/index.js:140:26) 在 PluginPass.exit (/home/workspace/node_modules/babel-plugin-transform-es2015-modules-commonjs/lib/index.js:253:29) 在 newFn (/home/workspace/node_modules/babel-traverse/lib/visitors.js:276:21) 在 NodePath._call (/home/workspace/node_modules/babel-traverse/lib/path/context.js:76:18) 在 NodePath.call (/home/workspace/node_modules/babel-traverse/lib/path/context.js:48:17) 在 NodePath.visit (/home/workspace/node_modules/babel-traverse/lib/path/context.js:117:8) 在 TraversalContext.visitQueue (/home/workspace/node_modules/babel-traverse/lib/context.js:150:16) 在 TraversalContext.visitSingle (/home/workspace/node_modules/babel-traverse/lib/context.js:108:19) 在 TraversalContext.visit (/home/workspace/node_modules/babel-traverse/lib/context.js:192:19) 在 Function.traverse.node (/home/workspace/node_modules/babel-traverse/lib/index.js:161:17)

【问题讨论】:

你不能有两个export default,这没有意义。其中一个必须是默认的,可能是最新的,因为它是连接到商店的那个。 【参考方案1】:

您不能在一个文件中使用多个export default。这没有意义。如果您需要导出多个内容,则需要使用 named export

DemoComponent.js

export class DemoComponent extends React.Component 
  render() 
    return(
      <h1>Hello</h1>
    );
  


export default connect(
  mapStateToProps,
   ... 
)(DemoComponent);

所以导入语句应该是这样的:

import ConnectedComponent, DemoComponent from './DemoComponent';

当您使用 export default 时,您可以根据需要命名变量,但使用 命名导出 您必须使用与您导出的变量名称相同的变量名。

More about export syntax

顺便说一句,您的示例中有错字。是extends,不是extend

【讨论】:

谢谢,德米特里·内夫佐罗夫。我在这里读到了2ality.com/2015/12/babel-commonjs.html 我不明白,为什么重新安装npm_monules后会出现错误?你真的要export default connect吗?为什么不DemoComponent 因为connect 是一个react-redux HOC component,它将您的DemoComponent 连接到redux 状态。您希望将其导出为连接组件,否则您的 DemoComponent 将无法访问该状态

以上是关于节点模块问题:每个模块只允许一个默认导出的主要内容,如果未能解决你的问题,请参考以下文章

ES6模块化

无法从非 EcmaScript 模块导入命名的导出 XXXX(只有默认导出可用)

笑话:当同一个模块也有命名导出时,如何模拟默认导出组件?

带默认参数的模块导出

为默认导出模块编写声明文件

玩笑:使用默认和命名导出模拟 ES6 模块