前言

可能有同学(wo)内心暗想:不是吧!阿sir,vue3、vite、前端工程化、前端可视化、前端框架已经把自己折磨的够呛了,怎么现在又来了个 Bun;

真是楚汉争霸之路尚未结束,三足鼎立之势怎能来临!

话虽如此,但是身为一名合(mo)格(yu)的前端 er,只能边含泪边诉苦了;

顺便说说 Bun 最近有多火:短短几天 star 数量就从 2k 涨到了现在(2022-07-14)的 24.7k;

长话短说,下面开始我们直接带走他 ~

什么是 Bun

Bun (读音类似于[bʌn],包子的意思) 是一个像 Node 或 Deno 这样的现代 JavaScript 运行时;

通俗一点讲就是你可以在 Bun 上运行 JavaScript 代码,你是不是在想这不是跟 Node 和 Deno 一样的吗,这也能火?

别急嘛,咱们往后看;

all-in-one

官方还称其为: all-in-one JavaScript runtime;

所谓 all in one,是因为 Bun 和传统的 Node.js 这种传统的 javaScript 运行时 不同; Bun 提供了 打包、转译、安装和运行 JavaScript & TypeScript 项目的功能,内置原生打包器 (native bundler)、转译器、task runner、npm 客户端,以及数百个 Node.js API 和 Web API,包括约 90% 的 Node-API 函数(本机模块)、fs、path、Buffer 等。

这就意味着你可以实现在 Bun 上运行的大部分 Node API 和 Web API, 还可以在不需要使用 Webpack、Rollup、esbuild、babel 等工具的前提下直接运行 TypeScript 、JSX 了;

乍一看,是不是瞬间档次高了许多?

但是这样还不足以让你在同事、面试官的跟前吹 🐂 🍺

各位看官,您继续往下看…

为什么用 Bun

性能测试结果

服务器端渲染 React:每秒的 HTTP 请求数

加载一个大型数据表:每秒平均查询次数

FFI:每秒操作数

根据上面 服务器端渲染、加载大型数据表、FFI 三个方面来对比,可见 Bun 可以说在性能方面是吊打 Node.js 和 Deno;

为什么快

  • 引擎差异

不同于 Node.js 和 Deno,Bun 并没有基于 V8 引擎,而是使用了 JavaScriptCore 引擎,它的执行速度往往要比 V8 等更传统引擎要快。

  • 语言差异

Bun.js使用的是新兴的系统编程语言 ZIG 编写的,主要通过手动内存管理对内存进行更细粒度的控制、无隐藏的控制流来提升程序的性能;

  • 从零开始

在上两点的前提下,Bun.js 的大部分内容都是完全从零开始编写的,包括 JSX/TypeScript 转译器、npm 客户端、打包器、SQLite 客户端、HTTP 客户端、WebSocket 客户端等等。

注意:Zig 是一门系统级编程语言,专为稳定性、可维护性和性能而设计,是追求替代 C 语言在系统编程上的最佳地位。

内置兼容性

Web API 支持:对 fetch、WebSocket、 ReadableStream 等 API 都提供了内置支持;

Node.js模块:Bun 实现了 Node.js 的模块解析算法,,以便我们可以在 Bun 中使用 npm 包,同时支持 ESM 和 CommonJS,但 Bun 内部使用 ESM;

  • Bun.js 实现了大部分 Node-API (N-API),大部分 Node.js 原生模块及全局变量(比如Buffer 和 process)都可以正常工作;
  • 自动加载环境变量 .env 文件,不需要再 require("dotenv").load();
  • 附带一个内置的快速 SQLite3 户端 bun:sqlite;

内置 JavaScript、TypeScript、JSX 等(见下表)各种转译器;

Input Loader Output
.js JSX JavaScript .js
.jsx JSX JavaScript .js
.ts TypeScript JavaScript .js
.tsx TypeScript JSX JavaScript .js
.mjs JavaScript .js
.cjs JavaScript .js
.mts TypeScript .js
.cts TypeScript .js
.toml TOML .js
.css CSS .css
.env Env N/A
.* file string

