3

新工具 - Bun

 1 year ago
source link: https://jelly.jd.com/article/63422da03ff25d005b956af4
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
近期新出来的轮子Bun热度很高,刚开源不到一个月就获得了 19.5k star!Node.js 和 Deno 有又一大竞争对手了!前端已经拥有成熟的生态,那Bun有啥能吸引大家的呢?它的优势是什么?它的出现能解决什么问题呢?

什么是Bun?

官网是这么介绍的:"Bun is a fast all-in-one JavaScript runtime"。它集 Bundle, transpile, install and run JavaScript & TypeScript 于一身的全能 runtime,内置数百个 Node.js API 和 Web API。这就意味着可以直接在 Bun 上运行的大部分 Node API 和 Web API, 还可以在不需要使用 Webpack、Rollup、esbuild、babel 等工具直接运行 TypeScript 、JSX 了。而且官网展示与node 和 deno的性能对比提升了2倍左右。
Bun 主打 3 个方面:1. 迅速启动;2. 从底层提高性能水平;3. 提供丰富且完整的工具链;

为什么Bun性能好?

在 serve(服务端渲染:每秒处理 HTTP 请求数)、sqlite(加载一个巨大的 sqlite 表:每秒平均查询次数)、ffi (FFI:每秒操作数 )三个方面与 Node.js 和 Deno 的性能对比如下:

11d36b920f7b79f2.png

Bun的性能表现都比较好,官网给出的原因是:

  • 不同于 Node.js 和 Deno 使用的是 V8 引擎,Bun 使用了 JavaScriptCore 引擎,而 JavaScriptCore 启动和执行比 V8 更快;
  • 使用了新兴的系统编程语言 Zig,Bun 的创建者说 Zig 缺少隐藏的控制流使得编写快速软件变得更加简单。Zig 能手动管理内存,这是它成为高性能语言的基础之一。另一个亮点是『编译期函数 compile-time function』,有点元编程的意思,比如 ORM 的表值映射可以通过编译期函数直接生成目标代码。

科普:Zig 是一门新的系统级编程语言,相当于加强版 C 语言。Node (C++),Deno (Rust) 和 Bun (Zig) 各用各的。

有哪些能力?

  • 包管理器:在Linux上,bun install安装软件包的速度往往比npm安装快20倍到100倍,在mac上快4倍到80倍。
    bun install
    bun remove react
    bun add react
    11d36b920f7b79f2.png
  • 将bun用作任务运行器,启动一个任务npm需要170ms而bun只需要6ms. 在package.json中增加一个命令:
    # Instead of "npm run clean"
    bun run clean
    {
      "name": "myapp",
      "scripts": {
        "clean": "rm -rf dist out node_modules"
      }
    }
  • 在Next.js中使用Bun
    bun create next ./app
    cd app
    bun dev # start dev server
  • 在React中使用Bun
    bun create react ./app
    cd app
    bun dev # start dev server
  • 在单页应用程序中使用bun
    bun bun ./entry-point-1.js ./entry-point-2.jsx
  • 使用TypeScript
    bun add -d bun-types
    // tsconfig.json
    {
    "compilerOptions": {
      "types": ["bun-types"]
    }
    }
  • Web API:对 fetch、WebSocket、 ReadableStream 等 API 都提供了内置支持
  • Node.js 模块:Bun 实现了 Node.js 的模块解析算法,同时支持 ESM 和 CommonJS,但 Bun 内部使用 ESM。
  • 支持转译大量文件类型,你可以直接运行 TypeScript、JSX,甚至支持各种 tsconfig.json 中的配置。
    11d36b920f7b79f2.png
  • Bun.write 使用最快的系统调用,实现写入、复制、管道、发送和克隆文件。
  • 自动加载环境变量 .env 文件,不需要再 require("dotenv").load()
  • 附带一个内置的快速 SQLite3 客户端 bun:sqlite
  • Bun.js 实现了大部分 Node-API (N-API),大部分 Node.js 原生模块都可以正常工作。
  • Bun:ffi 可以使用低成本的外部函数接口从 JavaScript 调用本机代码(据测试比 napi 快 5 倍 、比 Deno 快 100 倍)
    11d36b920f7b79f2.png
  • 原生支持不断增长的 Node.js 核心模块列表以及全局变量,例如 Buffer 和 process。
curl https://bun.sh/install | bash

Bun 的 HTTP 服务器基于 Request 和 Response 等 Web 标准构建:

// http.js
export default {
  port: 3008,
  fetch(request) {
     return new Response('Welcome to Bun!')
  }
}

用 bun 运行它:

bun run http.js

然后在浏览器中打开 http://localhost:3000

开发健康度&社区

到今天(2022/10/9)为止,Bun 有 140+ contributors,star数为34.8k, github 提交频率高,达到3833 commits, 几乎每天都有 commit,目前有 342+ open issue 和 43+ pending pr,而且很多 issue 都是最近几天甚至几小时提的,可以看出是有不少人在尝鲜的,活跃度还不错。从 open issue 大概看看,主要的 bug 有这几种:

  • seg fault、illegal instruction 这类 runtime 问题,并不太确定是 Bun 还是 ZIG 的问题
  • 使用 Bun 标准库,如 fetch、HTTP、SQLite 等出现的问题
  • 引用 nodejs 库遇到的问题。

Bun的代码是作者Jarred Sumner,90% 的代码是他贡献的,战斗力极强

11d36b920f7b79f2.png

大多数观察者都认为 Bun 在性能方面值得关注。目前Bun还处于早期阶段,期待它能开启一个新的runtime时代。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK