问题描述
我使用 Parcel 来捆绑我的项目和 jest 来运行我的测试。
一切正常,但在我有 async/await
关键字的测试中,我不得不导入 regenerator-runtime/runtime
像这样:
import "regenerator-runtime/runtime"
test("read armored key",async() => {
})
还有这项工作。
但没有这个导入 (import "regenerator-runtime/runtime"
) 我收到了这个错误信息:
ReferenceError: regeneratorRuntime is not defined
如何将我的项目更改为在没有此导入的情况下运行异步测试?
示例:https://github.com/skhaz/parcel-regeneratorRuntime-is-not-defined
解决方法
据我所知,您可以配置 @babel/preset-env
以针对当前节点版本进行编译,该版本描述为 here 那么它应该可以工作:
.babelrc
{
"presets": [
[
"@babel/preset-env",{
"targets": {
"node": "current"
}
}
]
]
}
,
根据其版本,并非浏览器运行时中可用的所有功能都可以在 Node 运行时中使用。当前版本的 node 支持 Promise(带有 await/async
),但是由于您使用的是 Parcel,默认使用 Babel,您的 async/await
调用将被编译为使用 regenerator-runtime
,该功能的 polyfill。您可以在 every entry file 中使用 import "regenerator-runtime/runtime"
(如果您不需要 polyfill,则不推荐!),或者您可以告诉 babel 您的运行时是什么。
您应该能够使其与 @babel/preset-env 预设一起使用,在您的 .babelrc
中配置如下:
{
"presets": [
[
"@babel/preset-env",{
"targets": {
"node": "10" // the target node version,boolean true,or "current".
}
}
]
]
}
有关为此配置 babel 的更多信息,请参阅此 Medium article。
意见:
不要依赖 Parcel 之类的零配置工具:它们最终会通过创建意外行为(如您的问题)来增加您的开发时间,或者您必须花时间了解它是如何工作的。调试自己的应用程序就足够了;您也不必调试构建工具。