通过上述大家能发现,Bun 的目标是想在浏览器之外运行 JavaScript,为我们的基础架构带来性能和复杂性的增强,并通过更好、更简单的工具提高开发人员的生产力。

快速上手

Mac/Linux 上安装

安装

 curl https://bun.sh/install | bash

新建 http.js

 export default {
   port: 3000,
   fetch(request) {
     return new Response('Welcome to Bun!');
   },
 };

运行

 bun run http.js

浏览器中打开:http://localhost:3000 即可

注意:如果使用 Linux,强烈推荐内核版本 5.6 或更高版本,但最低为 5.1.

windows上安装

由于 Bun 对 windows 用户不太友好,安装起来并不容易,如果您真的想在windows 上安装,可以看看如何在windows 上安装 Bun 这篇文章去进行安装;

Bun 的常见功能使用

1. 当做包管理器使用

通过 package.json 安装依赖

 bun install

新增或删除 package.json 中的某个安装包

 # 删除
 bun remove react
 # 安装
 bun add preact

根据测试,在 Linux 上 bun install 运行安装包速度往往比 npm install 运行脚本快 20 - 100 倍。

2. 直接运行scripts脚本

用 bun run 来代替 npm run

 # Instead of "npm run clean"
 bun run clean
 # This also works
 bun clean

运行 package.json 中的脚本

  # package.json 
  {
    "name": "myapp",
    "scripts": {
      "clean": "rm -rf dist out node_modules"
    }
  }
  ​
  # 在终端中运行以下命令
  bun run clean

根据测试,bun 运行 package.json 脚本比 npm 运行 package.json 脚本快 30 倍。

3. 快速创建 Next.js 项目

快速创建

 # 创建
 bun create next ./app
 # 运行
 cd app
 bun dev # start dev server

关联一个已经存在的 Next.js 应用

 bun add bun-framework-next
 echo "framework = 'next'" > bunfig.toml
 bun bun # bundle dependencies
 bun dev # start dev server

注意:Next.js 的需多功能都支持,但是也有小部分暂时不支持,所以生成环境使用需谨慎。

4. 快速创建 React 项目

快速创建

 bun create react ./app
 cd app
 bun dev # start dev server

关联现有的React项目

 # To enable React Fast Refresh, ensure it is installed
 bun add -d react-refresh
 # Generate a bundle for your entry point(s)
 bun bun ./src/index.js # jsx, tsx, ts also work. can be multiple files
 # Start the dev server
 bun dev

5. 运行 TypeScript

在 Bun 中,天然支持运行运行 TypeScript,无需配置,无需额外安装;

如果你导入一个.tsor.tsx文件,bun 会将它转换成 JavaScript;bun 还编译node_modules中的.ts或.tsx文件;这是由 bun 内置了 TypeScript 转译器,且速度很快。

如果你想在全局使用对应的 API,安装 bun-typs 到你的项目即可

 # 安装
 bun add -d bun-types
 # 在tsconfig.json中使用
 {
   "compilerOptions": {
     "types": ["bun-types"]
   }
 }

6. 常用命令

  • bun add:等同于 yarn add 或 npm install
  • bun install:等同于 yarn install 或 npm install
  • bun run:类似于 npm run
  • bun create:通过该命令,可快速创建一个模板项目
  • bun bun:该命令会递归收集指定文件的导入依赖,然后生成包含这些信息的 node_modules.bun 文件
  • bun upgrade:要升级 bun,请运行bun upgrade

7. 配置文件 bunfig.toml

bunfig.toml 是 bun 的配置文件。

它允许您在 bunfig.toml 加载配置,而不是每次都将参数传递给命令行。在解析命令行参数之前加载配置文件,这意味着命令行参数可以覆盖这个配置。

下面是一个配置例子:

