2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

评论

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

认知负担的挑战与平台工程的机遇

SEAL安全

DevOps 平台工程 认知负担

HDC开发者盛典 | 破解创业老板高效制果汁奥秘挑战!赢取代金券、按摩枕、收纳袋等礼品~

云计算 软件开发 华为云 华为开发者大会2023

不能不知道的LED显示屏产业机遇

Dylan

机遇 产业 LED显示屏 led显示屏厂家

语音直播源码知识分享:探索新的沟通方式

山东布谷科技

软件开发 语音 源码搭建 直播源码 语音直播源码

华为云CodeArts IDE Online:让你随时随地畅享云端编码乐趣

云计算 软件开发 华为云 华为开发者大会2023

PoseiSwap 治理通证POSE登录PancakeSwap,开盘涨幅超2100%

西柚子

软件测试/测试开发丨Selenium的常用元素定位方法

测试人

Python 软件测试 自动化测试 测试开发 selenium

GPU 容器虚拟化新能力发布和全场景实践

Baidu AICLOUD

GPU容器虚拟化

聆心智能上榜“北京市通用人工智能大模型行业应用典型场景案例”

硬科技星球

prometheus描点原理

蓝胖子的编程梦

Docker 云原生 Grafana Prometheus #k8s

2023年CCF-百度松果基金课题申报持续进行中,截至7月24日

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨 百度飞桨

在 7 月 4 日,PoseiSwap 治理通证 $POSE 上线了 BNB Chain 上的头部

鳄鱼视界

ABAQUS有限元分析软件吃CPU还是GPU比较多?

思茂信息

gpu cpu 显卡 ANAQUS 有限元分析

推荐书单:个人成长的一些方法

老张

个人成长 书单

MySQL的match函数在sp中使用的BUG解析

GreatSQL

数据库 greatsql

“多”维演进:智能编码的深度进化

阿里云CloudImagine

云计算 编码 视频编码 视频云

如何用 TDengine 预测 “未来”

爱倒腾的程序员

涛思数据 tdengine 时序数据库

利用小程序技术,构建数字警务体系

没有用户名丶

关于Java已死,看看国外开发者怎么说的

越长大越悲伤

Java 后端

5G与妈祖守护的那片海

白洞计划

5G

架构课模块一作业

庚小庚

MatrixOne 0.8.0 开放公测啦!

MatrixOrigin

云原生 超融合 #数据库 MatrixOne

图+AI 生成未来|悦数图数据库亮相 2023 世界人工智能大会

悦数图数据库

AI 图数据库 大模型 AIGC

了解Java可见性的本质

阿里技术

Java java 编程

玩转“擎舵”,秒变AIGC时代营销创意“掌舵人”

极客天地

​山东大学高校专区入驻飞桨AI Studio,优质教育资源等你来学!

飞桨PaddlePaddle

人工智能 百度 paddle 百度飞桨

研发质量指标大 PK:MTTR vs MTBF,谁是靠谱王?

LigaAI

高可用性 研发效能度量 MTTR 研发效能管理 企业号 7 月 PK 榜

ElasticSearch - 批量更新bulk死锁问题排查 | 京东云技术团队

京东科技开发者

elasticsearch MQ 企业号 7 月 PK 榜 BulkProcessor

火山引擎DataLeap数据质量解决方案和最佳实践(三):最佳实践

字节跳动数据平台

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