2017-06-01 106 views
1

好的,我无法完全找到答案。我正在使用webpack和babel es2015预设来处理ES2015模块。如何使用Javascript ES6 ES2015模块将常量直接导出/导入到导入模块名称空间?

模块1至出口,文件名“foobar.js”

export const FOO = 'foo' 
export const BAR = 'bar' 

有没有办法导入此恒进我的全局命名空间在我的导入模块?

我想这样做,我的模块中,将使用常量:

import 'foobar' 

const doSomething =() => { console.log(FOO + BAR) } 

我知道这会工作:

import * as CONSTANTS from 'foobar' 

const doSomething =() => { console.log(CONSTANTS.FOO + CONSTANTS.BAR) } 

...那还有其他的方式来实现导入的结果与特定名称空间相同。但我想使用不带前缀的常量。

有没有办法直接导入所有从不同模块导出到导入模块的根名称空间?

*注:我知道我能做到这一点:

import {FOO, BAR} from 'foobar' 

但我必须明确地引用每个常量的进口,从而导致更多的麻烦,而不是减少。

+0

你几乎涵盖了所有的可能性。 JavaScript不仅会让你不费吹灰之力地将变量抽出,所以它们必须以某种方式,形状或形式来定义。 – samanime

回答

1

除了这两个选项,你已经提到:

import * as CONSTANTS from 'foobar'; 
import { FOO, BAR } from 'foobar'; 

你也可以做一个默认的出口,让他们所有,但它的功能也可以通过选项之一:

// foobar.js 
const FOO = 'foo'; 
const BAR = 'bar'; 

export default { FOO, BAR }; 

// myfile.js 
import CONSTANTS from 'foobar'; 

的其他方法是将它们动态地填充为globalwindow(对于Node.js,global,对于浏览器代码,window)。

但是,我强烈建议不要使用此方法,因为您将无法使用IDE中的任何帮助,这会导致很多错误。现在编写额外的代码是完全值得的,以后不会有难以察觉的错误。

import CONSTANTS from 'foobar'; 

Object.keys(CONSTANTS).forEach(key => window[key] = CONSTANTS[key]); 

console.log(FOO, BAR); 

例子:

const CONSTANTS = { FOO: 'foo', BAR: 'bar' }; 
 

 
Object.keys(CONSTANTS).forEach(key => window[key] = CONSTANTS[key]); 
 

 
console.log(FOO, BAR);

通过把他们的根级别的元素,你可以逃脱,而无需直接实现它们。

但是,请不要使用此方法。

+0

基于缺乏野外实例,这就是我所想的。我想我正在寻找像标准服务器端语言中的“包含”之类的东西,但是要使用ES2015模块。复制密钥是一个有趣的想法,但随后我必须在导入常量时随处运行。我可以理解为什么这个用例不被支持,因为如果你试图用常量以外的东西来做这件事,然后错误地从另一个模块覆盖了一个成员,那么它可能很容易搞砸了。只是为了我的常数,尽管如此,这将是件好事。 – xweb