在哪里可以找到esbuild的 target属性的有效值列表?

移动开发 2026-07-09

文档没有回答这个问题 https://esbuild.github.io/api/#target

https://github.com/search?q=repo%3Aevanw%2Fesbuild%20node22&type=code

node22 根据他们的CHANGELOG文件是一个有效的目标,但 node22 在他们的代码中并没有出现过。

https://github.com/evanw/esbuild/blob/main/internal/compat/js_table.go 列出了一些特性以及它们的版本支持情况,但那并不完全相同。

我本以为会有一个定义此项的枚举或字符串字面量类型,但那会在源代码中显示出来,但实际并非如此。看来任何值都有效,esbuild只会猜测你想要的值。可这也似乎不对。

(我们用tsup进行构建,它会把配置传给esbuild。)

另一个值得注意的是,它会把 node100 作为目标来接受(Node现在的最高版本大约是26),因此它如何使用这个 target 属性的实际机制就显得隐晦。

关于这点的文档也很含糊,如前所述,因此要弄清楚哪些版本实际有效,需要理解Go的结构体等概念。似乎不存在一个“有效版本列表”,那么用户该如何决定放入什么值?

解决方案

esbuild的文档可以在这里找到:https://esbuild.github.io/

[API -> Target] 这一节解释了语义:

每个目标环境由一个环境名称后跟一个版本号组成。当前支持的环境名称有:

  • chrome
  • deno
  • edge
  • firefox
  • hermes
  • ie
  • ios
  • node
  • opera
  • rhino
  • safari

此外,你还可以指定JavaScript语言版本,例如 es2020。默认目标是 esnext,这意味着默认情况下,esbuild将假设所有最新的JavaScript和 CSS特性都得到支持。下面是一个配置多个目标环境的示例。你不需要指定全部目标环境;你可以只指定项目关心的子集。你也可以对版本号进行更精确的指定(例如用 node12.19.0 而不是仅仅是 node12):

none esbuild app.js --target=es2020,chrome58,edge16,firefox57,node12,safari11

所以,像 node22 这样的字符串其实是两部分——它把目标写成 node,其版本写成 22

不存在也不可能存在按每个esbuild版本列出的受支持平台版本清单。支持取决于两个因素:

  • 你在 target 中定义的版本
  • 你在代码中使用的特性

只有当代码中的某个特性与目标平台/版本组合不兼容时,构建才会因为版本问题而失败。

版本被当作 SemVer版本三元组 来处理。当作为 --target 参数传入时,缺失的小版本号或修订号将被视为0,因此 --target=node22 = 22.0.0/

特性在 compaty/js_table.go 中定义,每个特性在每个平台有起始和结束版本。例如,对导入断言的支持定义如下:

ImportAssertions: {
    Chrome: {{start: v{91, 0, 0}}},
    Deno:   {{start: v{1, 17, 0}}},
    Edge:   {{start: v{91, 0, 0}}},
    Node:   {{start: v{16, 14, 0}, end: v{22, 0, 0}}},
},

因此,它表示在Node上,其起始版本是16.14.0,结束版本是22.0.0,因此如果你有一个类似这样的文件(示例代码来自这里:https://v8.dev/features/import-assertions):

// main.mjs
import json from './foo.json' assert { type: 'json' };
console.log(json.answer); // 42

它将会编译失败,显示为:

# less than start version for Node (16.14.0)

esbuild main.mjs --target=node10  
esbuild main.mjs --target=node16


# greater than or equal to end version for Node (22.0.0)

esbuild main.mjs --target=node22
esbuild main.mjs --target=node26

但会在以下情况下成功

# greater or equal to start version for Node (16.14.0), 
# less than the end version (22.0.0)

esbuild main.mjs --target=node16.14
esbuild main.mjs --target=node17
esbuild main.mjs --target=node21


# greater or equal to start version for Deno (1.17.0) 
# there is no end version

esbuild main.mjs --target=deno1.7
esbuild main.mjs --target=deno2
esbuild main.mjs --target=deno999

Deno目前没有999版本,不过该特性没有定义结束版本,因此不存在冲突。

只要代码使用的特性没有设定结束日期,使用 esbuild --target=node999 也可以。版本999.0.0大于Node特性起始日期中的任意一个。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章