创建 React App 的更好方法
如果你尝试过 React,那么你很可能至少用过create-react-app
一次。如果你很幸运,还没有用过,那么接下来就是:
你可以这样运行:
npx create-react-app my-app
并观察以下控制台输出:
Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts with cra-template...
added 1394 packages in 44s
209 packages are looking for funding
run `npm fund` for details
Initialized a git repository.
Installing template dependencies using npm...
added 55 packages in 4s
209 packages are looking for funding
run `npm fund` for details
Removing template package using npm...
removed 1 package, and audited 1449 packages in 3s
209 packages are looking for funding
run `npm fund` for details
6 high severity vulnerabilities
是的,您已经拥有近 1.5 千个软件包和一些漏洞。
想看点吓人的东西吗?检查一下文件夹大小:
du -hc -s node_modules
# 318M node_modules
我很困惑为什么这是推荐的方法,但很高兴这不是唯一的方法。
一体式:Vite
Vite是一个包含多个框架的捆绑器和开发服务器,包括带有或不带有 TypeScript 的 React。
要使用 Vite 运行创建应用程序:
npm create vite@latest my-vite-react-app
# ✔ Select a framework: › react
# ✔ Select a variant: › react
#
# or
#
npm create vite@latest my-vite-react-app -- --template react
导航到文件夹并安装依赖项:
cd my-vite-react-app && npm install
这样就快得多,也不那么贪婪了:
added 87 packages, and audited 88 packages in 5s
8 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
而且它所需的空间也减少了近十倍:
du -hc -s node_modules
# 37M node_modules
如果你需要一个能够替代 create-react-app 并拥有其所有功能的插件,那么现在就停止阅读吧。没有比 vite 更好的了。
对于那些渴望以牺牲简单性为代价进一步推进它的人,我还有一个选择😎
追求速度:esbuild
让我们更深入地了解 create-react-app (CRA) 和 vite 的内部原理。它们都是一组配置为协同工作的各种工具。CRA 依赖webpack来打包文件,而 vite 则使用更现代的rollup。然而,它们都是用 JavaScript 编写的,因此受限于 NodeJS 脚本本身的性能。
输入esbuild:用 Go 编写,据称比任何其他流行的捆绑程序快 10-100 倍。
然而,有一个问题:它只是一个打包器。它没有提供创建应用程序的单行代码,需要一些调整才能启动并运行开发服务器。
让我们首先创建一个文件夹:
mkdir my-esbuild-app && cd my-esbuild-app
接下来,安装 esbuild 和 react 依赖项:
npm init -y && npm install esbuild --save-dev && npm i react react-dom --save
# added 7 packages, and audited 8 packages in 828ms
# found 0 vulnerabilities
预计其尺寸是最小的:
du -hc -s node_modules
# 14M node_modules
做好准备:是时候进行承诺的修补了🧑🔬
创建一个包含公共文件的文件夹:
mkdir public &&
echo '<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Esbuild + React</title>
<link rel="stylesheet" href="/dist/main.css" />
</head>
<body>
<div id="root"></div>
<script src="/dist/main.js"></script>
</body>
</html>' > public/index.html
还有一些源文件:
mkdir src &&
echo ':root {
font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 24px;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-text-size-adjust: 100%;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}
#root {
display: flex;
align-items: center;
justify-content: center;
flex: 1;
}' > src/index.css &&
echo 'import React, { useState } from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
const App = () => {
const [count, setCount] = useState(0);
return (
<div className="App">
<h1>Esbuild + React</h1>
<div className="card">
<button onClick={() => setCount((count) => count + 1)}>
count is {count}
</button>
</div>
</div>
);
};
ReactDOM.createRoot(document.getElementById("root")).render(
<React.StrictMode>
<App />
</React.StrictMode>
);' > src/main.jsx
最后,运行开发服务器:
./node_modules/.bin/esbuild src/main.jsx --servedir=public --outdir=public/dist --bundle
真的成功了😄
如果你愿意接受一些挑战 - 我鼓励你在页面中添加一些资源,例如之前某个应用的 SVG 徽标。你需要为此设置一个加载器😉。
不过我必须补充一点:目前还没有一个快速简便的方法来实现热模块替换。说实话,开箱即用,每次更改都需要手动刷新页面,但实时刷新更容易实现。
结论
Create-react-app 速度慢且笨重,而 Vite 则提供了更流畅的开发者体验,并且开箱即用。但是,如果你正在构建一个大型项目,或者需要尽可能小的内存占用,那么 esbuild 值得考虑。
文章来源:https://dev.to/valeriavg/better-ways-to-create-react-app-3p50