如何使用ES2015语法导入从文件导出的所有内容?有通配符吗?

时间:2016-02-22 13:06:54

标签: javascript ecmascript-6 es6-module-loader

使用ES2015语法,我们有了新的导入语法,并且我一直试图弄清楚如何将从一个文件导出的所有内容导入到另一个文件中,而不必将其包装在一个对象中,即。就好像它们是在同一个文件中定义一样。

所以,基本上,这个:

// constants.js

const MYAPP_BAR = 'bar'
const MYAPP_FOO = 'foo'
// reducers.js

import * from './constants'

console.log(MYAPP_FOO)

这不起作用,至少根据我的Babel / Webpack设置,这种语法无效。

替代

这样可行(但如果你需要输入的东西超过几件,那就很长而烦人):

// reducers.js

import { MYAPP_BAR, MYAPP_FOO } from './constants'

console.log(MYAPP_FOO)

就像这样(但它将对象包装在一个对象中):

// reducers.js

import * as consts from './constants'

console.log(consts.MYAPP_FOO)

是否存在第一个变体的语法,或者您是否必须按名称导入每个东西,或者使用包装器对象?

5 个答案:

答案 0 :(得分:29)

您不能通过通配符为第一个变量导入所有变量,因为如果您在不同的文件中使用相同的名称,它会导致冲突变量。

//a.js
export const MY_VAR = 1;

//b.js
export const MY_VAR = 2;


//index.js
import * from './a.js';
import * from './b.js';

console.log(MY_VAR); // which value should be there?

因为我们无法解决MY_VAR的实际价值,所以无法进行此类导入。

对于您的情况,如果要导入大量值,最好将它们全部导出为对象:

// reducers.js

import * as constants from './constants'

console.log(constants.MYAPP_FOO)

答案 1 :(得分:20)

  

是否存在第一个变体的语法

没有

  

或者你必须按名称导入每个东西,还是使用包装器对象?

答案 2 :(得分:1)

好吧,您可以导入对象,遍历它的属性,然后像这样用eval手动生成常量

import constants from './constants.js'

for (const c in constants) {
  eval(`const ${c} = ${constants[c]}`)
}

不幸的是,此解决方案不适用于我的IDE中的intellisense,因为常量是在执行期间动态生成的。但这应该可以正常工作。

答案 3 :(得分:0)

当然有。

使用codegen.macro

codegen
      'const { ' + Object.keys(require('./path/to/file')).join(',') + '} = require("./path/to/file");

但似乎无法导入codegen生成的变量。 https://laravel.com/docs/5.6/eloquent#global-scopes

答案 4 :(得分:0)

在ES6中,使用以下代码,导入的内容无需包装对象即可使用。

只要把它放在这里给像我这样的人,就在这里结束搜索。

constants.js:

{
metricId: 120778
metricName: Average Response Time (ms)
metricPath:  /ordering/Login.aspx
frequency: ONE_MIN
startTimeInMillis: 15821000
occurrences: 3
current: 0
min: 0
max: 47
useRange: true
count:803
sum:1770
value:2
standardDeviation: 0
}

main.js:

input {
http_poller {
urls => {
url => "https://appd.com/controller/virtual%20Response%20Time%20%28ms%29&time-range-type=BEFORE_NOW&duration-in-mins=5"
}
truststore => "path/to/cacerts.jks"
truststore_password => "*****"
request_timeout => 60
user => "*****"
password => "****"
metadata_target => "http_poller_metadata"
schedule => { cron => "* * * * * UTC"}
}
}
filter
{
xml {
                source => "[metric-datas]"
                store_xml => "false"
                       }
split {
                field => "[metric-datas]"
        }

}
output {
  elasticsearch {
    hosts => ["10.1.533.209:9200"]
    index => "appdmetric"
}
        stdout { codec => rubydebug }
}