# Set a default framework to use
# By default, bun will look for an npm package like `bun-framework-${framework}`, followed by `${framework}`
framework = "next"
logLevel = "debug"
# publicDir = "public"
# external = ["jquery"]
[macros]
# Remap any import like this:
#     import {graphql} from 'react-relay';
# To:
#     import {graphql} from 'macro:bun-macro-relay';
react-relay = { "graphql" = "bun-macro-relay" }
[bundle]
saveTo = "node_modules.bun"
# Don't need this if `framework` is set, but showing it here as an example anyway
entryPoints = ["./app/index.ts"]
[bundle.packages]
# If you're bundling packages that do not actually live in a `node_modules` folder or do not have the full package name in the file path, you can pass this to bundle them anyway
"@bigapp/design-system" = true
[dev]
# Change the default port from 3000 to 5000
# Also inherited by Bun.serve
port = 5000
[define]
# Replace any usage of "process.env.bagel" with the string `lox`.
# The values are parsed as JSON, except single-quoted strings are supported and `'undefined'` becomes `undefined` in JS.
# This will probably change in a future release to be just regular TOML instead. It is a holdover from the CLI argument parsing.
"process.env.bagel" = "'lox'"
[loaders]
# When loading a .bagel file, run the JS parser
".bagel" = "js"
[debug]
# When navigating to a blob: or src: link, open the file in your editor
# If not, it tries $EDITOR or $VISUAL
# If that still fails, it will try Visual Studio Code, then Sublime Text, then a few others
# This is used by Bun.openInEditor()
editor = "code"
# List of editors:
# - "subl", "sublime"
# - "vscode", "code"
# - "textmate", "mate"
# - "idea"
# - "webstorm"
# - "nvim", "neovim"
# - "vim","vi"
# - "emacs"
# - "atom"
# If you pass it a file path, it will open with the file path instead
# It will recognize non-GUI editors, but I don't think it will work yet

相关属性解释:

  • framework :指定默认使用的 framework 版本,

bun 将根据 bun-framework-${framework} 格式找寻找 npm 包;

  • logLevel :指定 log 级别(可用值 error 、 warn 、 info 和 debug );
  • publicDir :指定 public 目录;
  • external :指定外部扩展,作用等同于 Webpack 的 externals;
  • macros :宏定义,用于替换 import 路径,比如:

import { graphql } from 'react-relay'; 将被转换为

import { graphql } from "macro:bun-macro-relay/bun-macro-relay.tsx";

  • dev.port :指定服务的监听端口(默认 3000 );
  • define :作用等同于 Webpack 的 DefinePlugin;
  • loaders :指定各类文件的解析器;

当然,上述只是举例说明了一些在前端领域常见的一些情况,如果你还想了解更多的使用方法与案例,可查看:

查看官方例子

查看官方文档

总结

  • 对于性能方面,值得一探究竟;
  • 版本较新,最新版本才 v0.1.4;
  • 但是能否真正的用于生产,按照作者目前的原话是不建议的,因为由于内存泄露等问题,所以不建议在生产环境中使用,但是目前作者已经在 996 的紧急修复相关问题了;

不过作为一门能吊打 Node 和 Deno 的工具,咱们还是有必要去了解作为茶余饭后吹牛的资本的;

以上就是吊打 Node 和 Deno 的 Bun入门学习教程的详细内容,更多关于Bun 入门学习的资料请关注Devmax其它相关文章!

