热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

bun.js一个新的JavaScript运行环境

介绍Bun是一个现代的JavaScript运行环境,如Node,Deno。主要特性如下:启动速度快。更高的性能。完整的工具(打包器、转码器、包管理)。下面我们来横向对比下框架所说的

介绍

Bun 是一个现代的Javascript运行环境,如Node, Deno。主要特性如下:



  1. 启动速度快。

  2. 更高的性能。

  3. 完整的工具(打包器、转码器、包管理)。

下面我们来横向对比下框架所说的性能:

相同电脑下, 不同 js 运行环境的每秒操作数


更多具体的优点



  • 内置 fetchWebSocketReadableStream 等API



  • 可以在bun.js中使用npm包。支持ESM和CommonJS,但Bun内部使用ESM。



  • 在bun.js中,每个文件都是转译的。TypeScript & JSX就可以使用。



  • bun支持 "paths"、"jsxImportSource" 和更多来自tsconfig.json文件的内容。



  • 使用 Bun.write 提供的最快的系统调用来写入、复制、管道、发送文件。



  • bun.js会自动从.env文件中加载环境变量。不再需要 require("dotenv").config()



  • bun内置了一个快速的 SQLite3 客户端 bun:sqlite



  • bun.js实现了大部分的Node-API(N-API)。许多Node.js的本地模块都能正常工作。




加载器

目前,bun实现了以下加载器:








































































InputLoaderOutput
.jsJSX + Javascript.js
.jsxJSX + Javascript.js
.tsTypeScript + Javascript.js
.tsxTypeScript + JSX + Javascript.js
.mjsJavascript.js
.cjsJavascript.js
.mtsTypeScript.js
.ctsTypeScript.js
.tomlTOML.js
.cssCSS.css
.envEnvN/A
.*filestring

实现

Bun.js 使用的是 JavascriptCore 引擎,

它的执行速度往往要比 V8 等更传统引擎要快。

而他本身, 是由叫做 Zig 的语言编写而成的, Zig 是一门新的系统级编程语言,相当于加强版 C 语言


配置

bunfig.toml 是 bun 的配置文件。

这里给出一个例子:

# 默认框架
# 默认情况下,bun会寻找一个类似于`bun-framework-${framework}的npm包,然后是`${framework}`。
framework = "next"
logLevel = "debug"
# publicDir = "public"
# external = ["jquery"]
[macros]
# 像这样重新映射的配置:
# 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]
# 如果设置了`framework',就不需要这个了,在这里作为一个例子展示一下。
"@bigapp/design-system" = true
[dev]
# dev 的启动端口 3000-5000
port = 5000
[define]
# 环境变量
"process.env.bagel" = "'lox'"
[loaders]
# 如果文件后缀是 .bagel 则使用 JS 的解析器
".bagel" = "js"
[debug]
# 当导航到blob:或src:链接时,在你的编辑器中打开该文件
# 如果没有,它会尝试用$EDITOR或$VISUAL
# 如果仍然失败,它会尝试Visual Studio Code,然后是Sublime Text,然后是其他一些编辑器
# 这是由Bun.openInEditor()使用的
editor = "code"
# List of editors:
# - "subl", "sublime"
# - "vscode", "code"
# - "textmate", "mate"
# - "idea"
# - "webstorm"
# - "nvim", "neovim"
# - "vim","vi"
# - "emacs"
# - "atom"

使用

首先我们下载 cli

在终端执行如下指令即可进行下载:

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

启用服务

先尝试实现类似于 node 的相关功能:

新建文件 http.js

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

之后在终端执行:

bun run http.js

之后打开浏览器地址 http://localhost:3000/ 即可查看到对应页面的返回 Welcome to Bun!

如果运行中有错误处理, 可以这样判断:

export default {
fetch(req) {
// if(...)
throw new Error("woops!");
},
error(error: Error) {
// 类似与 catch 到fetch 抛出的错误
return new Response("Uh oh!!\n" + error.toString(), { status: 500 });
},
}

创建项目

我们先尝试使用它默认的 react 模板项目来创建:

bun create react ./app

运行指令之后的终端部分输出:

