介绍Bun是一个现代的JavaScript运行环境,例如Node,Deno。主要特点如下:快速启动。更高的性能。完整的工具(打包器、转码器、包管理)。我们横向比较一下框架的性能:在同一台电脑下,不同js运行环境下每秒的操作数比较具体。内置的fetch、WebSocket和ReadableStream等API可以使用bun.js中的npm包。支持ESM和CommonJS,但Bun内部使用ESM。在bun.js中,每个文件都被转译。可以使用TypeScript和JSX。bun支持来自tsconfig.json文件的“路径”、“jsxImportSource”等。使用Bun.write提供的最快的系统调用写入、复制、传输、发送文件。bun.js会自动从.env文件加载环境变量。不再需要(“dotenv”).config()bun带有一个快速的SQLite3客户端bun:sqlitebun.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使用JavaScriptCore引擎实现Bun.js,其执行速度往往比V8等更传统的引擎更快。而他本身是用一种叫做Zig的语言编写的,Zig是一种新的系统级编程语言,相当于C语言配置的增强版bunfig.toml是bun的配置文件。这里有一个例子:#DefaultFramework#默认情况下,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"#不要如果设置了`framework`则需要这个,但在这里作为示例显示示例炫耀一下。"@bigapp/design-system"=true[dev]#dev启动端口3000-5000port=5000[define]#环境变量"process.env.bagel"="'lox'"[loaders]#如果文件后缀是.bagel使用JS解析器".bagel"="js"[debug]#当导航到blob:或src:链接时,在你的编辑器中打开文件#如果没有,它将尝试使用$EDITOR或$VISUAL#如果仍然失败,它会尝试VisualStudioCode,然后是SublimeText,然后是其他编辑器#-"vscode","code"#-"textmate","mate"#-"idea"#-"webstorm"#-"nvim","neovim"#-"vim","vi"#-"emacs"#-"atom"要使用,首先我们下载cli,在终端执行以下命令进行下载:curlhttps://bun.sh/install|bash开启服务,先尝试实现类似node的相关功能:新建一个文件http.jsexportdefault{port:3000,fetch(request){returnnewResponse("WelcometoBun!");},};执行后:bun在终端运行http.js,打开浏览器地址http://localhost:3000/即可查看对应页面的返回欢迎来到包子!如果运行过程中有错误处理,可以这样判断:exportdefault{fetch(req){//if(...)thrownewError("woops!");},error(error:Error){//类似于catch到fetch抛出的错误returnnewResponse("Uhoh!!\n"+error.toString(),{status:500});},}创建项目先尝试使用其默认的react模板项目创建:buncreatereact./app运行命令后终端部分的输出:之后,出现如下目录:在项目中,可以通过命令bundev运行。这是他官方的react工程模板,当然他也可以扩展:buncreategithub-user/repo-namedestinationbuncreatelocal-example-or-remote-exampledestinationbuncreate/absolute/path/to-template-folderdestinationbuncreatehttps://github.com/github-user/repo-namedestinationbuncreategithub.com/github-user/repo-namedestination通过初始化本地路径、github地址、gitlab地址来初始化项目buncreateworkflow当我们运行buncreate${template}${destination},会出现下面的判断判断远程模板请求registry.npmjs.org的路径,下载tgz,解压,解压文件。如果是GitHub,通过GitHubAPI下载、解析、解压文件。如果是本地模板,请打开本地文件夹并清除具有现有名称的文件。递归拷贝文件解析包,Executehook,下载依赖,初始化git包管理bun自带打包工具:buninstall,可以在bunfig.toml中配置在配置文件中配置registry、dev、cache等。buninstall点对点依赖的处理方式与yarn类似。它不会自动安装对等依赖项,而是会尝试选择现有的依赖项。锁文件bun.lockb是bun的二进制锁文件格式。至于为什么选择二进制,直接的原因是为了性能,存储更快的原因是它对所有数据都使用了线性数组。包由自动递增的整数ID或包名称的哈希值引用。长度超过8个字符的字符串将被去除。锁文件在保存到磁盘之前,通过垃圾回收(GC)和遍历包的树结构进行排序,然后根据依赖关系下载包。脚本运行器bunrun是一个快速的package.json脚本运行器bunrun${script-name}运行相当于npmrunscript-name。例如,bunrundev运行package.json中的dev脚本。bunrun会自动将环境变量从.env加载到shell/task中。.env文件的加载优先级与bun的其余部分相同:.env.local首先加载if($NODE_ENV==="production").env.productionelse.env.development.env如果出现问题,您可以运行bunrunenv来获取环境变量列表。问题当前问题Zig的问题Zig是一种相对较新的(2016年)语言。它的生态和安全性值得考虑。同时如果底层有什么问题,懂这门语言的人很少,容易卡住主要是太被动的问题Issue目前有284个Issues(2022.07.27),其中一些特别重要,影响生态性能的问题很多常用的,比较重要的功能还没有支持,例如:treeShakingSourcemapsCodesplittingCSScompression具体可以看这里总结一下。目前,包子已有的功能已经不能满足正常的生产需要。我们只能在开发一些小工具的时候用它来试用一下它的结构。专用的下载器、TypeScript&JSX开箱即用、内置的nodeAPI等等目前看来还蛮好吃的,但是也存在我上面提到的一些问题。包子蛋糕很大很圆,但是以后真的能吃到,我们拭目以待。酒吧
