老规矩,小手动起来~点赞关注不迷路!
esbuild简单介绍
esbuild
为了突破JavaScript
语言的瓶颈,采用了Go
语言编写,构建速度与同代码量下的webpack
对比提升在10
倍以上,开创了构建工具性能的新时代。
它的中文文档,本人正在不断的更新完善中,欢迎大家关注阅读!
Supported by: Build and Transform
此选项告诉esbuild
如何处理JSX
语法。以下是可用选项:
此选项告诉esbuild
使用通用转换将JSX
转换为JS
,该转换在许多使用JSX
语法的库之间共享。每个JSX
元素都被转换为JSX
工厂函数,并将元素的组件作为第一个参数(或者将JSX片段
作为第一个参数)。第二个参数是一个props
数组(如果没有props
,则为null
)。出现的任何子元素都将成为第二个参数之后的附加参数。
如果您想在单个文件上进行配置,可以使用// @jsxRuntime classic
注释来实现。这是esbuild
遵循Babel JSX
插件中的一个约定。
使用这个选项将在输出文件中保留JSX
语法,而不会将其转换为函数调用。JSX
元素被视为一级语法,并且仍然受到其他设置(如minification
和property mangling
)的影响。
请注意,这意味着输出文件不再是有效的JavaScript
可执行代码。当您希望在打包后通过另一个工具转换esbuild
输出文件中的JSX
语法时,可以使用此功能。
这种转换方式是在React 17+
中引入的,对React
来说非常特殊。它根据JSX import source
自动生成import
语句,并介绍了许多关于如何处理JSX
语法的特殊情况。细节太复杂了,这里无法描述。有关更多信息,请阅读React关于他们新的JSX转换的文档。如果要启用此转换的开发模式版本,则需要额外启用JSX dev
配置。
如果要按文件配置,可以使用// @jsxRuntime automatic
注释。这是esbuild
遵循Babel JSX
插件中的一个约定。
以下是将JSX转换设置为preserve
的示例:
$ echo '' | esbuild --jsx=preserve --loader=jsx
<div />;
Supported by: Build and Transform
如果JSX
转换已设置为automatic
,那么启用此设置会使esbuild
自动将文件名和源代码位置注入到每个JSX
元素中。然后,您的JSX
库可以使用这些信息来帮助调试。如果JSX
转换被设置为非自动模式,那么此设置将不起任何作用。以下是启用此设置的示例:
$ echo '' | esbuild --loader=jsx --jsx=automatic
import { jsx } from "react/jsx-runtime";
/* @__PURE__ */ jsx("a", {});
$ echo '' | esbuild --loader=jsx --jsx=automatic --jsx-dev
import { jsxDEV } from "react/jsx-dev-runtime";
/* @__PURE__ */ jsxDEV("a", {}, void 0, false, {
fileName: "" ,
lineNumber: 1,
columnNumber: 1
}, this);
Supported by: Build and Transform
这个选项可以设置每一个JSX元素的调用函数。通常一个JSX
表达式像下面这样:
Example text
如果使用React.createElement
,会被编译为下面这种形式的函数:
React.createElement("div", null, "Example text");
你可以使用此配置项更改这个React.createElement
函数。比如,使用函数h
代替:
$ echo '' | esbuild --jsx-factory=h --loader=jsx
/* @__PURE__ */ h("div", null);
或者,如果你使用的是typescript
,你可以再tsconfig.json
中像下面这样配置一下,esbuild
就会自动从配置中获取这个选项:
{
"compilerOptions": {
"jsxFactory": "h"
}
}
如果要按文件配置,可以在文件中使用// @jsx h
注释。注意,当JSX
解析模式设置为automatic
时,此选项是无效的。
Supported by: Build and Transform
这个选项可以设置每一个JSX
片段的调用函数。通常一个JSX
片段像下面这样:
<>Stuff>
如果使用React.Fragment
,会被编译为下面这种形式的函数:
React.createElement(React.Fragment, null, "Stuff");
你可以使用此配置项更改这个React.Fragment
函数。比如,使用函数Fragment
代替:
$ echo '<>x>' | esbuild --jsx-fragment=Fragment --loader=jsx
/* @__PURE__ */ React.createElement(Fragment, null, "x");
或者,如果你使用的是typescript
,你可以再tsconfig.json
中像下面这样配置一下,esbuild
就会自动从配置中获取这个选项:
{
"compilerOptions": {
"jsxFragmentFactory": "Fragment"
}
}
如果要按文件配置,可以在文件中使用// @jsxFrag Fragment
注释。注意,当JSX
解析模式设置为automatic
时,此选项是无效的。
Supported by: Build and Transform
如果JSX
转换已设置为automatic
,那么通过设置它可以更改esbuild
从哪个库自动导入JSX
的辅助函数。请注意,这只适用于React 17+
特有的JSX
转换。如果您将JSX
导入源代码设置为your-pkg
,那么该软件包必须至少公开以下export
:
import { createElement } from "your-pkg"
import { Fragment, jsx, jsxs } from "your-pkg/jsx-runtime"
import { Fragment, jsxDEV } from "your-pkg/jsx-dev-runtime"
/jsx-runtime
运行时和/jsx-dev-runtime
运行时子路径是经过设计的,硬编码的,不能更改。jsx
和jsxs
导入在jsx
开发模式关闭时使用,jsxDEV
导入在jsx-dev
模式打开时使用。React关于其新的jsx转换的文档中描述了这些导入的含义。无论JSX
开发模式如何,当一个元素有一个prop
队列,后面跟着一个key
属性时,都会使用createElement
导入,如下所示:
return
以下是将JSX
导入源设置为preact
的示例:
esbuild app.jsx --jsx-import-source=preact --jsx=automatic
或者,如果您使用的是TypeScript
,您可以通过将其添加到tsconfig.json
文件中来配置TypeScript
的JSX
导入源,并且esbuild
能自动获取它,而无需进行配置:
{
"compilerOptions": {
"jsx": "react-jsx",
"jsxImportSource": "preact"
}
}
如果您想在单独的每个文件控制此设置,您可以在每个文件中使用// @jsxImportSource your-pkg
注释。如果还没有通过其他方式设置JSX
转换,或者希望按文件设置,那么您可能还需要添加// @jsxRuntime automatic
注释。
Supported by: Build and Transform
默认情况下,esbuild
假设JSX
表达式是无副作用的,这意味着它们用/*@__PURE__*/
注释进行注释,并且在打包过程中未使用时会被删除。这遵循了JSX
对虚拟DOM
的常见使用,并适用于绝大多数JSX库。然而,有些人编写的JSX
库不具有此属性(特别是JSX
表达式可能具有任意的副作用,并且在未使用时无法删除)。如果您正在使用这样的库,您可以使用此设置来告诉esbuild
某些JSX
表达式有副作用:
esbuild app.jsx --jsx-side-effects
笔者根据esbuild
文档搭建了一套简洁的ts
开发脚手架工程,编译速度非常快!脚手架还整合了eslint
,另一篇文章还附带了调试教程,需要的朋友看这里:esbuild配合vscode搭建的ts开发环境,这编译速度,真香
另外,esbuild中文文档专栏,本人目前正在翻译整理,关注我,有最新的翻译文档会第一时间通知你!
(本文完)
励志前端小黑哥,全网唯一账号!
关注我,带你了解更多前端知识!