React -搭建项目使用webpack

39 阅读2分钟

项目初始化

首先需要准备一个文件 进行初始化

mkdir react-web  创建一个文件 叫 react-web mldir 是创建命令
cd react-web  cd 进入 这个项目文件
npm init -y

安装基础依赖

需要在package.json 里配置

{
  "name": "react-web",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "webpack --config config/webpack.prod.js",
    "start": "webpack serve --config config/webpack.dev.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "browserslist": [
    "last 2 versions",
    "> 1%",
    "not dead"
  ],
  "devDependencies": {
    "@babel/core": "^7.13.8",
    "@babel/preset-env": "^7.13.8",
    "@babel/preset-react": "^7.12.13",
    "babel-loader": "^8.2.2",
    "chalk": "^4.1.0",
    "clean-webpack-plugin": "^3.0.0",
    "css-loader": "^5.1.0",
    "html-webpack-plugin": "^5.2.0",
    "ip": "^1.1.5",
    "postcss-loader": "^7.0.1",
    "postcss-preset-env": "^7.7.2",
    "progress-bar-webpack-plugin": "^2.1.0",
    "speed-measure-webpack-plugin": "^1.4.2",
    "style-loader": "^2.0.0",
    "webpack": "^5.24.2",
    "webpack-cli": "^4.5.0",
    "webpack-dev-server": "^3.11.2"
  },
  "dependencies": {
    "antd": "^4.22.4",
    "babel-preset-react-app": "^10.0.1",
    "co": "^4.6.0",
    "lodash": "^4.17.21",
    "react": "^17.0.1",
    "react-dom": "^17.0.1",
    "react-redux": "^8.0.2",
    "react-router-dom": "^5.3.0",
    "redux": "^4.2.0",
    "redux-saga": "^1.1.3",
    "redux-thunk": "^2.4.1"
  }
}

webpack 配置

区分生产开发环境

touch webpack.common.js # 开发环境 和 生产环境 公共配置 存放在这个文件里面
touch webpack.dev.js # 需要针对开发环境特殊处理的配置存放在这里 
touch webpack.prod.js # 需要针对生产环境特殊处理的配置存放在这里
touch paths.js 创建路径调用的配置文件

image.png

设置公共环境配置
webpack.common.js 文件

const paths = require("./paths");
const HtmlWebpackPlugin = require("html-webpack-plugin");
// 返回处理样式的loader 的函数
const getStyleLoader = (pre) => {
  return [
    "style-loader",
    "css-loader",
    {
      // 处理css 兼容性问题
      // 配合package.json 中 browserslist 来指定兼容性
      loader: "postcss-loader",
      options: {
        postcssOptions: {
          plugins: ["postcss-preset-env"],
        },
      },
    },
    pre,// 处理 sass less stylus
  ].filter(Boolean);
};

module.exports = function (options) {
    console.log(options,'options');
  return {
    mode: options.mode,
    entry: paths.appSrc,
    resolve: {
        alias: {
          '@': paths.appSrc,
        },
      },
    output: {
      path: paths.appBuild,
      publicPath: "/",
    },
    cache: {
      // 使用持久化缓存
      type: "filesystem", //memory:使用内容缓存 filesystem:使用文件缓存
    },
    devtool: false,
    module: {
      rules: [
        // 处理css
        {
          test: /\.css$/,  
          use: getStyleLoader(),
        },
        {
          test: /\.less$/,
          use: getStyleLoader("less-loader"),
        },
        {
          test: /\.s[ac]ss$/,
          use: getStyleLoader("sass-loader"),
        },
        {
          test: /\.styl$/,
          use: getStyleLoader("stylus-loader"),
        },
        // 处理图片
        {
         test:/\.(jpe?g|png|svg|gif|webp)/,
         type:"asset",
         parser:{
            dataUrlCondition: {
                maxSize: 10 * 1024,
            },
         }
        },
        // 处理其他资源
        {
            test:/\.(woff?g|woff)/,
            type:"asset/resource",
        },
        // 处理js
        {
          test: /\.jsx?$/,
          exclude: /node_modules/,
          use: [
            {
              loader: "babel-loader",
               
            },
          ],
        },
      ],
    },
 devServer:options.devServer||{},
    plugins: [
      new HtmlWebpackPlugin({
        template: "./public/index.html",
      }),
      ...options.plugins,
    ],
    stats: options.stats, // 打包日志发生错误和新的编译时输出
  };
};

webpack.dev.js 开发环境的配置

module.exports = require("./webpack.common")({
    mode: "development",
    plugins: [],
    stats: "errors-only", //只在发生错误或有新的编译时输出
    devServer: {
        headers: {
          'Access-Control-Allow-Origin': '*'
        },
        open: true, // 自动在浏览器打开
        sockHost: 'localhost',
        disableHostCheck: true, // 防止一直发起socket检测请求
        proxy: {
          '/': {
            target: 'https://api.wpbom.com/api/',
            changeOrigin: true,
            pathRewrite: {
   '^/': '/' // 这里理解成用‘/api’代替target里面的地址,后面组件中我们掉接口时直接用api代替
            }
          }
        },
        hot: true
      },
});

webpack.prod.js 生产环境的配置

const { CleanWebpackPlugin } = require("clean-webpack-plugin"); //打包前清空build目录文件
const ProgressBarPlugin = require("progress-bar-webpack-plugin"); // 打包进度条美化
const chalk = require("chalk");

module.exports = require("./webpack.common")({
    mode: "production",
    devtool: "source-map",
    plugins: [
        new CleanWebpackPlugin(),
        new ProgressBarPlugin({
            format:
                `${chalk.green.bold("build[:bar]")} ` +
                chalk.green.bold(":percent") +
                " (:elapsed seconds)",
            clear: false,
            width: 60,
        }),
    ],
    stats: "normal", //标准输出
});

babel.config.js 用于转换es5

module.exports ={
    presets: ["@babel/preset-env", "@babel/preset-react"]
}

配置public 作为react 渲染容器

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Webpack-React-Cli</title>
    </head>
    <body>
        <div id="root"></div>
    </body>
</html>

根目录配置入口文件index.js

import React from "react";
import ReactDOM from "react-dom";
import App from './App'

ReactDOM.render(<App />, document.querySelector("#root"));

配置目录

image.png components 存放一般公用组件
reducers 处理接口数据
router 集中式路由管理
views 路由式组件