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

Javascript CJS和ES6模块之间的语法差异,javascript,ecmascript-6,commonjs,Javascript,Ecmascript 6,Commonjs,在CJS模块中,我将使用export和var plugin=require'plugin';出口/进口 在ES6模块中,我会使用export和import*作为“plugin”的插件;导出/导入 还有更多的语法差异吗?这些差别正确吗 什么是导出默认和导出*?CommonJS模块和ES6模块非常相似,但它们有一些非常重要的区别需要注意。要首先直接回答您的问题: var plugin = require('plugin'); 在ES6中,两者都是等效的 // Import all named ex

在CJS模块中,我将使用export和var plugin=require'plugin';出口/进口 在ES6模块中,我会使用export和import*作为“plugin”的插件;导出/导入

还有更多的语法差异吗?这些差别正确吗


什么是导出默认和导出*?

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

var plugin = require('plugin');
在ES6中,两者都是等效的

// Import all named exports of 'plugin'.
import * as plugin from 'plugin';
和/或

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

// an alias of
import {default as plugin} from 'plugin';
但这取决于“插件”是如何编写的,以及它是使用ES6导出还是CommonJS module.exports编写的

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

exports.foo = ...;
exports.bar = ...;
导出命名属性。它们还可以将“默认”对象导出为

module.exports = function(){};
这里的核心是,如果您同时需要默认导出和命名导出,那么您唯一的选择就是将属性直接放在默认导出上

ES6模块 对于ES6模块,命名导出和默认导出的概念是100%分开的。e、 g

export var foo = ...;
export var bar = ...;
export default function fn(){};
主要区别在于

fn.foo !== foo;
在这个例子中,有两种情况

用于ES6导出的插件 用于CommonJS module.exports的插件 实时绑定导入/导出 您的示例中的另一个主要区别是插件是活动绑定。这意味着,如果稍后在模块内部进行更新,它将在您的导入中进行自我更新,例如

// plugin.js

export var foo = 'foo';

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

// other.js

import {foo, update} from 'plugin';

foo === 'foo';

update();

foo === 'bar'
如果你这样做了,情况就不会是这样了

var foo = require('plugin').foo;
var update = require('plugin').update;

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

var plugin = require('plugin');
在ES6中,两者都是等效的

// Import all named exports of 'plugin'.
import * as plugin from 'plugin';
和/或

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

// an alias of
import {default as plugin} from 'plugin';
但这取决于“插件”是如何编写的,以及它是使用ES6导出还是CommonJS module.exports编写的

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

exports.foo = ...;
exports.bar = ...;
导出命名属性。它们还可以将“默认”对象导出为

module.exports = function(){};
这里的核心是,如果您同时需要默认导出和命名导出,那么您唯一的选择就是将属性直接放在默认导出上

ES6模块 对于ES6模块,命名导出和默认导出的概念是100%分开的。e、 g

export var foo = ...;
export var bar = ...;
export default function fn(){};
主要区别在于

fn.foo !== foo;
在这个例子中,有两种情况

用于ES6导出的插件 用于CommonJS module.exports的插件 实时绑定导入/导出 您的示例中的另一个主要区别是插件是活动绑定。这意味着,如果稍后在模块内部进行更新,它将在您的导入中进行自我更新,例如

// plugin.js

export var foo = 'foo';

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

// other.js

import {foo, update} from 'plugin';

foo === 'foo';

update();

foo === 'bar'
如果你这样做了,情况就不会是这样了

var foo = require('plugin').foo;
var update = require('plugin').update;

在CJS中,export和module.export只是一个变量。在ES6中,export是一个关键字,在语言中有自己的语法@谢谢你,很有趣。回答一个有趣的问题也需要几分钟的时间。在CJS中,export和module.export只是一个变量。在ES6中,export是一个关键字,在语言中有自己的语法@谢谢你,很有趣。去一个有趣的答案,也将需要几分钟的学习。这是一个非常好的答案+1.我可以在Node.js或io.js中的同一个项目中使用commonjs和ES6语法吗?我想知道是否有我不知道的问题?CommonJS模块是否会随着时间的推移而消失?这可能是一个主观问题…?还发现了一篇有趣的要点/文章:您肯定可以在ES6中使用ES5模块。我不能说是针对Traceur的,但是当您使用导入语法检查您是导入ES6模块还是ES5时,Babel包含了一个标准的互操作性层。这是一个非常好的答案+1.我可以在Node.js或io.js中的同一个项目中使用commonjs和ES6语法吗?我想知道是否有我不知道的问题?CommonJS模块是否会随着时间的推移而消失?这可能是一个主观问题…?还发现了一篇有趣的要点/文章:您肯定可以在ES6中使用ES5模块。我不能说是针对Traceur,但当您使用导入语法检查您是导入ES6模块还是ES5时,Babel包含了一个标准的互操作性层。