webpack5 从 0 到 1 创建一个最简单的 react 项目

一、项目初始化

  1. 新建文件夹,作为项目根路径
// 创建文件夹
mkdir Demo

// 删除文件夹
rm -rf Demo
  1. 限定项目 node 版本
// 创建文件
touch .nvmrc

// 版本
22.13.0
  1. 初始化 package.json
// 此行为会生成一个包含 name、version、main、license 的对象
yarn init -y
  1. 安装 webpackwebpack-cliwebpack-dev-serverhtml-webpack-plugintypescriptts-loader
// 仅在开发环境构建项目
yarn add webpack webpack-cli webpack-dev-server html-webpack-plugin typescript ts-loader -D
  1. 安装 reactreact-dom@types/react@types/react-dom
// 需要作为依赖
yarn add react react-dom @types/react @types/react-dom

二、webpack 基本配置

  1. 根目录下新建 webpack.config.jssrc/index.jspublic/index.htmltsconfig.json
touch webpack.config.js
touch tsconfig.json

mkdir src
touch src/index.js

mkdir public
touch public/index.html
  1. webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  // 环境
  mode: 'development',
  devtool: 'cheap-module-source-map',
  // 入口
  entry: {
    index: './src/index.tsx'
  },
  // 出口
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: '[name].bundle.js'
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: 'webpack 搭建 react 项目',
      template: path.resolve(__dirname, './public/index.html'),
      filename: 'index.html'
    })
  ],
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/
      }
    ]
  },
  // 启动
  devServer: {
    // 启动是否自动打开网页
    open: true,
    // 模块热更新
    hot: true,
    // 端口号
    port: 8888
  },
  resolve: {
    // 配置能够被解析的文件扩展名
    extensions: ['.mjs', '.js', '.ts', '.tsx', '.json', '.jsx']
  }
}
  1. src/index.js
// react 18 之后的写法
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

// react 18 之前的写法
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));
  1. public/index.html
<!DOCTYPE html>
<html lang="en">

<head>
  <title><%= htmlWebpackPlugin.options.title %></title>
</head>

<body>
  <div id="root"></div>
</body>

</html>
  1. tsconfig.json

    {
      "compilerOptions": {
     "outDir": "./dist/",
     // "rootDir": "./src",
     "sourceMap": true, // 开启 sourcemap
     "module": "commonjs",
     "target": "es5",
     "jsx": "react",
     "esModuleInterop": true,
     "allowJs": true,
     "strict": true
      }
    }

三、启动构建脚本

package.json 中添加脚本

{
// ...
"scripts": {
    "start": "webpack serve",
    "build": "webpack",
    "watch": "webpack --watch"
}
// ...
}

四、完成启动

yarn start


起风了
120 声望35 粉丝

北冥有鱼,其名为鲲。鲲之大,不知其几千里也;化而为鸟,其名为鹏。鹏之背,不知其几千里也;怒而飞,其翼若垂天之云。是鸟也,海运则将徙于南冥。南冥者,天池也。