【Bun1.0】使用 Bun.js 构建快速、可靠和安全的 JavaScript 应用程序

2023-11-19

bun.js

Bun 是一个现代的JavaScript运行环境,如Node, Deno。主要特性如下:
启动速度快。更高的性能。完整的工具(打包器、转码器、包管理)。

官网

https://bun.sh

优点

与传统的 Node.js 不同,Bun.js 提供了一些新的特性和功能,例如:

  1. 更快的启动速度、更小的内存占用、更好的异常处理机制等等。此外,Bun.js 还提供了一些工具和库。

##安装

npm install -g bun

更新

bun upgrade

为什么 Bun 存在?

Bun 的目标很简单:消除缓慢和复杂性,同时保留 JavaScript 的所有优点。您喜欢的库和框架应该仍然可以工作,您也不需要放弃您已经熟悉的惯例。

但是,您需要放弃许多不必要的工具,因为 Bun 已经替代了它们:

Node.js - Bun 是 Node.js 的即插即用替代品,因此您不需要:

node
npx - bunx 比 npx 快 5 倍
nodemon - Bun 有内置的 watch 模式!
dotenv,cross-env - Bun 默认读取 .env 文件

转译器 - Bun 可以运行 .js.ts.cjs.mjs.jsx.tsx 文件,这些文件可以替代:

tsc - (但您可以保留它进行类型检查!)
babel,.babelrc,@babel/preset-*
ts-node,ts-node-esm
tsx

打包工具 - Bun 是一个 JavaScript 打包工具,具有最佳性能和与 esbuild 兼容的插件 API,因此您不需要:

esbuild
webpack
parcel,.parcelrc
rollup,rollup.config.js

包管理器

包管理器 - Bun 是一个与 npm 兼容的包管理器,具有熟悉的命令。它读取您的 package.json,并像其他包管理器一样写入 node_modules,因此您可以替换:

npm,.npmrc,package-lock.json
yarn,yarn.lock
pnpm,pnpm.lock,pnpm-workspace.yaml
lerna

测试库 - Bun 是一个与 Jest 兼容的测试运行器,支持快照测试、模拟和代码覆盖率,因此您不再需要:

jest,jest.config.js
ts-jest,@swc/jest,babel-jest
jest-extended
vitest,vitest.config.ts

虽然这些工具各自都很不错(大多数情况下),但将它们全部一起使用不可避免地会导致脆弱性和开发体验缓慢。它们执行了许多冗余工作;当您运行 jest 时,您的代码将被各种工具解析 3 次以上!而为了将所有东西粘合在一起所需的胶带、插件和适配器总是会在最终磨损。

Bun 是一个单一的集成工具包,避免了这些集成问题。工具包中的每个工具都提供最佳的开发体验,从性能到 API 设计。

js运行时

Bun 是一个 JavaScript 运行时环境。
Bun 是一个快速的 JavaScript 运行时环境。它的目标是让构建软件的体验更快、更少令人沮丧,更有趣。

兼容性

Bun 是 Node.js 的即插即用替代品。这意味着现有的 Node.js 应用程序和 npm 包可以在 Bun 中正常工作。Bun 内置支持 Node API,包括:

内置模块,如 fs、path 和 net
全局变量,如 __dirname 和 process
以及 Node.js 模块解析算法(例如 node_modules)

虽然与 Node.js 的完全兼容性是不可能的,但是 Bun 可以运行几乎所有野外的 Node.js 应用程序。

Bun 经过了对 npm 上最受欢迎的 Node.js 包的测试套件的测试。像 Express、Koa 和 Hono 这样的服务器框架可以正常工作。使用最受欢迎的全栈框架构建的应用程序也可以正常工作。这些库和框架共同触及 Node.js 的所有重要 API 面。

速度

Bun 很快,启动速度比 Node.js 快 4 倍。当运行 TypeScript 文件时,这种差异只会被放大,因为需要将其转译为 Node.js 可以运行的代码。

