Javascript 模块1.1导出和es6导入

Javascript 模块1.1导出和es6导入,javascript,babeljs,es6-module-loader,Javascript,Babeljs,Es6 Module Loader,用巴贝尔反应。我对导入和module.exports有这种混淆。我假设babel在将ES6代码转换为ES5时,将导入和导出分别转换为require和module.exports 如果我从一个模块导出一个函数,然后在另一个模块中导入该函数,则代码执行良好。但是,如果我使用module.exports导出函数,并使用“import”导入,则在运行时会抛出错误,说明它不是函数 我虚构了一个例子 //Tiger.js 函数Tiger(){ 功能咆哮(terrian){ log('嘿,我在'+terria

用巴贝尔反应。我对导入和module.exports有这种混淆。我假设babel在将ES6代码转换为ES5时,将导入和导出分别转换为require和module.exports

如果我从一个模块导出一个函数,然后在另一个模块中导入该函数,则代码执行良好。但是,如果我使用module.exports导出函数,并使用“import”导入,则在运行时会抛出错误,说明它不是函数

我虚构了一个例子

//Tiger.js
函数Tiger(){
功能咆哮(terrian){
log('嘿,我在'+terrian+'中,我在漫游');
};
回归咆哮;
}
module.exports=Tiger;
//animal.js
从“./动物”导入{Tiger};
动物变量=老虎();
动物(“丛林”);
我使用带有预设es2015的babel来转换它。这给了我以下的错误

未捕获的TypeError:(0,_anists.Tiger)不是函数

但是如果我删除
module.exports=Tiger
并将其替换为
导出{Tiger}工作正常

我在这里错过了什么

编辑:
我正在使用browserify作为模块绑定器。

export{Tiger}
相当于
module.exports.Tiger=Tiger

相反,
module.exports=Tiger
相当于
export default Tiger


因此,当您使用
module.exports=Tiger
并尝试从“/anies”导入{Tiger}时,实际上是在请求
Tiger.Tiger

export{Tiger}
相当于
module.exports.Tiger=Tiger

相反,
module.exports=Tiger
相当于
export default Tiger


因此,当您使用
module.exports=Tiger
并尝试从“/anies”导入{Tiger}时,实际上是在请求
Tiger.Tiger

如果要导入:

module.exports = Tiger
您可以使用以下结构:

import * as Tiger from './animals'
那就行了


另一个选项是按@Matt Molnar所述更改导出,但只有在您是导入代码的作者时才可以更改导出。

如果您要导入:

module.exports = Tiger
您可以使用以下结构:

import * as Tiger from './animals'
那就行了


另一个选项是按@Matt Molnar所述更改导出,但仅当您是导入代码的作者时才可能更改导出。

模块未设置时。
导出将指向空对象(
{}
)。当您执行
module.exports=Tiger
时,您告诉运行时从该模块导出的对象是
Tiger
对象(而不是默认的
{}
),在这种情况下,它是一个函数。
由于您希望导入相同的函数,因此导入的方式是使用默认导入(
import tiger from./tiger'
)。否则,如果要使用命名导入(
import{tiger}from./tiger'
),则必须更改
module.exports
对象或使用
export
关键字而不是
module.exports
对象。

默认导入/导出:

// tiger.js
module.exports = tiger;
// or
export default function tiger() { ... }

// animal.js
import tiger from './tiger';
// tiger.js
module.exports = { tiger };
// or
module.exports.tiger = tiger
// or
export const tiger = () => { ... }
// or
export function tiger() => { ... }

// animal.js
import { tiger } from './tiger';
命名导入/导出:

// tiger.js
module.exports = tiger;
// or
export default function tiger() { ... }

// animal.js
import tiger from './tiger';
// tiger.js
module.exports = { tiger };
// or
module.exports.tiger = tiger
// or
export const tiger = () => { ... }
// or
export function tiger() => { ... }

// animal.js
import { tiger } from './tiger';

未设置
module.exports
时,它指向空对象(
{}
)。当您执行
module.exports=Tiger
时,您告诉运行时从该模块导出的对象是
Tiger
对象(而不是默认的
{}
),在这种情况下,它是一个函数。
由于您希望导入相同的函数,因此导入的方式是使用默认导入(
import tiger from./tiger'
)。否则,如果要使用命名导入(
import{tiger}from./tiger'
),则必须更改
module.exports
对象或使用
export
关键字而不是
module.exports
对象。

默认导入/导出:

// tiger.js
module.exports = tiger;
// or
export default function tiger() { ... }

// animal.js
import tiger from './tiger';
// tiger.js
module.exports = { tiger };
// or
module.exports.tiger = tiger
// or
export const tiger = () => { ... }
// or
export function tiger() => { ... }

// animal.js
import { tiger } from './tiger';
命名导入/导出:

// tiger.js
module.exports = tiger;
// or
export default function tiger() { ... }

// animal.js
import tiger from './tiger';
// tiger.js
module.exports = { tiger };
// or
module.exports.tiger = tiger
// or
export const tiger = () => { ... }
// or
export function tiger() => { ... }

// animal.js
import { tiger } from './tiger';

你看过巴别塔的输出了吗?查看
Tiger.js
的传输源代码将立即告诉您为什么它不工作。长话短说:坚持使用一个模块系统,或者使用一个模块绑定器(如webpack)来处理不一致性。很抱歉,我使用browserify作为模块绑定器。您看过Babel输出了吗?查看
Tiger.js
的传输源代码将立即告诉您为什么它不工作。长话短说:坚持使用一个模块系统,或者使用一个模块绑定器(如webpack)来处理不一致的问题。很抱歉,我使用browserify作为模块绑定器。那么这里正确的导入语句是什么?如果您不想更改Tiger.js,那么正确的导入语句应该是什么呢?如果你不想改变Tiger.js,我相信是这样的,
import*as Tiger from./anists'
对我有用!谢谢
Tiger
是上述示例中的一个函数。不能使用
import*作为某物导入可调用的(函数或类),因为
something
将表示一个
名称空间
对象,该对象不可调用。这种情况下正确的导入是默认导入:
import Tiger from./anives'
从“/animals”以老虎身份导入*
对我有用!谢谢
Tiger
是上述示例中的一个函数。不能使用
import*作为某物导入可调用的(函数或类),因为
something
将表示一个
名称空间
对象,该对象不可调用。这种情况下正确的导入是默认导入:
import Tiger from./anives'。给你的答案加上一些解释是的,我的错。我的答案只是在已经解释过的问题之外再添加一些解决方案