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

Posted

技术标签:

【中文标题】如何执行与 ES5 和 ES6 兼容的导出?【英文标题】:How do I perform an export that is compatible with ES5 and ES6? 【发布时间】:2015-07-26 07:53:46 【问题描述】:

我正在节点中写一个“类”

// mymodule/index.js

function MyClass() 
MyClass.prototype.method1 = function() ..

我经常这样做

module.exports = MyClass

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

var MyClass = require('mymodule')

import MyClass from 'mymodule'

正确的做法是什么?

【问题讨论】:

看看 Babel 是如何处理这个问题的:babeljs.io/docs/usage/modules/#interop 为什么要import MyClass from 'mymodule' 而不是import MyClass from 'mymodule'var MyClass = require('mymodule') 等价于import MyClass from 'mymodule'import MyClass from 'mymodule' 等价于var MyClass = require('mymodule').MyClass。虽然你当然可以实现你想要的,但问题是它是否有意义。 您可能是指如何执行与 CommonJS 和 ES6 的 Harmony 兼容的导出。 @E_net4 是的,这就是我想要的 当然。我的观点是module.exports = MyClass(可能)适用于import MyClass from 'mymodule'。但是如果你想使用import MyClass from 'mymodule',你就必须写module.exports = MyClass; exports.MyClass = MyClass;。相关:我只是编译我的代码,包括测试,然后让 mocha 在编译后的代码上运行。 【参考方案1】:

就编写兼容 ES5 和 ES6 的导出而言,Babel 已经为您处理好了。 (正如 cmets 中针对您的问题所传达的那样。我只是为那些在对话中迷路的人澄清一下。)

module.exports = MyClass

适用于var MyClass = require('mymodule')import MyClass from 'mymodule

但是,为了清楚起见,您询问的实际语法:

import MyClass from 'mymodule'

意思与

不同
import MyClass from 'mymodule'

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

【讨论】:

【参考方案2】:

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

import MyClass from 'mymodule'

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

module.exports.MyClass = MyClass

然后像这样导入它:

import  MyClass  from 'mymodule'

【讨论】:

这与 OP 要求的 es5 不兼容。 @Jim 问题是如何使 es5 与 es6 兼容。我的回答只是指出了代码中的一个错误以及如何修复它。这不仅仅是 es6 代码,清单 2 说明了如何调整 es5 代码,而清单 1 说明了如何调整 es6 代码,以解决整个问题。【参考方案3】:

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

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

【讨论】:

以上是关于如何执行与 ES5 和 ES6 兼容的导出?的主要内容,如果未能解决你的问题,请参考以下文章

如何快速让浏览器兼容ES6特性

最简单es6 7 等转es5 babel配置

ES6以上版本代码要不要转码成ES5?

ES6以上版本代码要不要转码成ES5?

ES6以上版本代码要不要转码成ES5?

ES6以上版本代码要不要转码成ES5?