【问题标题】:Re-exporting modules does not work with object spread重新导出模块不适用于对象传播
【发布时间】:2018-01-08 20:48:51
【问题描述】:

我有一个index.js 文件,内容如下:

import aReducer from './ducks/a';
import bReducer from './ducks/b';
import * as aSelectors from './ducks/a';
import * as bSelectors from './ducks/b';

console.log(aReducer) //function i expect
console.log(aSelectors) //object with keys to selectors i expect

export { aReducer, bReducer, ...aSelectors, ...bSelectors };

如果我在这个文件中 console.log 我看到 reducer 是我期望的函数,并且选择器别名是具有我期望的选择器的键的对象。 reducer 是鸭子文件的默认导出,选择器是从同一个文件中导出的。

但是,当我尝试使用另一个文件导入此模块时,我只能导入两个减速器。这两个选择器是未定义的。我认为解构会将每个键添加到我的导出对象中。我究竟做错了什么?

other_file1.js

import { aReducer, bReducer } from 'my-module'; //works!

other_file2.js

import { someSelectorThatWasInMyaSelectorsObject } from 'my-module'; //does NOT work!

【问题讨论】:

  • 您不能在export {}; 语句中使用...。这不是给你一个语法错误吗?
  • 不,没有错误 - 它不只是导出一个对象吗?我们可以在对象中使用...
  • 很奇怪。你用什么来处理你的模块处理?

标签: javascript import ecmascript-6 export es6-modules


【解决方案1】:

您不能在 export {}; 块中使用 ...。它是一个明确的名称列表,就像import {name} from 一样。它不是导出键的对象。例如与导入相同的方式

import { foo as fooRenamed } from "";

export

export {
  fooVar as foo,
};

export 块是要导出的变量的显式列表,具有可选的显式导出名称。不涉及任何对象。

具体来说,不涉及任何对象,因为导出的名称在文件主体执行之前就已处理并已知,因此不仅不允许对象,而且由于对象需要执行才能存在,因此它们是不可能允许的。

要得到你想要的,你应该使用:

// Export the referenced files' default under two specific names.
export { default as aReducer } from './ducks/a';
export { default as bReducer } from './ducks/b';

// Re-export every named export from these two files.
export * from './ducks/a';
export * from './ducks/b';

【讨论】:

  • 感谢您的来信。我刚试过这个,但我仍然有同样的问题。 :( 我可以看到减速器,但在将它们导入其他文件时,任何选择器都是 undefined
  • 您可能还有其他问题,不幸的是,如果没有完整的工作示例,我不确定是否可以添加更多内容。导入的意外undefined 值的一个常见原因是可能存在循环依赖关系,因此当您尝试引用导入的值时,它尚未被分配,但我不能说这是否只是一个问题给定的 sn-ps。
  • 你知道吗 - 在尝试为这个问题添加更多代码并写出我的目录结构之后,我意识到我正在测试错误的选择器,所以这当然是未定义的。你的实施工作 - 谢谢!
  • 这很不幸,因为您要么必须直接引用资源,要么必须在索引中冗余地重复函数和/或变量引用,而不是能够拥有单个入口点。例如带有展开解构的 module.exports 非常适合为动作类型常量、动作等提供一个 /index.js 入口点。
  • 我不确定我是否理解。 export * from 不重复名称,export {default as X} from 是必需的,因为它一开始就没有名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
相关资源
最近更新 更多