Javascript 模块1.1导出和es6导入
用巴贝尔反应。我对导入和module.exports有这种混淆。我假设babel在将ES6代码转换为ES5时,将导入和导出分别转换为require和module.exports 如果我从一个模块导出一个函数,然后在另一个模块中导入该函数,则代码执行良好。但是,如果我使用module.exports导出函数,并使用“import”导入,则在运行时会抛出错误,说明它不是函数 我虚构了一个例子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
//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'代码>。给你的答案加上一些解释是的,我的错。我的答案只是在已经解释过的问题之外再添加一些解决方案