【问题标题】:Resolving compiled default exports with ES6 syntax使用 ES6 语法解析编译的默认导出
【发布时间】:2021-02-24 12:22:26
【问题描述】:

我有一个模块,说如下:

const awesomeFn = () => ...

export default awesomeFn;

它是使用 babel 内置到 ES5 中的,当我创建另一个 ES6 模块时,我想要以下语法:

npm i awesomeFn

// ./index.js
import awesomeFn from 'awesomeFn';

awesomeFn();

但这会抛出。记录awesomeFn 给了我{ default: _default [Function()] }(或类似的东西),暗示我需要做类似的事情

import awesomeFnPackage from 'awesomeFn';
const { default: awesomeFn } = awesomeFnPackage;

我怎样才能形成我的出口,这样我就不必进行默认的解构?出于这个原因,我应该完全避免默认导出吗?


有点奇怪,如果:

  • 我使用esm,就像node -r esm index.js,但如果我使用mjs作为文件扩展名(设置"type": "module"),只有js
  • 它不适用于--experimental-modules--experimental-specifier-resolution=node"type": "module" 中的package.json
  • 在每个非工作情况下,导入值为{ default: [Function: awesomeFn] },只有esm 是值[Function: awesomeFn]

所以我想这就是现在的解决方案;依赖外部包来实现预期的行为,或者使用命名的导出,它们可以按预期工作。这是怎么回事?

【问题讨论】:

    标签: javascript import export default


    【解决方案1】:

    提供了here的解决方案,即解构问题中所说的default属性,或者添加yet another dependency以直观地使用es6导入。

    为了简洁起见,我将省略 Babel 做出此选择的原因,以供读者研究。我的结论是使用 ES5 还是不使用默认导出。在撰写本文时,ES6 语法在导入/导出的上下文中是一团糟,不仅在这个问题的上下文中,而且在 npm 打包、文件扩展名、标志、package.json 属性等的上下文中。

    【讨论】:

      【解决方案2】:

      嘿,您的设置似乎有问题。默认函数在导出时被命名为“default”(ES5)。 您可能可以像这样直接在 import 语句中解构:

      import { default as awesomeFn } from 'awesomeFn';
      
      awesomeFn()
        
      

      【讨论】:

      • 这不起作用,默认导入不是“解构”
      • 另外,您能否详细说明“您的设置似乎有问题”的意思?我同意这似乎有些不对劲,我很好奇那是什么
      • 啊,对不起。 Bable 应该创建这个输出:const awesomeFn = () => { console.log("hi"); }; var _default = awesomeFn; exports.default = _default; 在 es6 项目中,导入 import awesomeFn from './awesomeFn'; 之类的代码应该没问题。你可以检查你编译的代码,看看它是否相似。
      • 嘿Ole,它确实输出了类似的东西。我不明白!
      猜你喜欢
      • 2017-06-09
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 2018-10-19
      相关资源
      最近更新 更多