2016-01-22 90 views
0

我试图使用ES6 imorts与巴贝尔和Node.js的ES6进口“模块”不给的存取权限“模块”

import "./utils.js"; 

log("something"); //throw an error : log is not defined 

utils.js看起来像这样的功能:

function log(... params){ 
    console.log(... params); 
} 

log("module utils executed"); 
//Is executed and display "module utils executed" in the console. 

我也尝试使用export function log(... params)export default log(... params)但它不起作用。

所以我不明白这是怎么猜想作品...

编辑:

我知道的其他方式进口是做import utils from "./utils.js"

但它不是我想。我希望能够使用log()而不用前缀模块变量名称。像this blog post

+1

你试过'导出默认函数日志(){...'? –

+0

是的,我尝试过。它不会改变任何事情。 –

+0

您可以指向博客文章中您看到函数直接导入到命名空间中的位置吗? –

回答

3

不,没有办法将模块的所有导出成员导入当前命名空间。导入一个副作用模块(即import 'utils')不会对utils的成员产生任何影响。

你可以得到的最接近的是这样的:

utils的。JS

export function log(...params) { ... } 
export function foo(a) { ... } 

main.js

import * as u from './utils'; 
u.log(1, 2, 3); 
u.foo(4); 

import { log, foo } from './utils'; 
log(1, 2, 3); 
foo(4); 

之一ES6模块规范的设计目标,是一个静态的模块结构,它允许进口的分辨率在编译时(在执行任何事情之前)。允许一揽子进口会使静态分析更加困难。


编辑不这样做!)

由于@Bergi在评论中指出的那样,你可以添加功能全局命名空间,如下所示:

utils的。 js

function log(...params) { ... } 
global.log = log; 

main.js

import './utils'; // import for side effects, add properties to the global object 
log(1, 2, 3);  // the global object is in the scope chain, so this is resolved 

然而这是一个坏主意。全局变量的解析速度很慢,并且通常会打破您首先使用模块试图实现的模块化。

+1

那么我们可以把这些函数放在全局范围内,然后只导入那个模块,但这真的是我们不想做的。 – Bergi

+0

@Bergi,你的意思是'global.log = ...'?是的,这将是一件非常糟糕的事情。 –

+0

是的,这就是我的意思,这是OP的代码(在'main.js')按原样工作的唯一方法。但是,你的答案应该是+1。 – Bergi

4

有不同ES6 import和Node.js的requireQuestion Describe The Difference

如果您将使用Node.js的require

utils.js文件将被

function log(params) { 
    console.log(params); 
} 

module.exports = { 
    log 
}; 

的其他文件将导入您的Utils模块将是

var utils = require('./utils'); 
utils.log("test"); 

如果您将使用ES6模块:

utils.js文件将被

var log = function (params) { 
    console.log(params); 
} 

var utils = { 
    log: log 
} 

export default utils; 

其他文件将导入您的utils的模块将被

import utils from 'utils'; 

utils.log("test"); 

UPDATE

your Comment,是的,你可以做到这一点,但使用ES6模块

utils.js文件将被

function log(params) { 
    console.log(params); 
} 

function anotherLog(params) { 
    console.log(params); 
} 

export { log, anotherLog } 

其他文件将导入您的utils的模块将被

import { log } from 'utils'; 

log("test"); 
+0

是的,我知道这一点,但我不想使用这种导入类型。我想直接在我的名字空间中导入函数。我希望能够在不用模块变量前缀的情况下调用'log'。 –

+0

@EmrysMyrooin看到更新到我的回答 –

+0

是的,它适用于'日志',但我的'utils.js'模块不conatins只'log()'。这是一个util模块,它将包含我想在所有模块中使用的函数。 –