CommonJS模块和ES6模块非常相似,但它们有一些非常重要的差异需要注意。直接回答您的问题:
var plugin = require('plugin');
在ES6中等同于两者都是
import * as plugin from 'plugin';
和/或
import plugin from 'plugin';
import {default as plugin} from 'plugin';
但这取决于'plugin'是如何编写的,以及它是否使用了ES6export
或CommonJS module.exports
进行编写。
CommonJS模块
CommonJS导入只有一个导出对象。该对象可以是函数、对象或任何其他类型。通常情况下,CommonJS模块会这样做。
exports.foo = ...;
exports.bar = ...;
导出命名属性。它们还可以导出一个“默认”对象
module.exports = function(){};
核心问题在于,如果您想要默认导出和命名导出两个功能,则唯一的选择是将属性直接放到默认导出上。
ES6模块
对于ES6模块,命名导出和默认导出的概念完全分离。例如:
export var foo = ...;
export var bar = ...;
export default function fn(){};
主要区别在于
fn.foo !== foo
使用这个示例,有两种情况。
插件使用了ES6 export
import * as plugin from 'plugin';
plugin.foo === ...;
plugin.bar === ...;
typeof plugin === 'object';
import plugin from 'plugin';
plugin.foo === undefined;
plugin.bar === undefined;
typeof plugin === 'function';
使用 CommonJS 的插件 module.exports
import * as plugin from 'plugin';
plugin.foo === ...;
plugin.bar === ...;
typeof plugin === 'object';
import plugin from 'plugin';
plugin.foo === ...;
plugin.bar === ...;
typeof plugin === 'function';
实时绑定的导入/导出
在您的示例中,另一个主要区别是plugin
是实时绑定。这意味着,如果稍后在模块内更新了它,它会自动更新您的导入内容,例如:
export var foo = 'foo';
export function update(){
foo = 'bar';
}
import {foo, update} from 'plugin';
foo === 'foo';
update();
foo === 'bar'
如果你不这样做,那将不是这种情况。
var foo = require('plugin').foo;
var update = require('plugin').update;
export
(和module.export
)只是一个变量。在ES6中,export
是一个关键字,并且在语言中有自己的语法! - Bergi