developit / developit/microbundle

Generates Broken CommonJS From Typescript

未关闭
#1,079 3 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
JavaScript
星标
8.1k
派生
358
PR 合并指标
30 天内没有已合并 PR

描述

Microbundle creates broken CommonJS code when compiling from Typescript.

The `continue` keyword in the following code is not respected in the compiled CommonJS code.

```ts
async function brokenContinue() {
let j = 0;

while (j <= 3) {
j++;
console.log("AT THE TOP");

if (j === 1) {
console.log("\t- j === 1");
console.log("\t- waiting for 100ms");
await new Promise((resolve) => setTimeout(resolve, 100));
console.log('\t- continue, next log will be "AT THE TOP"');
continue;
}

console.log("AT THE BOTTOM");
}
}

void brokenContinue();
```

The output is:

```
$ node dist/index.cjs
AT THE TOP
- j === 1
- waiting for 100ms
- continue, next log will be "AT THE TOP"
AT THE BOTTOM <------- THIS SHOULD READ "AT THE TOP"
AT THE TOP
AT THE BOTTOM
AT THE TOP
AT THE BOTTOM
AT THE TOP
AT THE BOTTOM
```

The problem is caused by the usage of `async/await` within the while loop. Commenting out: `await new Promise((resolve) => setTimeout(resolve, 100));` produces the expected result.

**Notes:**
- Compiling using `tsc` generates JS that works correctly.
- Compiling to modern JS generates code that works correctly.

Here's a repo containing the setup that caused the issue: https://github.com/luxo-ai/breakjs

贡献指南

这个仓库没有索引到贡献指南

调研方向

从链接的 breakjs 复现开始,将 dist/index.cjs 与 tsc 的输出以及 modern-JavaScript 编译结果进行比较。跟踪 while 循环所使用的 async/await 转换;当生成的 CommonJS 保留 continue 的行为,并在 await 的 Promise 之后输出 "AT THE TOP" 时即完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
javascript, typescript
领域
build-system, tooling
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
42/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。