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

标签 javascript ecmascript-6 commonjs

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

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

什么是export defaultexport *

最佳答案

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 export 还是 CommonJS module.exports 编写的。

CommonJS 模块

CommonJS 导入只有一个导出对象。该对象可以是函数、对象或任何东西。通常 CommonJS 模块会做

exports.foo = ...;
exports.bar = ...;

导出命名属性。他们也可以将“默认”对象导出为

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';

实时绑定(bind)导入/导出

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

// 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;

关于javascript - CJS 和 ES6 模块之间的语法差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31131314/

相关文章:

javascript - 如何获取字符串路径名?

javascript - 导入类的函数未定义

javascript - ES6 类构造函数不能作为普通函数调用的原因是什么?

javascript - 使用 Handlebars 模板编译 JSON 内容的函数无法正常工作(语法错误?)

javascript - jquery 插件适用于不同的 jquery 版本

JavaScript:文本区域加载

javascript - Visual Studio Code : Auto complete HTML tags inside an embedded babel script

javascript - 我可以导入 babel-polyfill 模块而不是全部导入吗?

json - common-js utils 中的 JSON Schema 验证是否支持引用?

javascript - Node : How to handle event listening between objects?