这是很小的一件事。

但是我花了至少两个小时的时间。

起因是这样的:

我需要一个异步函数的原型

const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor

这个原型是用来生成 new AsyncFunction(str)的。

运行环境下,一点问题都没有。

但是打包出来,总是报错。

因为new AsyncFunction(str)中有str = ...await...这样的代码。

就很奇怪。

sourceMap一点问题都没有。

各种原因都找遍了。

最后是在受不了,只能查看打包出来的dist文件。

破案了。

async被编译成generator!!!

找到问题就好解决了。

我直接把const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor放到index.html中,不接受编译就好。

问题解决了。

但是疑问一直存在,为什么?

最后,找了一圈,还是ChatGPT告诉我,因为vite.config.ts中的build.target: "es2015"导致的,只要改为build.target: "esnext"就可。

果然,改了之后,async不再变成generator。

原因是es2015不支持async/await。

诶,老项目的配置就是有问题。

新项目的配置就不会有这种坑。

不过,经此,也增加了一些没用的知识。

也算有所收获!


陈其文
429 声望19 粉丝

前端