创建 React App 的更好方法

2025-06-07

创建 React App 的更好方法

如果你尝试过 React,那么你很可能至少用过create-react-app一次。如果你很幸运,还没有用过,那么接下来就是:

你可以这样运行:

npx create-react-app my-app
Enter fullscreen mode Exit fullscreen mode

并观察以下控制台输出:

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
Enter fullscreen mode Exit fullscreen mode

是的,您已经拥有近 1.5 千个软件包和一些漏洞。

想看点吓人的东西吗?检查一下文件夹大小:

du -hc -s  node_modules
# 318M  node_modules
Enter fullscreen mode Exit fullscreen mode

难怪会出现这样的情况:
宇宙中最重的物体: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
Enter fullscreen mode Exit fullscreen mode

导航到文件夹并安装依赖项:

cd my-vite-react-app && npm install
Enter fullscreen mode Exit fullscreen mode

这样就快得多,也不那么贪婪了:

added 87 packages, and audited 88 packages in 5s

8 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Enter fullscreen mode Exit fullscreen mode

而且它所需的空间也减少了近十倍:

du -hc -s  node_modules
# 37M   node_modules
Enter fullscreen mode Exit fullscreen mode

如果你需要一个能够替代 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
Enter fullscreen mode Exit fullscreen mode

接下来,安装 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
Enter fullscreen mode Exit fullscreen mode

预计其尺寸是最小的:

du -hc -s  node_modules
# 14M   node_modules
Enter fullscreen mode Exit fullscreen mode

做好准备:是时候进行承诺的修补了🧑‍🔬

创建一个包含公共文件的文件夹:

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 
Enter fullscreen mode Exit fullscreen mode

还有一些源文件:

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
Enter fullscreen mode Exit fullscreen mode

最后,运行开发服务器:

./node_modules/.bin/esbuild src/main.jsx --servedir=public --outdir=public/dist  --bundle
Enter fullscreen mode Exit fullscreen mode

真的成功了😄
如果你愿意接受一些挑战 - 我鼓励你在页面中添加一些资源,例如之前某个应用的 SVG 徽标。你需要为此设置一个加载器😉。

不过我必须补充一点:目前还没有一个快速简便的方法来实现热模块替换。说实话,开箱即用,每次更改都需要手动刷新页面,但实时刷新更容易实现。

结论

Create-react-app 速度慢且笨重,而 Vite 则提供了更流畅的开发者体验,并且开箱即用。但是,如果你正在构建一个大型项目,或者需要尽可能小的内存占用,那么 esbuild 值得考虑。

文章来源:https://dev.to/valeriavg/better-ways-to-create-react-app-3p50
PREV
打造 Hounty:循序渐进
NEXT
API 究竟是什么?API 的含义