写点什么

Bun 原生 JavaScript 打包器登场,引入宏

作者:Agazi Mekonnen

  • 2023-07-31
    北京
  • 本文字数:1689 字

    阅读完需:约 6 分钟

Bun原生JavaScript打包器登场,引入宏

最近,Bun 推出了它的快速原生JavaScript打包器,为 Bun 生态系统带来了增强的打包能力。这个新的打包器现在处于测试阶段,提供了一整套功能和工具,简化并加速了构建前端应用程序的过程。此外,Bun 还引入了JavaScript宏,可以在打包时执行 JavaScript 函数,并将其结果直接内联到打包文件中。

 

Bun 是一个用于 JavaScript 和 TypeScript 应用程序的一体化工具包,旨在取代 Node.js。它包含了一个运行快速的 JavaScript 运行时——Bun 运行时,提供了优秀的启动速度和内存使用效率。该工具包作为“bun”可执行文件发布,提供了各种功能,如测试运行器、脚本运行器和包管理器。

 

原生的 Bun 打包器试图简化复杂的 JavaScript 和 TypeScript 打包所面临的挑战,如运行 TypeScript 文件、为生产环境构建和打包代码、处理依赖关系以及启用类似于源映射这样的功能,这些任务通常比较耗时,阻碍了开发速度和效率的提升。

 

打包器提供了几个关键特性。首先,它通过轻量级 Bun 进程快速执行插件,从而缩短打包时间。此外,打包器生成针对 Bun 运行时优化的预编译文件,消除冗余的转换步骤并提高整体执行性能。统一插件 API 允许插件扩展打包器和 Bun 的运行时能力,并提升灵活性和代码重用性。此外,集成打包器和运行时可以无缝传递BuildArtifact对象,可以直接在 HTTP API(如 new Response())中使用。打包器还引入了独立可执行文件生成,允许创建包含 Bun 运行时副本的自包含可执行文件。

 

性能是 Bun 打包器的一个主要关注点。Bun 与 esbuild、Parcel 2、Rollup + Terser 和 Webpack 等流行的打包器的基准比较测试表明,Bun 在速度方面表现出色。Bun 优于这些打包器,其速度提升令人印象深刻,从 1.75 倍到 220 倍不等(根据具体的基准测试而言)。

 

开发人员可以使用 Bun.build()函数或 Bun 的 build CLI 命令轻松构建前端应用程序。API 支持入口点、输出目录、目标(浏览器、Bun 或 node)、格式(esm)、缩小、源映射配置等基本选项。此外,打包器支持摇树优化,以移除无用的代码。开发人员可以借助稳定的插件系统和加载器配置根据自己的具体需求定制打包过程。

 

除了打包器之外,Bun 还引入了 Bun 宏,可以在打包时执行 JavaScript 函数。开发人员可以使用特殊的导入属性语法将函数作为宏导入,将其结果直接内联到打包文件中。宏在打包过程的转换器阶段同步执行,并在多个 JavaScript Worker 之间并行化,确保高效执行。宏有助于在打包时执行获取请求等操作或提升开发者灵活性。

 

出于安全考虑,必须使用{ type: 'macro' }属性显式导入 Bun 宏,确保是有意执行宏,以此来降低潜在的安全风险。也可以使用--no-macros 标志禁用宏,通过完全阻止宏的执行来增加额外的安全层。此外,为了防范恶意包,不能从 node_modules 目录调用宏。这个限制确保宏只在应用程序代码中运行,试图从 node_modules 调用宏将触发特定的错误消息。

 

虽然 Bun 宏提供了增强的代码执行能力,但也存在一些限制。宏的结果必须是可序列化的,以便无缝内联到抽象语法树(AST)中。与 JSON 兼容的数据结构可以全面被支持,但函数和大多数类的实例是不可序列化的。宏只接受在打包时静态、已知的值作为输入。动态值或依赖于运行时条件的值不允许作为宏输入。

 

开发者社区对 Bun 宏存在不同的看法。一位名为 explaininjs 的用户在Hacker News上评论道:

 

“非常好。这应该能够帮助我消除大量笨拙的 webpack/esbuild/etc 垃圾。”

 

另一位用户 skybrian 也表示支持:

 

“我喜欢它不允许在 npm 模块中使用。模块作者可以在他们自己的构建过程中进行任意编译时代码生成。”

 

