用最轻的方式从头创建一个 React APP
使用 esbuild 替换 creat-react-app,npm 依赖仅 17M,毫秒级构建速度。
阅读时间 2 分钟
咱第一次接触 React 和 JavaScript 生态搞前端开发的时候,按照 React 官网教程 使用 create-react-app
创建了一个 Hello, World! 项目,npm 依赖大小达到恐怖的 200M。
一部分原因是 react 作为库而不是框架,本身不提供打包、转译等开发和调试功能。create-react-app
(简称 CRA)做的工作是帮助用户创建 src public 等目录结构,设置好 webpack 打包器、babel 转译器、webvital 测试之类的辅助工具。正是这些与 react 无关的依赖占了大部分空间。
而这些开发工具配置又复杂难懂,尤其是 webpack 不仅配置难写难看,打包性能还低。正好有个超快的打包器 esbuild
,官网贴了打包 three.js
的速度,可以说是秒天秒地。正如其名,esbuild
适合在支持 es6 语法的浏览器上使用。用在大生产环境不合适,但用在自己的玩具上还是没问题的,不会有开发者还在跑 Chrome 51 吧(
create-react-app
整个 CRA 框架可以看作一个黑盒子,输入 src 目录中的 js 文件和 public 中的静态文件,然后
-
打包 src 中的 js 和引用到的依赖库,生成一个巨大的 index.js
-
做一些简单的字符串替换,生产 index.html
-
复制静态文件到产物目录
esbuild
相比之下 esbuild 做的事情简单很多。esbuild 读入 JavaScript 和他的依赖并打包出 index.js。简单,我喜欢。
动手
安装依赖
首先创建空目录,初始化 npm 包。
mkdir test
cd test
mkdir -p src build
npm init -y
接着安装必要的依赖,安装后大小只有 17M,相比于 CRA 的 200M 算是非常小了。react-router-dom
是可选的。
npm install react react-dom react-router-dom esbuild
编写代码
创建 src/index.jsx
文件,这是我们 react 应用的入口,它负责在 id="root"
的节点上渲染出 react 应用。
import React from "react";
import ReactDOM from "react-dom/client";
const App = () => {
return <h1>Hello, World!</h1>;
};
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
接着创建 build/index.html
文件,它负责载入 打包好的 js 文件。
<!DOCTYPE html>
<html>
<head></head>
<body>
<div id="root"></div>
<script type="module" src="./index.js"></script>
</body>
</html>
开始打包
最后一步,使用 esbuild 打包。修改 package.json
类似如下
{
"script": {
"build": "esbuild src/index.jsx --bundle --minify --sourcemap --outfile=build/index.js"
}
}
运行 npm run build
即可瞬间打包好啦。
build/index.js 138.3kb
build/index.js.map 339.8kb
⚡ Done in 55ms
浏览器直接打开 index.html,一切正常 👍
使用 preact 替代 react
首先安装 preact
的兼容层 preact/compat
npm install @preact/compat
在 esbuild 中替换 react 模块为 preact
esbuild src/index.jsx --bundle --minify --sourcemap --alias:react=preact/compat --alias:react-dom=preact/compat --outfile=build/index.js
进一步缩小构建产物大小
build/index.js 21.3kb
build/index.js.map 144.8kb
⚡ Done in 15ms
写在最后
我自己的玩具 msw-open-music 目前就是使用这种方式构建。大大减小 npm 依赖后咱自己架在国内的 CI/CD 机器因为 npm install 超时而失败的情况基本不存在了。目前一切都工作很好。