CJS 和 ES6 模块之间的语法差异
syntax differences between CJS & ES6 modules
在 CJS 模块中,我会使用 export
和 var plugin = require('plugin');
到 export/import
在 ES6 模块中,我会使用 export
和 import * as plugin from 'plugin';
到 export/import。
是否有更多的语法差异?这些 ^ 差异是否正确?
export default
和 export *
是什么?
CommonJS 模块和 ES6 模块非常相似,但它们有一些非常重要的区别需要注意。先直接回答你的问题:
var plugin = require('plugin');
在 ES6 中等价于两者
// Import all named exports of 'plugin'.
import * as plugin from 'plugin';
and/or
// Import default export of 'plugin'.
import plugin from 'plugin';
// an alias of
import {default as plugin} from 'plugin';
但这取决于 'plugin' 是如何编写的以及它是用 ES6 export
还是 CommonJS module.exports
.
编写的
CommonJS 模块
CommonJS 导入只有一个导出对象。该对象可以是函数、对象或任何东西。通常 CommonJS 模块做
exports.foo = ...;
exports.bar = ...;
导出命名属性。他们还可以将 'default' 对象导出为
module.exports = function(){};
这里的核心是,如果您同时想要默认导出和命名导出,您唯一的选择就是将属性直接放到默认导出上。
ES6 模块
对于 ES6 模块,命名导出和默认导出的概念是 100% 分开的。例如
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';
实时绑定import/export
您的示例中的另一个主要区别是 plugin
是实时绑定。这意味着如果稍后在模块内部更新它,它将在您的导入中更新自身,例如
// 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
和 var plugin = require('plugin');
到 export/import
在 ES6 模块中,我会使用 export
和 import * as plugin from 'plugin';
到 export/import。
是否有更多的语法差异?这些 ^ 差异是否正确?
export default
和 export *
是什么?
CommonJS 模块和 ES6 模块非常相似,但它们有一些非常重要的区别需要注意。先直接回答你的问题:
var plugin = require('plugin');
在 ES6 中等价于两者
// Import all named exports of 'plugin'.
import * as plugin from 'plugin';
and/or
// Import default export of 'plugin'.
import plugin from 'plugin';
// an alias of
import {default as plugin} from 'plugin';
但这取决于 'plugin' 是如何编写的以及它是用 ES6 export
还是 CommonJS module.exports
.
CommonJS 模块
CommonJS 导入只有一个导出对象。该对象可以是函数、对象或任何东西。通常 CommonJS 模块做
exports.foo = ...;
exports.bar = ...;
导出命名属性。他们还可以将 'default' 对象导出为
module.exports = function(){};
这里的核心是,如果您同时想要默认导出和命名导出,您唯一的选择就是将属性直接放到默认导出上。
ES6 模块
对于 ES6 模块,命名导出和默认导出的概念是 100% 分开的。例如
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';
实时绑定import/export
您的示例中的另一个主要区别是 plugin
是实时绑定。这意味着如果稍后在模块内部更新它,它将在您的导入中更新自身,例如
// 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;