Bun 运行一个 “hello world” TypeScript 文件比 esbuild 和 Node.js 快 5 倍。

与 Node.js 和其他使用 Google 的 V8 引擎构建的运行时不同,Bun 使用 Apple 的 WebKit 引擎构建。WebKit 是 Safari 的引擎,每天被数十亿台设备使用。它快速、高效,并经过了几十年的实战测试。

TypeScript 和 JSX 支持

Bun 内置了 JavaScript 转译器。这意味着您可以运行 JavaScript、TypeScript,甚至是 JSX/TSX 文件,无需任何依赖。

TypeScript
JSX/TSX

bun index.ts

ESM 和 CommonJS 兼容性

从 CommonJS 到 ES 模块的过渡缓慢而充满了恐惧。在 ESM 推出之后,Node.js 花费了 5 年时间才支持它,而不需要 --experimental-modules 标志。尽管如此,生态系统仍然充满了 CommonJS。

Bun 始终支持这两种模块系统。无需担心文件扩展名、.js vs .cjs vs .mjs,或在 package.json 中包含 “type”: “module”。

您甚至可以在同一文件中使用 import 和 require()。它只是工作。

import lodash from "lodash";
const _ = require("underscore");

Web API

Bun 内置支持浏览器中可用的 Web 标准 API,例如 fetch、Request、Response、WebSocket 和 ReadableStream。

const response = await fetch("https://example.com/");
const text = await response.text();

您不再需要安装像 node-fetch 和 ws 这样的包。Bun 的内置 Web API 是使用本机代码实现的,比第三方替代品更快、更可靠。

热重载

Bun 使您作为开发人员更加高效。您可以使用 --hot 来运行 Bun,以启用热重载,当文件更改时重新加载应用程序。

bun --hot server.ts

与像 nodemon 这样硬重启整个进程的工具不同,Bun 在不终止旧进程的情况下重新加载您的代码。这意味着 HTTP 和 WebSocket 连接不会断开,并且状态不会丢失。

插件

Bun 设计为高度可定制。

您可以定义插件来拦截导入并执行自定义加载逻辑。插件可以添加对其他文件类型的支持,例如 .yaml 或 .png。插件 API 受 esbuild 启发,这意味着大多数 esbuild 插件在 Bun 中都可以正常工作。

import { plugin } from "bun";

plugin({
  name: "YAML",
  async setup(build) {
    const { load } = await import("js-yaml");
    const { readFileSync } = await import("fs");
    build.onLoad({ filter: /.(yaml|yml)$/ }, (args) => {
      const text = readFileSync(args.path, "utf8");
      const exports = load(text) as Record<string, any>;
      return { exports, loader: "object" };
    });
  },
});

Bun API

Bun 附带高度优化的标准库 API,用于开发人员最需要的东西。
与 Node.js API 相反,这些 Bun 原生 API 被设计为快速且易于使用,而不是为了向后兼容。

Bun.file()

使用 un.file()在特定路径上惰性加载文件。

const file = Bun.file("package.json");
const contents = await file.text();

它返回一个 BunFile,它扩展了 Web 标准文件。可以以各种格式惰性加载文件内容。

const file = Bun.file("package.json");

await file.text(); // string
await file.arrayBuffer(); // ArrayBuffer
await file.blob(); // Blob
await file.json(); // {...}

Bun 读取文件的速度比 Node.js 快 10 倍。

Bun.write()

使用 Bun.write() 是一个灵活的 API,可以将几乎任何东西写入磁盘 —— 字符串、二进制数据、Blob,甚至是 Response 对象。

await Bun.write("index.html", "<html/>");
await Bun.write("index.html", Buffer.from("<html/>"));
await Bun.write("index.html", Bun.file("home.html"));
await Bun.write("index.html", await fetch("https://example.com/"));

Bun 写入文件的速度比 Node.js 快 3 倍。

Bun.serve()

使用Bun.serve()启动 HTTP 服务器、WebSocket 服务器或两者兼备。它基于熟悉的 Web 标准 API,如 Request 和 Response。

