为什么不能在默认对象中导出函数

Why cannot export function inside default object

我想知道为什么这对使用 create-react-app:

创建的应用程序无效
/***** myLib.js *****/
const multiplyByTwo = val => val * 2;

export default { multiplyByTwo };

也不是:

/***** myLib.js *****/
let multiplyByTwo = val => val * 2;

export default { multiplyByTwo };

两者都不是:

/***** myLib.js *****/
function multiplyByTwo(val) { return val * 2; };

export default { multiplyByTwo };

然后,在另一个文件中:

/***** main.js *****/
import { multiplyByTwo } from './myLib'

console.log(multiplyByTwo(10));

当我尝试编译它时,出现此错误:

Failed to compile.

./src/main.js
Attempted import error: 'multiplyByTwo' is not exported from './myLib'

但是,这是有效的:

/***** myLib.js *****/
export const multiplyByTwo = val => val * 2;

还有这个:

/***** myLib.js *****/
export let multiplyByTwo = val => val * 2;

区别在于命名导出默认导出

当您使用 export default <expression> 时,当您使用 import exprName from ... 时,该表达式可用于导入其他地方。该模块正在导出 expression 作为默认导出,而 import exprName 采用该模块的默认导出并将其放入 exprName。但是语法 import { exprName }entirely different;该语法表明您要从模块中提取名称 exprNamenamed export。它不是解构,尽管它看起来很像。

您的 myLib.js 没有 multiplyByTwo 的命名导出(它只有一个对象的 默认导出,它有一个 属性 命名为 multiplyByTwo), 所以

import { multiplyByTwo } from './myLib'

失败。

使用命名导出而不是 myLib:

最有意义
export const multiplyByTwo = val => val * 2;

然后可以使用您在其他地方使用的 import { multiplyByTwo } 语法导入它。

另一个选项,使用与原始 myLib 中相同的代码,将导入默认导出的对象,然后在 导入后解构它:

import myLib from './myLib';
const { multiplyByTwo } = myLib;

但这看起来有点奇怪。

您在谈论默认导出和命名导出之间的区别:

假设你有一个App.js,如果你做了类似

的事情
export default () => {
  // do something
}

这是一个默认的导出,'limited' 像这样的单个导入

import App from './App'

命名导出类似于:

export const add = (a, b) => a + b;

这是一个命名导出,您可以像这样用大括号导入它:

import { app } from './app'

更多信息here

在导出时使用 default 是当您想默认 export 某些内容时,这意味着当其他文件正在导入时,他们不需要指定要导入的特定名称,这称为 Default Export.

示例:

import React from 'react';

在这种情况下,我们在导入时不指定特定的预期名称,这里React也可以是reactDefaultExport这个名称是用户定义的名称。

来到命名导出,当你想要导出特定的东西时,需要用确切的名称导入,然后我们使用名称导出。

示例:

import React,{Component} from 'react';

在这个 Component 中是一个命名导出,当我们使用 functional/ stateless 组件时我们不需要 Component,所以我们可以避免导入它,但 React 是默认导出。