糖尿病康复,内容丰富有趣,生活中的好帮手!

Bun

时间:2022-10-08 10:00:24

相关推荐

Bun

什么是 Bun?

Bun 是一个用于 JavaScript 和 TypeScript 应用的一体化工具包。它作为一个单独的可执行文件发布,名为 bun。

Bun 的核心是Bun运行时,它是一个快速的 JavaScript 运行时,旨在取代 Node.js。它是用 Zig 语言编写的,并在底层由 JavaScriptCore 提供支持,大大减少了启动时间和内存使用。

bunrunindex.tsx#TSandJSXsupportedoutofthebox

bun 命令行工具还实现了测试运行器、脚本运行器和与Node.js兼容的包管理器。相比现有的工具,它更快,并且可以在现有的 Node.js 项目中使用,几乎不需要任何修改。

bunrunstart#runthe`start`scriptbuninstall<pkg>#installapackagebunbuild./index.tsx#bundleaprojectforbrowsersbuntest#runtestsbunxcowsay"Hello,world!"#executeapackage

什么是运行时

JavaScript(或者更正式地说,ECMAScript)只是一种编程语言的规范。任何人都可以编写一个JavaScript引擎来获取有效的 JavaScript 程序并执行它。目前使用的两个最流行的引擎是 V8 (由Google开发) 和 JavaScriptCore (由 Apple 开发),这两个引擎都是开源的。

Browsers

大多数 JavaScript 程序都不是在孤立的环境中运行的,它们需要与外部世界进行交互以执行有用的任务。这就是运行时的作用所在。运行时提供了额外的API,供JavaScript程序使用。需要注意的是,浏览器提供的JavaScript运行时实现了一组特定于Web的API,这些API通过全局窗口对象进行公开。任何在浏览器中执行的JavaScript代码都可以使用这些API来实现与当前网页上下文的交互或动态行为。

Node.js

类似地,Node.js 是一个在非浏览器环境(如服务器)中使用的 JavaScript 运行时。通过 Node.js 执行的 JavaScript 程序可以访问一组特定于 Node.js 的全局变量,例如 Buffer、process 和 __dirname,以及用于执行操作系统级任务的内置模块,例如读写文件(node:fs)和网络(node:net、node:http)。此外,Node.js 还实现了一个基于 CommonJS 的模块系统和解析算法,早于 JavaScript 的原生模块系统。

Bun 设计的初衷是成为更快、更精简、更现代的 Node.js 替代品。

Bun 的一些特性

速度- 目前,Bun进程的启动速度比 Node.js 快4倍

TypeScript 和 JSX支持- 你可以直接执行 jsx、ts 和 tsx文件,Bun 的转译器在执行之前将这些转换为普通 JavaScript。

ESM 和 CommonJS 兼容性- 世界正在转向ES模块 (ESM),但 npm 上的数百万包仍然需要 CommonJS。Bun 推荐 ES 模块,但支持 CommonJS。

web 标准 api- Bun实现了标准的 Web api,如 fetch、WebSocket 和 ReadableStream。Bun 由苹果为 Safari 开发的 JavaScriptCore 引擎提供支持,因此 header 和 URL 等一些 api 直接使用了 Safari 的实现。

node.js兼容性- 除了支持 node 风格的模块解析,Bun 完全兼容内置的 Node.js 全局变量 (process, Buffer) 和模块 (path, fs, http等) 等相关工作正在进行中。

Bun 不仅仅是一个运行时。长期目标是成为一个内聚的基础设施工具包,用于使用 JavaScript / TypeScript 构建应用程序,包括包管理器、转译器、打包器、脚本运行器、测试运行器等等。

#上手入门

使用内置的 Bun 编写一个简单的HTTP服务器。服务API。首先,创建一个新目录。

mkdirquickstartcdquickstart

运行 bun init 来构建一个新项目。在 enter point 时会自动匹配 js 或 ts 来对应生成配置文件。

buninitbuninithelpsyougetstartedwithaminimalprojectandtriesto#guesssensibledefaults.Press^Canytimetoquit.#packagename(quickstart):#entrypoint(index.ts):#Done!Apackage.jsonfilewassavedinthecurrentdirectory.#+index.ts#+.gitignore#+tsconfig.json(foreditorauto-complete)#+README.md#Togetstarted,run:#bunrunindex.ts

打开 index.ts ,敲一个 http server。