然而,开源贡献者 goranmoomin 也表达了不同的观点:

 

“宏应该能够对代码执行语法转换。Lisp 因其可以将代码表示为 List 而闻名于世。Rust 的编译器级 API 可以接受节点(token)并运行任意代码,然后吐出新的节点(token)。”

 

Oven(Bun 背后的公司)首席执行官 Jarred Sumner 接受了这些反馈,并提出重新审视宏设计的计划。

 

原文链接

https://www.infoq.com/news/2023/07/bun-native-bundler-macros/

 

相关阅读:

Bun 会是 Webpack 之后的下一件大事吗?

比 Node.js 快三倍,新 JavaScript 运行时 Bun 火了

亲身试用新 JS 运行时 Bun 后,我觉得未来可期

疑为针对最近大火的“Bun”

2023-07-31 09:362359

评论

发布
暂无评论
发现更多内容

InPlant SCADA笔记 数据库中本地节点创建modbus tcp驱动

万里无云万里天

Modbus Tcp 工厂运维 InPlant SCADA

大模型数据分析平台 LangSmith 介绍

心有千千结

LLM #LangChain

霍尼韦尔:AI在工业领域的应用方兴未艾 不断发现新的应用场景

财见

Linux Squashfs只读文件系统介绍

不在线第一只蜗牛

数据库 Linux

创新管理解决方案:超越Redmine的工具

爱吃小舅的鱼

项目管理

InPlant SCADA笔记 配方功能

万里无云万里天

工厂运维 InPlant SCADA

利用爬虫工具爬取网站结构能力

测吧(北京)科技有限公司

测试

使用 OWASP ZAP 进行安全测试

测吧(北京)科技有限公司

测试

使用 Burp Suite 进行渗透测试

测吧(北京)科技有限公司

测试

管理项目需求:7款工具助力高效运营

爱吃小舅的鱼

需求管理 软件需求管理 需求管理工具

Gather 全球化进程迅速 多重利好推动未来发展

股市老人

InPlant SCADA笔记 事件配置

万里无云万里天

工厂运维 InPlant SCADA

InPlant SCADA笔记 数据库管理中位号的批量导出

万里无云万里天

工厂运维 InPlant SCADA

在已有的流程平台中调用 Jenkins 并获取数据

测吧(北京)科技有限公司

测试

CorelDraw绘制线条工具有哪些 CorelDraw绘制圆角矩形的方法

阿拉灯神丁

学习资料 CorelDraw 矢量图形设计软件 cdr2024安装教程 好用的平面设计软件

InPlant SCADA笔记 数据库中使用modbustcp在线调试来读取modsim32中的值

万里无云万里天

Modbus Tcp 工厂运维 InPlant SCADA modsim32

需求管理:2024年10大最佳工具盘点

爱吃小舅的鱼

需求管理 需求管理工具

7个使用大语言模型的最佳情绪分析 API

幂简集成

情绪 API

Cloudera调查:近90%的企业使用人工智能,但过时的基础设施和员工技能差距阻碍了其充分发挥效益

财见

IBM 发布《2024年数据泄露成本报告》:企业数据泄露成本创新高,AI和自动化成为"数据保卫战"突破口

财见

InPlant SCADA笔记 使用位号分组来管理位号

万里无云万里天

工厂运维 InPlant SCADA

缓存穿透下的测试方法

测吧(北京)科技有限公司

测试

顶级待办事项工具:哪个适合你的桌面?

爱吃小舅的鱼

待办事项 待办事项管理

InPlant SCADA笔记 数据标签控件

万里无云万里天

工厂运维 InPlant SCADA

Apache RocketMQ 中文社区全新升级!

Apache RocketMQ

Apache RocketMQ 基础软件 中间件 消息队列

Apache IoTDB 论文入选数据库国际顶会 ICDE 2024

Apache IoTDB

【Yarn】Timeline Server UI应用记录名称为null

扬_帆_起_航

最佳待办事项App对比:哪款最适合你?

爱吃小舅的鱼

待办事项

Cyble被Frost & Sullivan评为全球网络威胁情报市场的创新领导者

财见

InPlant SCADA笔记 历史趋势

万里无云万里天

工厂运维 InPlant SCADA

常见数据结构与代码实现方案

测吧(北京)科技有限公司

测试

Bun原生JavaScript打包器登场,引入宏_跨端开发_InfoQ精选文章