Bun入门学习教程吊打Node或Deno的现代JS运行时的更多相关文章

  1. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 使用带有NodeJs HTTPS的certificates.cer

    我为IOS推送通知生成了一个.cer文件,我希望将它与NodeJSHTTPS模块一起使用.我发现HTTPS模块的唯一例子是使用.pem和.sfx文件,而不是.cer:有解决方案吗解决方法.cer文件可以使用两种不同的格式进行编码:PEM和DER.如果您的文件使用PEM格式编码,您可以像使用任何其他.pem文件一样使用它(有关详细信息,请参见Node.jsdocumentation):如果您的文件使

  3. 如何在XCode IDE中构建NodeJS?

    如何在XCodeIDE中将NodeJS构建为项目?NodeJS构建指令说它应该用以下内容构建:但是我希望在XCodeIDE中构建.我真正想要做的是在我的应用程序中嵌入NodeJS,所以我想如果我可以在XCode中构建NodeJS,那么我可以调整它以在我建立和运行NodeJS后添加我的应用程序.我想通过让V8在XCode中编译来取得一些进展,现在我正在尝试将NodeJS添加到V8项目中.解决方法在节点存储库根目录中运行./configure–xcode,您将获得所需的node.xcodeproj文件.

  4. 深入云存储系统Swift核心组件:Ring实现原理剖析

    它的目的是用于托管Rackspace的CloudFilesservice,原始项目代号是swift,所以沿用至今。Ring是Swift中最重要的组件,用于记录存储对象与物理位置间映射关系。先来看一下Swift文档中关于Ring的描述:Ring用来确定数据驻留在集群中的位置。有单独对应于Account数据库、container数据库和单个object的ring。Ring使用zone的概念来保证数据的隔离。每个partition的replica都确保放在了不同的zone中。本文逐步深入探讨了Swift如何通过

  5. Swift开发:创建XML文件,包含节点,属性值

    .append;//3创建第二个节点数据letitem2:Item=Item;for{letnode=Node;node.id=i+1;node.attributes=["ID":"\","Name":"N-\","disp":"1","Appliance":"1","Icon":"ic_switch_4"]item2.addNode;}xml.items?

  6. 泛型 – 符合Swift中Comparable的泛型类

    我正在尝试创建一个符合Comparable协议的简单通用节点类,以便我可以轻松地比较节点而无需访问其密钥.当我试图写

  7. swift3 – 将SceneKit对象放在SCNCamera当前方向的前面

    >生成SCNVector4,它定向节点,使其“面向”相机?但是让我有点失落.我看到了许多类似的问题,比如thisone,但没有答案.嘿,如果要将对象放在相对于另一个节点的某个位置,并且与参考节点的方向相同,则可以使用这个更简单的函数:如果您想将’node’2m放在某个’cameraNode’前面,你可以这样称呼:

  8. 如何在Swift中继承NSOperation以将SKAction对象排队以进行串行执行?

    Rob为子类化NSOperation提供了agreatObjective-Csolution,以实现SKAction对象的串行排队机制.我在自己的Swift项目中成功实现了这一点.要使用Actionoperation,请在客户端类中实例化NSOperationQueue类成员:在init方法中添加以下重要行:然后当您准备好向其添加SKActions时,它们会连续运行:您是否需要在任何时候终止操作:希望有所帮助!

  9. 核心数据 – 如何在Swift中定义CoreData关系?

    在CoreData中,我已经从Node到Tag定义了一个无序的多对多关系.我创建了一个这样的Swift实体:现在我想添加一个Tag到Node的一个实例,像这样:但是,这会失败,并显示以下错误:Terminatingappduetouncaughtexception‘NSinvalidargumentexception’,reason:‘Unacceptabletypeofvalueforto-ma

  10. 将“nil”值赋给Swift中的一般类型变量

    您需要将变量声明为可选项:不幸的是,这似乎触发了一个未实现的编译器功能:您可以通过使用NSObject的类型约束声明T来解决它:

随机推荐

  1. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  2. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  3. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  4. nodejs模块学习之connect解析

    这篇文章主要介绍了nodejs模块学习之connect解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. nodejs npm package.json中文文档

    这篇文章主要介绍了nodejs npm package.json中文文档,本文档中描述的很多行为都受npm-config(7)的影响,需要的朋友可以参考下

  6. 详解koa2学习中使用 async 、await、promise解决异步的问题

    这篇文章主要介绍了详解koa2学习中使用 async 、await、promise解决异步的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. Node.js编写爬虫的基本思路及抓取百度图片的实例分享

    这篇文章主要介绍了Node.js编写爬虫的基本思路及抓取百度图片的实例分享,其中作者提到了需要特别注意GBK转码的转码问题,需要的朋友可以参考下

  8. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. node.js三个步骤实现一个服务器及Express包使用

    这篇文章主要介绍了node.js三个步骤实现一个服务器及Express包使用,文章通过新建一个文件展开全文内容,具有一定的参考价值,需要的小伙伴可以参考一下

  10. node下使用UglifyJS压缩合并JS文件的方法

    下面小编就为大家分享一篇node下使用UglifyJS压缩合并JS文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

返回
顶部