Bun.serve({
  port: 3000,
  fetch(request) {
    return new Response("Hello from Bun!");
  },
});

Bun 每秒可处理的请求比 Node.js 多 4 倍。

您还可以使用 tls 选项配置 TLS。

Bun.serve({
  port: 3000,
  fetch(request) {
    return new Response("Hello from Bun!");
  },
  tls: {
    key: Bun.file("/path/to/key.pem"),
    cert: Bun.file("/path/to/cert.pem"),
  }
});

为了支持 WebSockets 和 HTTP 并存,只需在 websocket 内定义事件处理程序。与 Node.js 不同,它没有提供内置的 WebSocket API,并需要第三方依赖项,如 ws。

Bun.serve({
  fetch() { ... },
  websocket: {
    open(ws) { ... },
    message(ws, data) { ... },
    close(ws, code, reason) { ... },
  },
});

Bun 每秒可处理的消息比 ws 上的 Node.js 多 5 倍。

bun:sqlite

Bun 内置了对 SQLite 的支持。它具有受 better-sqlite3 启发的 API,但是使用本机代码编写以提高速度。

import { Database } from "bun:sqlite";

const db = new Database(":memory:");
const query = db.query("select 'Bun' as runtime;");
query.get(); // => { runtime: "Bun" }

Bun 可以比 Node.js 上的 better-sqlite3 查询 SQLite 快 4 倍。

Bun.password

Bun 还支持常见但复杂的 API,您不想自己实现。

