使用 Webpack 5 搭建 React 19 项目指南

项目结构概览

my-react-app/
├── public/
│   └── index.html       # HTML 入口模板
├── src/
│   ├── App.jsx         # React 主组件
│   └── index.js        # 应用入口文件
├── .babelrc            # Babel 配置
├── webpack.config.js   # Webpack 核心配置
└── package.json        # 项目依赖和脚本

1. 项目初始化与依赖管理

1.1 创建项目基础

mkdir my-react-app && cd my-react-app
npm init -y  # 快速生成 package.json

你可以使用以下指令来安装这些依赖,同时我也附上了每个依赖的作用说明。

安装项目的依赖

运行以下命令安装 生产依赖(dependencies)

npm install react@19.0.0 react-dom@19.0.0
  • react:核心库,提供 React 组件和 API。
  • react-dom:用于在浏览器环境中渲染 React 组件。

运行以下命令安装 开发依赖(devDependencies)

npm install -D @babel/core@7.26.8
npm install -D @babel/plugin-transform-runtime@7.26.8
npm install -D @babel/preset-env@7.26.8
npm install -D @babel/preset-react@7.26.3
npm install -D babel-loader@9.2.1
npm install -D html-webpack-plugin@5.6.3
npm install -D webpack@5.97.1
npm install -D webpack-cli@6.0.1
npm install -D webpack-dev-server@5.2.0

依赖作用说明

Babel 相关
  • @babel/core:Babel 的核心库,用于转译 JavaScript 代码。
  • @babel/plugin-transform-runtime:优化 Babel 转译结果,减少冗余代码,提高性能。
  • @babel/preset-env:自动根据目标环境(如浏览器)转译 JavaScript 代码,确保兼容性。
  • @babel/preset-react:用于编译 React 代码(JSX 语法)。
Webpack 相关
  • babel-loader:让 Webpack 兼容 Babel,使其能正确解析 ES6+ 语法和 JSX。
  • html-webpack-plugin:自动生成 HTML 文件,并将 Webpack 构建后的 JS/CSS 资源插入其中。
  • webpack:核心打包工具,将 JS、CSS、图片等资源进行打包优化。
  • webpack-cli:Webpack 的命令行工具,提供 webpack 相关的 CLI 命令。
  • webpack-dev-server:本地开发服务器,支持热更新,提高开发效率。
完整配置文件
{
  "name": "webpack_create_react",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack serve --mode development",
    "build": "NODE_ENV=production webpack --progress",
    "analyze": "npm_config_report=true npm run build"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
    "react": "^19.0.0",
    "react-dom": "^19.0.0"
  },
  "devDependencies": {
    "@babel/core": "^7.26.8",
    "@babel/plugin-transform-runtime": "^7.26.8",
    "@babel/preset-env": "^7.26.8",
    "@babel/preset-react": "^7.26.3",
    "babel-loader": "^9.2.1",
    "html-webpack-plugin": "^5.6.3",
    "webpack": "^5.97.1",
    "webpack-cli": "^6.0.1",
    "webpack-dev-server": "^5.2.0"
  }
}
 

2. Webpack 深度配置

2.1 核心配置文件 (webpack.config.js)

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
 
module.exports = {
  entry: './src/index.js',
  output: {
    filename: '[name].[contenthash].js',
    path: path.resolve(__dirname, 'dist'),
    clean: true, // 自动清理构建目录
    publicPath: '/'
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: { cacheDirectory: true } // 启用 Babel 缓存
        }
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './public/index.html',
      favicon: './public/favicon.ico' // 可选 favicon 配置
    })
  ],
  resolve: {
    extensions: ['.js', '.jsx'], // 自动解析扩展名
    alias: { // 路径别名配置
      '@': path.resolve(__dirname, 'src/')
    }
  },
  devServer: {
    static: {
      directory: path.join(__dirname, 'public') // 静态资源目录
    },
    port: 3000,
    historyApiFallback: true, // 支持 SPA 路由
    hot: true, // 启用热更新
    open: true // 自动打开浏览器
  },
  optimization: {
    splitChunks: { // 代码分割优化
      chunks: 'all'
    }
  }
}

