javascript - 为什么不能在默认对象内导出函数
问题描述
我想知道为什么这对使用创建的应用程序无效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 }
完全不同;该语法表明您要从模块中提取名称的命名导出。exprName
它不是解构,即使它看起来很像。
你myLib.js
没有命名导出multiplyByTwo
(它只有一个对象的默认导出,它有一个名为的属性multiplyByTwo
),所以
import { multiplyByTwo } from './myLib'
失败。
使用命名导出而不是 from 最有意义myLib
:
export const multiplyByTwo = val => val * 2;
然后可以import { multiplyByTwo }
使用您在其他地方使用的语法导入它。
另一种选择,在您的原始文件中使用相同的代码myLib
,将导入默认导出的对象,然后在导入后对其进行解构:
import myLib from './myLib';
const { multiplyByTwo } = myLib;
但这看起来有点奇怪。
推荐阅读
- python - 使用 Facebook Graph API 获取我的所有公开帖子
- spring-kafka - 春季卡夫卡确认错误
- javascript - 用 Jest 模拟导出的 const 箭头函数
- arrays - 谷歌电子表格查询 IF(ISBLANK(), PARSE_ERROR:
- ruby-on-rails - 麻烦模拟`Resolv::DNS.open`
- r - R中的寓言包中的ETS(我可以在没有tsibble的情况下做到吗)
- javascript - 如何使用 Firestore 安全规则解密加密的 UID?
- c# - 如何在 WPF 应用程序中为 ItemSource 数据模板使用 2 个数据绑定
- nuxt.js - Nuxt.js 静态站点和 404 页面
- azure-active-directory - 无法使用其他帐户登录或“使用其他帐户”