写点什么

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:362327

评论

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

基于LSTM模型的共享自行车需求预测

Peter

Python 机器学习 深度学习 算法

Numpy可视化绘图

Peter

机器学习 数据分析 Numpy

模块七作业

黄秀明

「架构实战营」

聊聊 Pulsar: 在 Linux 环境上搭建 Pulsar

老周聊架构

云原生 Apache Pulsar 2月月更

架构实战营 第 4 期 模块七作业

架构实战营 模块七 王者荣耀 「架构实战营」

哪个低代码平台上手度对小白更友好?专业测评来了!

优秀

低代码 应用开发

《MySQL入门很轻松》第5章:数据完整性及其分类

乌龟哥哥

数据库 2月月更

WebRTC 服务器架构 | 社区征文

liuzhen007

音视频 新春征文 2月月更

裸辞全职开源的监控告警项目

TanCloud探云

开源 云服务 监控系统 监控告警

基于随机森林模型的心脏病人预测分类

Peter

Python 机器学习 算法

机器学习入门知识

Peter

Python 机器学习 算法 监督学习

【行业云说直播间】就在明天下午!聚焦园区数智化转型

云计算运维

大数据培训:Flink窗口的开始时间的计算

@零度

flink 大数据开发

产品经理沟通技巧

史前靓仔

职场 产品经理 沟通技巧

musl堆利用技巧,你知道多少

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

用命令行做数据科学(上)

Render

Nacos中服务删除不了,怎么办?

王磊

springcloudAlibaba

再见收费的Navicat!操作所有数据库就靠它了!

沉默王二

Java

尚硅谷Kafka新版视频教程发布

@零度

大数据开发 kafka 3.X

AngularJS + Ionic 开发移动端 Hybrid 项目实战总结| 社区征文

No Silver Bullet

angular.js 经验分享 Ionic 新春征文 2月月更

模块七

撿破爛ぃ

架构训练营

从线程与进程的区别这一问题出发

宇宙之一粟

操作系统 2月月更

Linux系统编程-进程间通信(管道)

DS小龙哥

2月月更

图解Numpy教程

Peter

Python 机器学习 Numpy

机器学习神器Scikit-Learn入门

Peter

数据挖掘 机器学习 算法

剑指offer笔试题 · 常量字符串

安然无虞

C语言

王者荣耀异地多活架构设计

AUV

「架构实战营」

web技术分享| WebRTC记录音视频流

anyRTC开发者

前端 音视频 WebRTC web技术 实时通讯

从冬奥看中国科技(四):“一鱼多吃”的5G

脑极体

实力与颜值并存 —— Apache Pulsar PMC 成员刘昱专访

Apache Pulsar

开源 云原生 Apache Pulsar 社区

MySQL RR级别的实现

JavaEdge

2月月更

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