写点什么

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

评论

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

Hoo虎符研究院 |ETH2.0合并在即 速来围观流动性质押赛道的潜力项目

区块链前沿News

eth 虎符 Hoo 虎符交易所

2022鲲鹏开发者创享日即将扬帆起航 与开发者共创未来共享非凡成就

科技热闻

App怎么做灰度发布?

InfoQ IT百科

一文详解:企业数字化的未来基石——微服务

穿过生命散发芬芳

微服务 4月月更

阿里云 云效一站式研发平台

阿里云云效

阿里云 DevOps 云原生 研发 一站式研发平台

怎么做SEO网站优化?

InfoQ IT百科

不care工具,在大数据平台中Hive能自动处理SQL

华为云开发者联盟

sql 大数据 mapreduce hive 数据分析

如何提升研发效能实现 10 倍研发效能提升

阿里云云效

云计算 阿里云 云原生 研发效能 研发

TASKCTL 容器签出失败解决方法

敏捷调度TASKCTL

大数据 DevOps 分布式 ETL 自动化运维

App分发是什么意思?

InfoQ IT百科

如何优雅高效地管理公司文档?

小炮

文档 文档管理

有哪些适合程序员用的笔记应用?

InfoQ IT百科

IM开发技术分享:浅谈IM系统中离线消息、历史消息的最佳实践

JackJiang

网络编程 TCP协议 即时通讯IM im开发

容器化应用:我们都经历了什么

Rayzh

Docker Kubernetes 云原生 Cloud Native

GPU市场规模和各子市场趋势分析

Finovy Cloud

人工智能 gpu

百尺竿头更进一步 – Amazon Aurora 的读写能力扩展之 ShardingSphere-Proxy 篇

亚马逊云科技 (Amazon Web Services)

Tech 专栏

Carina 的根基与诞生背景|深入了解 Carina 系列 第一期

BoCloud博云

开源 本地存储

数据连接一切,开启融合数据云新时代——星环科技春季新品发布周盛大开启

星环科技

Docker 实战教程之从入门到提高 (八)

汪子熙

Docker 容器 docker image 容器镜像 4月月更

Java篇-序列化与反序列化

是老郭啊

Java 对象 序列化 反序列化

怎么做App分发?

InfoQ IT百科

TASKCTL 作业流程无触发设计

敏捷调度TASKCTL

大数据 DevOps 分布式 自动化部署 ETL任务

怎么让网站在搜索结果中排更前?

InfoQ IT百科

毕设:设计电商秒杀系统

王大胖

从杀慢查询入手来预防 MySQL 雪崩的办法

Qunar技术沙龙

dba

移动App的设计流程是怎样的?

InfoQ IT百科

Android C++系列:C++最佳实践5 const

轻口味

c++ android ndk jni 4月月更

Carina 本地存储入选 CNCF 云原生全景图

BoCloud博云

开源 cncf 本地存储

深入JVM内置锁 synchronized 底层

janyxe

JVM synchronized synchronized锁升级过程

【MARS TALK 05】今日头条 App 基于火山引擎MARS研发流程最佳实践

字节跳动终端技术

android 今日头条 字节跳动 研发

App能收集哪些个人信息?

InfoQ IT百科

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