如何执行与ES5和ES6兼容的导出?

rkm*_*max 28 javascript ecmascript-5 ecmascript-6

我正在节点中写一个"类"

// mymodule/index.js

function MyClass() {}
MyClass.prototype.method1 = function() {..}
Run Code Online (Sandbox Code Playgroud)

通常我做

module.exports = MyClass
Run Code Online (Sandbox Code Playgroud)

但我希望我的课程可用于两种语法

var MyClass = require('mymodule')
Run Code Online (Sandbox Code Playgroud)

import {MyClass} from 'mymodule'
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

Nne*_*Ude 12

对于编写兼容ES5和ES6的导出,Babel已经为您完成了这项工作.(正如您对问题的评论中所述.我只是澄清那些在对话中迷路的人.)

module.exports = MyClass
Run Code Online (Sandbox Code Playgroud)

将与工作都var MyClass = require('mymodule')import MyClass from 'mymodule

但是,要清楚,您询问的实际语法是:

import {MyClass} from 'mymodule'
Run Code Online (Sandbox Code Playgroud)

意味着不同的东西

import MyClass from 'mymodule'
Run Code Online (Sandbox Code Playgroud)

对于后者,您必须将其导出为:module.exports.MyClass = MyClass,而对于ES5模块,则必须将其导出为var MyClass = require('mymodule').MyClass


Arw*_*ett 6

两种方式都是正确的,但尝试在 es6 中像这样不带括号导入:

import MyClass from 'mymodule'
Run Code Online (Sandbox Code Playgroud)

否则你将不得不像这样导出你的函数:

module.exports.MyClass = MyClass
Run Code Online (Sandbox Code Playgroud)

然后像这样导入它:

import { MyClass } from 'mymodule'
Run Code Online (Sandbox Code Playgroud)

  • 这与 es5 不兼容,这正是 OP 所要求的。 (3认同)

Cap*_*paj 0

从评论中,我了解到您正在尝试在 Node.js 中的一些 mocha 单元测试中运行 ES6 前端代码。是的,在节点支持 ES6 模块之前你不能这样做。如果我是你,我会使用systemjs加载那些摩卡测试的代码。Mocha 支持 Promise,因此在测试之前加载任何文件应该相当轻松。

为两者编写语法只会给您带来更多问题。