如何执行与 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 兼容的导出?的主要内容,如果未能解决你的问题,请参考以下文章