什么是esbuild?
目录
你可能已经听说过esbuild了——但它到底是什么呢?
作为一名使用 esbuild 数月之久的开发者,我可以负责任地说,esbuild 是一项令人兴奋的新技术。正如esbuild 的创建者、Figma 的联合创始人Evan W.所描述的那样, esbuild 是一个 Web 链接器。但这究竟意味着什么?你又为何应该关注它呢?
JavaScript 有一个不为人知的秘密,那就是如果没有工具,你基本上无法将 JavaScript 部署到 Web 上。这是为什么呢?
JavaScript 的不可告人的秘密
JavaScript 是一种解释型语言。与 C、C++ 和 Go 等系统语言不同,JavaScript 不会像机器语言那样被“编译”成机器代码。相反,JavaScript 在运行时以纯文本形式执行,这也使得 JavaScript 极易出错。
编译器的优势通常在于:a) 在编译时执行静态类型检查;b) 编译成一个二进制文件,或者每个操作系统编译成一个二进制文件。这种方式简洁优雅,易于理解,但可能也增加了运行时错误调试的难度。
但 JavaScript 的工作方式并非如此。正如大多数人所知,当你“部署 JavaScript”时,通常指的是通过 `<script>` 标签链接纯文本 JavaScript 文件<script>。对于一次性脚本来说,这当然没问题,但如果有很多文件或依赖项呢?
ES模块
如今,你可以使用一种叫做ES 模块的技术,它可以让浏览器负责 JavaScript 依赖项之间的链接。ES 模块其实就是 JavaScript 模块,你可以把 JavaScript 模块理解为浏览器在运行时执行并动态链接的“可重用的 JavaScript 单元”。这里的区别在于我们使用 `<module>` 标签<script type="module">而不是 `<script>` 标签<script>。这比 `<script>` 标签有所改进,<script>但远未完善。
尽管 ES 模块非常方便,但通常仍不被生产环境所青睐,原因在于它们有意将 JavaScript 依赖项的解析延迟到运行时。如果我们能够预先完成这项工作,就能获得更好的性能提升和向后兼容性,但这会带来更高的复杂性和学习成本。
这就是链接器如此重要的原因。链接器是一类工具,它可以帮你“链接”代码,让你专注于真正关心的事情。如果没有链接器,你就需要自己完成所有代码拼接工作,才能保证你的浏览器以及用户的浏览器都能理解。但我们还可以做得更好!我们可以使用webpack、Rollup、Parcel或esbuild等工具,在构建时自动解析依赖关系。
那么为什么要重点介绍 esbuild 呢?esbuild 有什么新的或不同之处?
介绍 esbuild
esbuild 是一个命令行工具、NPM 包和Go 模块,它让 JavaScript 代码打包变得轻松快捷。它由Evan W.开发,使用 Go 和 JavaScript/TypeScript 实现。esbuild 于 2020 年初首次发布,截至 2021 年初,版本已更新至 0.9.x。
esbuild 拥有详尽的文档、易于发现的命令行界面,而且速度极快。但 esbuild 的真正优势在于它能够很好地解决定义明确、受限的问题。
那么,esbuild 可以用来做什么呢?
你可以使用 esbuild 快速链接 JavaScript(.js js、jsx.js ts、.js 和tsx.js)和 CSS 依赖项,将它们作为可部署的 Web 资源。你还可以使用打包、代码分割、插件等功能来实现这一点。对我个人而言,esbuild 之所以如此实用,是因为它实现了增量编译、监视模式和服务模式。
这里面有很多内容需要解释。我现在逐点阐述:
捆绑销售
您可以将 JavaScript 和 CSS 源代码打包或拆分。
- 当您只想部署单个
app.js目标时,可以使用捆绑部署。 - 代码分割适用于将代码分割
app.js成多个目标的情况,例如Sidebar.js`<object>`Header.js、`<object>` 等。请注意,这假设支持 ES 模块。
插件
插件 API 允许您在文件链接时对其进行预处理。如果您想将 Markdown 转换为 HTML 或 JSX,将 Sass 转换为 CSS 等,这将非常有用。插件 API 将这些实现细节留给您自行处理。
请查看社区代码库以获取插件创意。
增量编译
增量编译意味着,如果您需要重复编译同一个文件(例如,当源代码发生变化时),您可以这样做而不会造成性能损失。这是因为 esbuild 只对已更改的源代码执行操作,而不是每次都从头开始打包或代码分割。
观看模式
监视模式意味着 esbuild 可以实时“捕获”源代码的更改。这意味着您无需担心文件监视程序或像nodemon或chokidar这样的库;您可以将这项工作交给 esbuild,甚至可以实现自己的监视处理程序,以便观察事件、记录事件、推送服务器发送的事件或WebSocket等。
服务模式
服务模式意味着您可以将 esbuild 用作 Web 服务器,并实现您自己的服务处理程序来处理传入的请求,以便观察事件、记录日志等等。esbuild 实际上从内存而不是磁盘提供您打包或代码分割后的目标。这使得 esbuild 成为一个性能极佳的 Web 服务器,因为它减少了每个请求所需的总工作量。
注意事项
现在,我们来谈谈需要注意的地方。😱
esbuild 是 1.0 版本之前的软件,功能尚未完全实现。
- 我的经验表明,这无需担忧。开发者非常清楚哪些地方需要改动、为什么需要改动,并且会仔细记录每一次重要的改动,即使是尚未发布的改动。
esbuild 不执行静态类型检查。
- 这算不上什么注意事项,因为 esbuild 是一个打包工具,而不是传统意义上的编译器,但如果你很看重静态类型检查,你完全可以把它集成
flow到tsc你的构建流程中。(我没有这样做,因为我只依赖 VS Code 进行类型检查。) - 值得一提的是,esbuild 会记录错误、警告和提示,这可以帮助您捕获一些错误,但这些通常是语法错误。
esbuild 基本上是一个人单枪匹马运营的项目。
- 这既可以被视为优势,也可以被视为劣势,但我认为这是一种优势,因为esbuild这项技术非常专注。它并不试图解决所有问题,而是专注于大多数前端开发人员已经或将会遇到的、定义明确且受限的问题领域。
- 如果你查看一下问题列表,你会发现几乎所有问题都已由社区成员或开发者 Evan 解决。开发速度相当快,通常每周都会发布一到两次小版本更新。
esbuild 与 Babel 生态系统有些格格不入。
- Babel 通过让开发者能够编写面向未来的代码,帮助 JavaScript 实现了现代化,这在 JavaScript 性能不足的时期尤为必要。但如今的 JavaScript 比以往的 JavaScript 强大得多,也更具表现力,所以我个人并不认为这是一个需要注意的问题。
- 虽然你可能需要 Babel 来使用最新最强大的 CSS-in-JS 库,但我相信你仍然可以以插件的形式实现任何其他所需的工具。如果确实不需要插件,这或许就是不建议使用 esbuild 的原因之一。
esbuild 支持很多很多选项。
- 主要的 API 大致只有
transform`buildget_serve... - 请注意,esbuild 的 CLI 日志记录器非常有用。仅靠实验就能取得很大进展。该日志记录器能够清晰地告知何时需要启用某个选项以及原因。
esbuild 并非为 HMR 设计。
- HMR 代表热模块替换,这意味着状态更改会在浏览器刷新之间保留。如果您已经习惯了 HMR,那么这可能会让您难以接受。
- 就我个人而言,我不太喜欢HMR,因为它让状态的推理变得更加晦涩难懂。话虽如此,使用服务器发送事件或WebSocket实现快速刷新,并配合自定义的监听模式处理程序,却非常简单有趣。
esbuild 并不一定“适合所有人”。
- 如果你读到这里,那么尝试一下 esbuild 可能很适合你。😉 话虽如此,即使你对 esbuild 不感兴趣,你也可能已经间接地使用过它,或者将来会用到。为什么呢?因为 esbuild 已经为Snowpack、Vite、SvelteKit、Remix Run等工具提供支持。现在,成百上千种工具已经或即将把 esbuild 集成到它们的构建流程中。凛冬将至。
结论
esbuild 是那种值得您投入时间和精力的稀有技术之一。它正在帮助我们重塑行业格局,我非常兴奋地投资于它。它与其他工具截然不同,而且必将长期存在。
链接:
文章来源:https://dev.to/zaydek/what-is-esbuild-2ofc