之后便出现如下目录:

在项目中, 通过指令 bun dev 即可运行

这就是他的官方 react 项目模板, 当然他还可以扩展:

bun create github-user/repo-name destination
bun create local-example-or-remote-example destination
bun create /absolute/path/to-template-folder destination
bun create https://github.com/github-user/repo-name destination
bun create github.com/github-user/repo-name destination

通过初始化本地路径, github 地址, gitlab 地址来初始化项目


bun create 工作流程

当我们运行 bun create ${template} ${destination} 的时候会出现以下判断



  1. 判断远程模板

    1. 请求 registry.npmjs.org 相关路径, 下载tgz

    2. 解压缩, 提取文件



  2. 如果是 GitHub

    1. 通过 GitHub API 下载

    2. 解析并提取文件



  3. 如果是本地模板

    1. 打开本地文件夹

    2. 清空已有名称的文件

    3. 递归复制文件

    4. 解析 package, 执行 hook, 下载依赖, 初始化 git




包管理

bun 有他自己的包公里工具: bun install, 可以在 bunfig.toml配置文件中对其进行 registry, dev, cache 等配置

bun install 对等依赖的处理方式与 yarn 类似。不会自动安装对等依赖,会尝试选择一个现有的依赖。


lock 文件

bun.lockbbun 的二进制 lock 文件格式, 至于为什么选择二进制, 直接的原因就是为了性能, 和更多的存储


快速的原因

它对所有数据使用线性数组。包是由一个自动递增的整数 ID 或者包名的哈希值引用的。超过8个字符的字符串会被去掉。

在保存在磁盘之前,lock 文件通过 garbage collection (GC)和遍历包的树形结构确定顺序 ,再按依赖关系下载包。


脚本运行器

bun run是一个快速的 package.json 脚本运行器

bun run ${script-name} 运行相当于 npm run script-name 的内容。例如,bun run dev 运行 package.json 中的 dev 脚本。

bun 运行会自动从 .env 中加载环境变量到 shell/task 中。.env 文件的加载优先级与 bun 的其他部分相同:



  1. .env.local 最先加载

  2. if ($NODE_ENV === "production") .env.production else .env.development

  3. .env

如果有什么问题,你可以运行 bun run env 来得到一个环境变量的列表。


问题

目前存在的问题


Zig 的问题

Zig 是一个较新(2016 年)的语言, 他的生态,安全性值得考虑

同时如果底层出现什么问题, 会这门语言的人是非常少的, 就很容易卡主, 过于被动


Issue 的问题

目前存在了 284 个 Issue(2022.07.27), 有一些是特别重要且影响性能的


生态问题

很多常用的, 较为重要的功能还未支持, 例如:



  • treeShaking

  • Source maps

  • Code splitting

  • CSS 压缩

具体可查看 此处


总结

目前来说 bun 已经拥有的功能还不能满足正常的生产需求, 我们只能在开发一些小工具的时候使用它来尝尝鲜

他的结构, 专门的下载器, TypeScript & JSX 的开箱即用, 内置的node API 等等目前看来是挺香的, 然后也同样地存在我上面说的一些问题

bun 的饼是很大很圆, 但是未来能不能真正吃上, 就一起等着看吧



推荐阅读
  • Python 异步编程:ASGI 服务器与框架详解
    自 Python 3.5 引入 async/await 语法以来,异步编程迅速崛起,吸引了大量开发者的关注。本文将深入探讨 ASGI(异步服务器网关接口)及其在现代 Python Web 开发中的应用,介绍主流的 ASGI 服务器和框架。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文介绍了一个基于 Java SpringMVC 和 SSM 框架的综合系统,涵盖了操作日志记录、文件管理、头像编辑、权限控制、以及多种技术集成如 Shiro、Redis 等,旨在提供一个高效且功能丰富的开发平台。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文详细介绍了如何利用Go语言和WebSockets技术构建一个高效的实时聊天系统。随着网络应用的日益复杂化,实时交互成为了提升用户体验的关键要素之一。通过本指南,开发者可以学习到最新的技术和最佳实践。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
author-avatar
aaaa
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有