CJS和ES6模块之间的语法差异

Rik*_*ard 1 javascript commonjs ecmascript-6

在CJS模块中,我将使用exportvar plugin = require('plugin');     导出/导入
在ES6模块中我将使用exportimport * as plugin from 'plugin';导出/导入.

是否有更多的语法差异?这些^差异是否正确?

什么export defaultexport *

log*_*yth 8

CommonJS模块和ES6模块非常相似,但它们有一些非常重要的差异需要注意.要先直接回答您的问题:

var plugin = require('plugin');
Run Code Online (Sandbox Code Playgroud)

在ES6中将相当于两者

// Import all named exports of 'plugin'.
import * as plugin from 'plugin';
Run Code Online (Sandbox Code Playgroud)

和/或

// Import default export of 'plugin'.
import plugin from 'plugin';

// an alias of
import {default as plugin} from 'plugin';
Run Code Online (Sandbox Code Playgroud)

但这取决于"插件"的编写方式以及它是用ES6 export还是CommonJS 编写的module.exports.

CommonJS模块

CommonJS导入只有一个导出的对象.该对象可以是函数,对象或任何东西.一般来说CommonJS模块都可以

exports.foo = ...;
exports.bar = ...;
Run Code Online (Sandbox Code Playgroud)

导出命名属性.他们还可以将"默认"对象导出为

module.exports = function(){};
Run Code Online (Sandbox Code Playgroud)

这里的核心是,如果你想要一个默认导出和命名导出,你唯一的选择是实际将属性直接放在默认导出上.

ES6模块

对于ES6模块,命名导出和默认导出的概念是100%分开的.例如

export var foo = ...;
export var bar = ...;
export default function fn(){};
Run Code Online (Sandbox Code Playgroud)

主要区别在于

fn.foo !== foo;
Run Code Online (Sandbox Code Playgroud)

在这个例子中,有两种情况

插件使用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';
Run Code Online (Sandbox Code Playgroud)

插件使用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';
Run Code Online (Sandbox Code Playgroud)

实时绑定导入/导出

您的示例中的另一个主要区别plugin是实时绑定.这意味着如果它稍后在模块内更新,它将在您的导入中更新自己,例如

// plugin.js

export var foo = 'foo';

export function update(){
    foo = 'bar';
}

// other.js

import {foo, update} from 'plugin';

foo === 'foo';

update();

foo === 'bar'
Run Code Online (Sandbox Code Playgroud)

如果你做的话就不会这样

var foo = require('plugin').foo;
var update = require('plugin').update;
Run Code Online (Sandbox Code Playgroud)