constserver=Bun.serve({port:3000,fetch(req){returnnewResponse(`Bun!`);},});console.log(`Listeningonhttp://localhost:${server.port}...`);

接着启动它。

bunindex.ts

和 node.js 一样,非常简单。

支持 JSX 、TSX、Text、JSON、TOML

Bun 本身就支持开箱即用的 TypeScript。所有文件在执行之前都由 Bun 的快速本机转译器动态编译。与其他构建工具类似,Bun 不执行类型检查,它只是从文件中删除类型注释。

bunindex.jsbunindex.jsxbunindex.tsbunindex.tsx

JSX

react.tsx

functionComponent(props:{message:string}){return(<body><h1style={{color:'red'}}>{props.message}</h1></body>);}console.log(<Componentmessage="Helloworld!"/>);

Bun 为 JSX 实现了特殊的日志记录,使调试更容易。

bunrunreact.tsx//=><Componentmessage="Helloworld!"/>

是的,终于可以单独调试某个组件了。

Text

importtextfrom"./text.txt";console.log(text);//=>"Helloworld!"

JSON 和 TOML

JSON 和 TOML文件可以直接从源文件导入,没什么区别。

importpkgfrom"./package.json";importdatafrom"./data.toml";

WASM

从 v0.5.2开始,对WASI (WebAssembly 系统接口)的实验性支持。

自定义 Loader

对于上面没提到的一些文件类型,Bun 支持 plugins 的形式对其进行扩展。

Bun 打包工具

性能

使用内置的 bun .build() 函数或bun build CLI命令来构建前端应用。

Bun.build({entrypoints:['./src/index.tsx'],outdir:'./build',minify:true,//additionalconfig});

打包 10 个 three.js 副本,包含 sourcemaps 和 minification

在基准测试中(来源于 esbuild 的 three.js 基准测试),Bun 比 esbuild 快 1.75 倍,比 Parcel 2 快 150 倍,比 Rollup Terser 快 180 倍,比 Webpack 快 220 倍。

API

bun 的目标是实现一个最小的功能集,它快速、稳定,并在不牺牲性能的情况下适应大多数现代用例,API 如下:

interfaceBun{build(options:BuildOptions):Promise<BuildOutput>;}interfaceBuildOptions{entrypoints:string[];//requiredoutdir?:string;//default:nowrite(in-memoryonly)target?:"browser"|"bun"|"node";//"browser"format?:"esm";//later:"cjs"|"iife"splitting?:boolean;//defaultfalseplugins?:BunPlugin[];//[]//seehttps://bun.sh/docs/bundler/pluginsloader?:{[kinstring]:string};//seehttps://bun.sh/docs/bundler/loadersexternal?:string[];//default[]sourcemap?:"none"|"inline"|"external";//default"none"root?:string;//default:computedfromentrypointspublicPath?:string;//e.g./naming?:|string//equivalenttonaming.entry|{entry?:string;chunk?:string;asset?:string};minify?:|boolean//defaultfalse|{identifiers?:boolean;whitespace?:boolean;syntax?:boolean};}

引用 Jarred Sumner 的原话,“其他打包工具在追求功能完整性的过程中做出了糟糕的架构决策,最终导致性能受损,这是我们小心翼翼地试图避免的错误”。

模块系统

目前支持 ES、Common,推荐使用 ES,未来将会添加其他。

文件类型

目前支持以下文件类型:.js .jsx .ts .tsx - JavaScript and TypeScript files. Duh..txt — Plain text files. These are inlined as strings..json .toml — These are parsed at compile time and inlined as JSON.

其他一切都被视为静态资源。静态资源被原样复制到 outdir 中,导入被替换为文件的相对路径或URL,例如 /images/logo.png。

input:

importlogofrom"./images/logo.png";

output:

varlogo="./images/logo.png";

Plugins

与运行时本身一样,打包器被设计为可以通过插件进行扩展。事实上,运行时插件和打包器插件之间没有任何区别。

importYamlPluginfrom"bun-plugin-yaml";constplugin=YamlPlugin();//registeraruntimepluginBun.plugin(plugin);//registerabundlerpluginBun.build({entrypoints:["./src/index.ts"],plugins:[plugin],});

还有一些现代打包工具的“标配”, 例如 Tree shaking、Source maps 等,Bun 也是支持的。

最后,篇幅有限,其他方面就不在过多介绍了,感兴趣的小伙伴,可以自行查阅官网。

官网:https://bun.sh/

如果觉得《Bun》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。