Javascript CJS和ES6模块之间的语法差异
在CJS模块中,我将使用export和var plugin=require'plugin';出口/进口 在ES6模块中,我会使用export和import*作为“plugin”的插件;导出/导入 还有更多的语法差异吗?这些差别正确吗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
什么是导出默认和导出*?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包含了一个标准的互操作性层。