Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法导入模块的属性_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 无法导入模块的属性

Javascript 无法导入模块的属性,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个模块a,类似于 const defaults = { something: {...}, somethingElse : {...} } export { defaults as default }; const defaults = { something: {...}, somethingElse : {...} } export { defaults as default }; 然后我就好像 import * as mod, { something

我有一个模块a,类似于

const defaults = {
   something: {...},
   somethingElse : {...}
}

export { defaults as default };
const defaults = {
   something: {...},
   somethingElse : {...}
}

export { defaults as default };
然后我就好像

import * as mod, { something } from 'moduleA';
import * as mod, { something } from 'moduleA';
mod
正确地说是一个具有两个已声明属性的对象,但是
{something}
未定义


你知道原因是什么吗

某些内容
不会从模块A导出,只会导出对象
默认值

因此,要获得
某些东西
,您需要从导入的东西中获取它

import * as mod from 'moduleA';

const something = mod.something;
如果您希望能够从'moduleA'导入
类似的东西:
导入{something},您需要明确地导出它。例如:

export const something = {};
const somethingElse = {};

export default const defaults = {
  something,
  somethingElse
};

某些内容
不会从模块A导出,只有对象
默认值

因此,要获得
某些东西
,您需要从导入的东西中获取它

import * as mod from 'moduleA';

const something = mod.something;
如果您希望能够从'moduleA'
导入
类似的东西:
导入{something},您需要明确地导出它。例如:

export const something = {};
const somethingElse = {};

export default const defaults = {
  something,
  somethingElse
};
未定义某些内容的原因是:当您:
export{defaults as default}您正在导出名为default的成员。当您
导出{apple,banana}
时,您将导出一个成员
apple
和一个成员
banana

如果导入内容而未指定要导入的成员,则导入名为default的成员。当您指定要导入的成员时,当然也会导入这些成员

这就是为什么尽管您的代码没有达到您的目的,但以下内容将:

const mod = { something: 'test'};
export { mod as default }; // same as export default mod;

未定义某些内容的原因是:当您:
export{defaults as default}您正在导出名为default的成员。当您
导出{apple,banana}
时,您将导出一个成员
apple
和一个成员
banana

如果导入内容而未指定要导入的成员,则导入名为default的成员。当您指定要导入的成员时,当然也会导入这些成员

这就是为什么尽管您的代码没有达到您的目的,但以下内容将:

const mod = { something: 'test'};
export { mod as default }; // same as export default mod;


如果希望能够访问导入中的命名导出,则必须直接导出它们:

const defaults = {
   something: {...},
   somethingElse : {...}
}

export {
    defaults as default,
    defaults.something as something,
    defaults.somethingElse as somethingElse
};
或者,您可以使用解构来导出
something
somethingElse

export const { something, somethingElse} = defaults;
然后像导入一样导入它:

import * as mod, { something } from 'moduleA';
但是:mod现在将包含道具:
默认值、某物、某物等

如果您不想使用
默认值
(这等于您的
默认值
):

您可以在Axel Rauschmayr的博文中了解有关ES6导入和导出语法的更多信息:


如果希望能够在导入中访问命名导出,则必须直接导出它们:

const defaults = {
   something: {...},
   somethingElse : {...}
}

export {
    defaults as default,
    defaults.something as something,
    defaults.somethingElse as somethingElse
};
或者,您可以使用解构来导出
something
somethingElse

export const { something, somethingElse} = defaults;
然后像导入一样导入它:

import * as mod, { something } from 'moduleA';
但是:mod现在将包含道具:
默认值、某物、某物等

如果您不想使用
默认值
(这等于您的
默认值
):

您可以在Axel Rauschmayr的博文中了解有关ES6导入和导出语法的更多信息:

[与问题中的模块一样]我正在导入

import * as mod, { something } from 'moduleA';
import * as mod, { something } from 'moduleA';
但是
有些东西是未定义的

但是,您的模块中没有名为
something
的导出。只有包含对象的默认导出。你需要这样做

import mod from 'moduleA';
const { something } = mod;
我有一个模块a,类似于

const defaults = {
   something: {...},
   somethingElse : {...}
}

export { defaults as default };
const defaults = {
   something: {...},
   somethingElse : {...}
}

export { defaults as default };
但你真的不应该这么做。在ES6模块中,导出类似命名空间的“单例”对象是一种反模式。应改用命名导出:

export const something = {...};
export const somethingElse = {...};
这样,您最初导入模块的尝试就会成功

[与问题中的模块一样]我正在导入

import * as mod, { something } from 'moduleA';
import * as mod, { something } from 'moduleA';
但是
有些东西是未定义的

但是,您的模块中没有名为
something
的导出。只有包含对象的默认导出。你需要这样做

import mod from 'moduleA';
const { something } = mod;
我有一个模块a,类似于

const defaults = {
   something: {...},
   somethingElse : {...}
}

export { defaults as default };
const defaults = {
   something: {...},
   somethingElse : {...}
}

export { defaults as default };
但你真的不应该这么做。在ES6模块中,导出类似命名空间的“单例”对象是一种反模式。应改用命名导出:

export const something = {...};
export const somethingElse = {...};

这样,您最初导入模块的尝试就会成功。

如果某个模块是导出对象的一部分,则不必显式导出即可导入该模块,您可以使用解构。如果某个模块是导出对象的一部分,则不必显式导出即可导入该模块,你可以使用解构主义。@nils为什么你会说这是无效的?我觉得不错。@torazaburo你是对的,我错了,我把它和这个提案中概述的新语法混淆了:@nils为什么你会说那是无效的?我觉得不错。@torazaburo你是对的,我错了,我把它和这个提案中概述的新语法混淆了:
export const{something,somethingElse}=defaults似乎不是valid@AvraamMavridis:为什么?看起来很好。@Bergi这有效吗?我不确定,也没有时间设置测试用例。@nils:起初我有点惊讶,因为我以前没有见过这种模式,但从我对规范的理解来看,它是完全合法的。
export const{something,somethingElse}=defaults似乎不是valid@AvraamMavridis:为什么?看起来很好。@Bergi这有效吗?我不确定,也没有时间设置测试用例。@nils:一开始我有点惊讶,因为我以前没有见过这种模式,但从我对规范的理解来看,它是完全合法的。