用纯React和Bun
前言
本文是“日本大学2023年圣诞日历”的第五天的文章。
最近Bun以其「性能优异」的表现而在各个地方成为话题,但其卓越之处不仅在于性能,还包含了各种功能。
在众多选项中,本次我们将尝试使用Bun作为打包工具和转译器,构建一个纯React环境?
已完成的事情
最终依赖
非常简单,对吧?
{
"devDependencies": {
"@types/react": "^18.2.42",
"@types/react-dom": "^18.2.17",
"@types/web": "^0.0.125",
"bun-types": "latest"
},
"peerDependencies": {
"typescript": "^5.0.0"
},
"dependencies": {
"react": "^18.2.0",
"react-dom": "^18.2.0"
}
}
仓库的初始化
建立Bun的环境配置
本次我们将源代码的入口点设为src/index.tsx。
安装Deps
安装所需的包。只需这个命令就能初步运行React。
设定命名空间
由于Bun中不存在像document这样的浏览器命名空间,所以需要安装@types/web,并将其添加到tsconfig.json的”types”中。
写最基本的代码
首先,我们可以简单地创建一个脚本的入口点,如下所示。
没有引入任何库,突然间插入标签可能会让人担心,但没关系的。Bun的包管理器默认支持JSX。
import { StrictMode } from "react"
import { createRoot } from "react-dom/client"
import { App } from "./App"
const rootElement = document.getElementById("root")! // これが取得できなければエラーで止まるべき
const root = createRoot(rootElement)
root.render(
<StrictMode>
<App />
</StrictMode>
)
是一个普通的React组件,没有什么特别之处。
我们这次随便这样处理吧:
import { useState } from "react"
export const App = () => {
const [cnt, setCnt] = useState(0)
return (
<div>
<h1>bun!</h1>
<button onClick={() => setCnt((prev) => prev + 1)}>count: {cnt}</button>
</div>
)
}
好的,这是一个了不起的SPA完成了!
我来试着构建一下
让我们立即进行构建。
% bun build ./src/index.tsx --outdir ./build

后续需要修正的是,可能存在未经Minify处理的代码或者开发环境下生成的React版本输出。
动作检查
我将创建 build/index.html,并尝试将刚刚构建的 index.js 附加上去。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Bun-Minimal-React</title>
</head>
<body>
<div id="root"></div>
<noscript>
JavaScript is disabled! You need JavaScript to view this page.
</noscript>
<script src="index.js" defer></script>
</body>
</html>
让我们尝试通过启动本地服务器或双击打开 build/index.html 文件。

你的表现真是出色啊,而且操作起来真的很方便!
让我们尝试进行生产构建
请你看一下刚刚构建完成的屏幕。
% bun build ./src/index.tsx --outdir ./build
./index.js 962.62 KB
[20ms] bundle 11 modules
尽管只实现了基本的计数功能,但仍然可以生成大型捆绑包。这是不可接受的,所以我们会创建小型捆绑包。
% NODE_ENV=production bun build ./src/index.tsx --outdir ./build --minify
./index.js 138.29 KB
[9ms] bundle 8 modules
变得小了呢。
编译只用了9毫秒就结束了。快!
虽然情报有限,但潜力是存在的。
当你真正想要创造一些东西时,可能会涉及许多任务,例如引入CSS助手和设置路由等。不过,如果只是让React本身运转起来,只需要这么一点代码就可以了。而且构建速度也很快,一旦过程被建立起来,还有可能改善开发体验。
这次我尝试使用Bun的包管理器和转译器,但Bun中还搭载了其他诸如SQLite3驱动和Jest兼容的测试引擎等各种不同的工具。如果能参与到这些生态系统中,感觉可以做很多有趣的事情!期待有人能写篇文章来介绍一下!
附加:我尝试着做一个类似SPA框架的东西
為了撰寫這篇文章,我試圖開發一個能盡可能利用Bun生態系統進行調查的框架。
由於仍在開發中,可能還存在一些問題。由於資料有限,我有些不知如何下手,所以如果有改進建議或者合適的文章題材,請一定告訴我。
演示地址:https://avaice.github.io/bun-minimal-react/