2.2 关键配置解析

  1. 输出配置优化

    • [contenthash] 实现长效缓存
    • clean: true 自动清理构建目录
  2. 模块解析增强

    • 路径别名 (@/) 简化模块导入
    • 自动扩展名识别提升开发体验
  3. 开发服务器特性

    • 热模块替换(HMR)实现局部更新
    • history API 回退支持前端路由
    • 错误覆盖层提升调试效率

3. Babel 现代语法支持

3.1 .babelrc 配置文件

{
  "presets": [
    ["@babel/preset-env", {
      "targets": "> 0.25%, not dead",
      "useBuiltIns": "usage",
      "corejs": 3
    }],
    "@babel/preset-react"
  ],
  "plugins": [
    "@babel/plugin-transform-runtime"
  ]
}

配置解析:

  • preset-env 智能 polyfill
    • 按需加载 core-js 3 polyfill
    • 基于 browserslist 的浏览器兼容策略
  • preset-react 支持最新 JSX 语法
  • transform-runtime 减少代码重复

4. 工程脚本配置

4.1 package.json 脚本增强

{
  "scripts": {
    "start": "webpack serve --mode development",
    "build": "NODE_ENV=production webpack --progress",
    "analyze": "npm_config_report=true npm run build"
  }
}

脚本说明:

  • start: 开发模式启动
    • 集成 source map
    • 错误信息友好提示
  • build: 生产构建
    • 自动压缩优化
    • 生成构建进度报告
  • analyze: 打包分析(需安装 webpack-bundle-analyzer)

5. React 应用架构

5.1 组件化入口 (src/App.jsx)

import React from 'react'
 
const App = () => (
  <main className="app-container">
    <h1>🚀 Webpack 5 + React 19</h1>
    <p>Modern Frontend Boilerplate</p>
  </main>
)
 
export default App

5.2 应用启动入口 (src/index.js)

import React from 'react'
import { createRoot } from 'react-dom/client'
import App from '@/App'
 
const container = document.getElementById('root')
const root = createRoot(container)
root.render(<App />)

5.3 HTML 模板 (public/index.html)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>现代 React 工程化模板</title>
</head>
<body>
  <div id="root"></div>
  <!-- 可添加 noscript 提示 -->
</body>
</html>

6. 开发工作流

6.1 启动开发环境

npm start

6.2 生产构建

npm run build
  • 生成优化后的静态文件到 /dist
  • 自动生成资源哈希指纹
  • 开启 Tree Shaking 优化

扩展建议

1. 样式处理方案

npm install -D style-loader css-loader postcss-loader postcss-preset-env
  • 支持 CSS Modules
  • 自动添加浏览器前缀
  • 支持 Sass/Less 预处理器

2. 静态资源处理

// webpack.config.js
module: {
  rules: [
    {
      test: /\.(png|svg|jpg|jpeg|gif)$/i,
      type: 'asset/resource'
    }
  ]
}

3. 性能优化

  • 配置 cache 选项提升构建速度
  • 添加 BundleAnalyzerPlugin 分析包体积
  • 开启 gzip 压缩

常见问题排查

  1. Babel 转换异常

    • 确认 .babelrc 文件位置正确
    • 检查 preset 版本兼容性
  2. HMR 不生效

    • 确保 devServer.hot 设为 true
    • 检查 React 组件是否使用默认导出
  3. 生产构建失败

    • 清理 node_modules 后重新安装
    • 检查 Node.js 版本是否符合要求(建议 v14+)

最佳实践建议

  1. 版本锁定

    • 使用 package-lock.json 确保依赖一致性
    • 定期执行 npm outdated 检查更新
  2. 代码规范

    • 集成 ESLint + Prettier
    • 添加 commitlint 规范提交信息
  3. 持续集成

    • 配置 GitHub Actions 自动化流程
    • 添加单元测试框架(Jest + Testing Library)