您可以使用 un.password使用`bcrypt 或 argon2 哈希和验证密码,无需外部依赖项。

const password = "super-secure-pa$word";
const hash = await Bun.password.hash(password);
// => $argon2id$v=19$m=65536,t=2,p=1$tFq+9AVr1bfPxQdh...

const isMatch = await Bun.password.verify(password, hash);
// => true

Bun 是一个包管理器

即使您不将 Bun 用作运行时,Bun 的内置包管理器也可以加速您的开发工作流程。不再需要盯着 npm 的旋转器看着依赖项安装。

Bun 可能看起来像您习惯的包管理器 —

bun install

bun add <package> [--dev|--production|--peer]

bun remove <package>

bun update <package>

linux环境示例

Bun.js 支持 Windows 操作系统。Bun.js 基于 Node.js,因此可以在支持 Node.js 的所有操作系统上运行,包括 Windows、macOS 和 Linux。您可以在 Windows 上使用 Bun.js 来开发和运行 JavaScript 应用程序,而且其性能和功能与在其他操作系统上使用 Bun.js 相同。

console.log("Hello, world!");
function add(num1,num2){
  return num1+num2;
}
console.log(add(1,2))

读取文件的服务

好的,以下是一个使用 Bun.js 创建读取文件的本地 HTTP 服务器的示例:

  1. 首先,您需要安装 Bun.js。您可以在命令行中运行以下命令来安装最新版本的 Bun.js:
npm install -g bun
  1. 接下来,您可以创建一个新的 JavaScript 文件,例如 server.js,并在其中编写一些代码。例如,以下代码将创建一个本地 HTTP 服务器,并在访问 http://localhost:3000/ 时返回一个文本文件的内容:
const { serve } = require("bun");
const { readFileSync } = require("fs");

serve({
  port: 3000,
  fetch(request) {
    const fileContent = readFileSync("./file.txt", "utf8");
    return new Response(fileContent);
  },
});
  1. 然后,您需要在与 server.js 文件相同的目录下创建一个名为 file.txt 的文本文件,并在其中添加一些文本内容。

  2. 最后,您可以使用 Bun.js 运行这个 JavaScript 文件。在命令行中,导航到包含 server.js 文件的目录,并运行以下命令:

bun server.js

Bun.js 将会运行 server.js 文件,并在控制台中输出 “Listening on http://localhost:3000/”。现在,可以在浏览器中访问 http://localhost:3000/,并将会看到 file.txt 文件的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Bun1.0】使用 Bun.js 构建快速、可靠和安全的 JavaScript 应用程序 的相关文章

  • 调用“DOMNodeInserted”事件时添加元素

    我想在每个 喜欢 按钮 chrome 扩展 之后添加一个元素 由于帖子被添加到新闻提要而不刷新页面 我必须添加一个事件侦听器 DOMNodeInserted 但是当我尝试把after 里面的功能 它不起作用 Code contentArea
  • 是否可以禁用特定 jQuery Ajax 调用的 Turbolinks 以防止页面刷新和滚动?

    我有一个 Rails 5 应用程序 非常想使用 Turbolinks 在应用程序中 有几个 PATCH ajax 调用 它们只是用新数据更新服务器 但不需要担心更新页面的状态 每当这些 ajax 请求返回时 Turbolinks 就会刷新页
  • Ext JS - 如何滚动到文本区域的底部

    这是我下面的代码 如何滚动到文本区域的底部 它一定是类似的东西 Ext getCmp output setScrollPosition Ext getCmp output getScrollHeight 这是我的文本区域代码 var myW
  • ant-d upload中如何为removeFile添加PopConfirm一个图片文件

    我正在使用 Ant d Upload 通过本地系统上传文件 然后单击文件预览图像上的删除图标 图像文件将被删除 我想添加一个弹出确认 所以我尝试在 onRemovefunction 中添加确认作为承诺但它不起作用 它在浏览器中显示警报 on
  • 在 BIRT 中输入参数后更新数据集查询

    在 BIRT 报告设计中传递参数后 如何更改或更新数据集的查询 详细说明 我有一个如下所示的查询 WHERE 该参数标记可以保存不同的值 在用户输入参数后 它看起来像这样 例如 WHERE column name 1 or WHERE co
  • 未捕获的引用错误:myFunction 未定义[重复]

    这个问题在这里已经有答案了 这到底是怎么回事 http jsfiddle net sVT54 http jsfiddle net sVT54
  • 将 Sweet Alert 弹出窗口添加到 React 组件中的按钮

    我为 Bootstrap 和 React 找到了这个完美的 Sweet Alert 模块 我在 Meteor 应用程序中使用它 http djorg83 github io react bootstrap sweetalert http d
  • 禁用 JavaScript 中的右键单击

    当我尝试禁用右键单击时 它不起作用 我尝试使用下面的代码 document onclick function e console log e button if e button 2 e preventDefault return fals
  • 如何使用 jQuery 向表中添加新行,并为其分配递增的 id

    我有一个现有的 HTML 表格 它是用户输入 GPS 点的表单的一部分 用户还可以选择上传 GPS 数据点 我想要一个用户可以按下的按钮 其中一些 Javascript 会向表中添加一个或多个新行 但新行必须继续增加表中使用的名称和 id
  • 使react-leaflet能够离线使用

    我一直在使用反应传单 https github com PaulLeCam react leaflet图书馆 到目前为止运作良好 现在我希望网站预加载尽可能多的图块 以便网络应用程序 也是 PWA 可以在没有互联网的情况下使用 我找到了一些
  • v-file-input .click() 不是函数

    我试图以编程方式触发 v file input 的 click 事件 因为它在 Vuetify 的文档中 但它显示一个错误this refs imagePicker click is not a function我在这里错过了什么吗 代码重
  • Aptana Studio 3 上的预览选项卡在哪里?

    我在 Windows PC 上使用 Aptana Studio 2 并有一个选项卡用于在 IE 上预览页面 另一个选项卡用于在 Firefox 上预览 但我切换到了 Aptana 3 我不知道是没有预览还是我没有找到它 是的 我在 stac
  • 如何滚动到div内的元素?

    我有一个滚动的div我想在点击它时发生一个事件 它会强制执行此操作div滚动以查看内部元素 我写的JavasCript是这样的 document getElementById chr scrollIntoView true 但这会在滚动时滚
  • Flux + React.js - 操作中的回调是好还是坏?

    让我解释一下我最近遇到的问题 我有 React js Flux 驱动的应用程序 有一个列表显示文章数量 注意 应用程序中有多个不同的列表 和文章详情查看在里面 但每个列表只有一个 API 端点 它返回文章数组 为了显示我需要的详细信息fin
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • React无限滚动scrollableTarget动态获取id?

    我在我的项目中使用react infinite scroll component 如何让scrollableTarget动态获取item id 我试过这样scrollableTarget item id 但它不起作用 必须与该 div 具有
  • 是否可以使用打字稿映射类型来创建接口的非函数属性类型?

    所以我正在研究 Typescript 的映射类型 是否可以创建一个接口来包装另一种类型 从而从原始类型中删除函数 例如 interface Person name string age number speak void type Data
  • 如何在网页上实现文件上传进度条?

    当用户将文件上传到我的网络应用程序时 我想显示比动画 gif 更有意义的内容 我还有哪些可能性 编辑 我正在使用 Net 但我不介意是否有人向我展示与平台无关的版本 如果您对这一切在客户端通常如何工作感兴趣 就是这样 所有解决方案都通过 J
  • ng-model 和值组合不适用于输入文本框

    我有两个输入文本框 我需要组合在两个文本框中输入的值并将其显示在第三个文本框中 如果我只使用value在第三个文本框中 Box 1
  • 在javascript中动态生成行?

    我是 javascript 新手 我想在按下 Tab 时动态生成行 并希望获取在动态生成的行中输入的值 以便我可以在 servlet 代码中使用这些值 这是我的html

随机推荐

  • 【RPA机器人】PDF批量转换成图片机器人

    运行前须知 1 仅支持win10系统 2 请确保安装金山PDF独立版 3 请把屏幕分辨率设置为1920x1080 缩放布局100 4 生成的图片将保存在所选文件夹目录下 运行流程 1 获取需批量转换PDF的文件夹 2 等待文件自动转换 运用
  • Python3中__call__方法介绍

    如果Python3类中有 call 方法 那么此类实例的行为类似于函数并且可以像函数一样被调用 当实例作为函数被调用时 如果定义了此方法 则x arg1 arg2 是x call arg1 arg2 的简写 为了将一个类实例当作函数调用 我
  • 如何实现一个分布锁?

    基本概念 为何需要分布式锁 传统环境中的情况 在程序开发过程中不得不考虑的就是并发问题 在java中对于同一个jvm而言 jdk已经提供了lock和同步等 但是在分布式情况下 往往存在多个进程对一些资源产生竞争关系 而这些进程往往在不同的机
  • 七. go 常见数据结构实现原理之 反射

    目录 一 golang 是如何实现反射的 如何比较两个对象完全相等 一 golang 是如何实现反射的 参考博客Go 语言问题集 Go Questions Go 语言在 reflect 包里定义了各种类型 实现了反射的各种函数 通过它们可以
  • 【Git系列】Git配置SSH免密登录

    Git配置SSH免密登录 1 设置用户名和邮箱 2 生成密钥 3 远程仓库配置密钥 2 免密登录 其他系列 Git最详细的体系化教程 在以上push操作过程中 我们第一次push时 是需要进行录入用户名和密码的 比较麻烦 而且我们使用的是h
  • 刷脸支付技术更多的是想要助力数字化运营

    刷脸支付是在原有的收银系统基础上增加一种收款方式 不影响收银系统 收银更有效 支付更便捷 体验感更好 节省时间成本 资金更安全 支付宝 微信官方为推广刷脸支付 两大官方投入巨额资金普及刷脸支付 日常生活中可避免忘记带手机 手机没电 通话中
  • C++17中utf-8 character literal的使用

    一个形如42的值被称作字面值常量 literal 这样的值一望而知 每个字面值常量都对应一种数据类型 字面值常量的形式和值决定了它的数据类型 由单引号括起来的一个字符称为char型字面值 双引号括起来的零个或多个字符则构成字符串型字面值 字
  • 两万字带你认识黑客在kali中使用的工具

    目录 前言 一 信息收集工具 二 脆弱性分析工具 三 漏洞利用工具 四 嗅探与欺骗工具 五 密码攻击工具 六 权限提升工具 七 Web应用工具 八 无线攻击工具 九 硬件黑客工具 十 维持访问工具 十一 取证工具 十二 逆向工程工具 十三
  • Linux动态链接库.so文件的创建与使用

    1 介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库 一个 程序函数库 简单的说就是一个文件包含了一些编译好的代码和数据 这些编译好的代码和数据可以在事后供其他的程序使用 程序函数库可以使整个程序更加模块化 更容易重新编译
  • Qt 简述QSettings配置文件保存使用数据

    前言 在开发中 需要将一些信息保存到本地 以便下次程序启动时使用 文件读写 数据库都是可以的 但是Qt提供了QSettings接口方法 将需要的信息写入或者读取配置文件中 其方法类似键值对 QSettings可以存储一系列设置 每个设置包括
  • 探讨Socks5代理IP在跨境电商与网络游戏中的网络安全应用

    随着全球互联网的迅猛发展 跨境电商和在线游戏成为了跨国公司和游戏开发商的新战场 然而 与此同时 网络安全问题也日益突出 本文将探讨如何利用Socks5代理IP来增强跨境电商和网络游戏的网络安全 保障数据传输的隐私和安全性 第一部分 Sock
  • 五分钟,带你彻底掌握 MyBatis 缓存的工作原理

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 8 55 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2020 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络
  • Quartz框架多个trigger任务执行出现漏执行的问题分析

    一 问题描述 使用Quartz配置定时任务 配置了超过10个定时任务 这些定时任务配置的触发时间都是5分钟执行一次 实际运行时 发现总有几个定时任务不能执行到 二 示例程序 1 简单介绍 采用spring quartz整合方案实现定时任务
  • docker菜鸟入门

    菜鸟入门Docker 说明 一 什么是Docker 1 虚拟机和Linux容器 二 Docker用途 三 Docker安装 1 设置仓库 2 安装 Docker Engine Community 3 验证安装成功 四 Docker启动与停止
  • VoVNet论文解读

    摘要 1 介绍 2 高效网络设计的影响因素 2 1 内存访问代价 2 2 GPU计算效率 3 建议的方法 3 1 重新思考密集连接 3 2 One Shot Aggregation 3 3 构建 VoVNet 网络 4 实验 5 代码解读
  • 01背包(c++版)

    dp i j 表示从下标为 0 i 的物品里任意取 放进容量为j的背包 价值总和最大是多少 void test 2 wei bag problem1 vector
  • 上班族为何需要做副业?如何靠副业月入过万?

    网上统计某某城市平均工资8千以上 诶 一看自己3 4千 其实现在每个背井离乡在外上班的打工人都挺难的 城市很繁华 工资很现实 在工厂打螺丝的更是苦逼的生活 被资本家无情的压榨 在豪华的写字楼上班的白领 也过着996的生活 甚至是007的日子
  • 操作系统复习题

    一 选择题 在计算机系统中 操作系统是 核心系统软件 网络操作系统 不是基本的操作系统 实时性 不是分时系统的基本特征 关于操作系统的叙述 能方便用户编程的程序 是不正确的 操作系统的发展过程是 设备驱动程序组成的原始操作系统 管理程序 操
  • Response 456错误

    今天使用某share拉取股票数据时 遇到了Response 456错误 然而在网上查也没有查到 感觉是是较为少见的错误 http response code HTTP状态码对照表 t 332741160的专栏 CSDN博客 后来发现这个错误
  • 【Bun1.0】使用 Bun.js 构建快速、可靠和安全的 JavaScript 应用程序

    bun js Bun 是一个现代的JavaScript运行环境 如Node Deno 主要特性如下 启动速度快 更高的性能 完整的工具 打包器 转码器 包管理 官网 https bun sh 优点 与传统的 Node js 不同 Bun j