从0到1搭建react 工程化前端项目

news/2024/7/15 17:57:32 标签: 前端, react.js, javascript

一、npm init 初始化包管理

  • 1.在使用该命令之前,创建一个文件夹,例如:reactDemo
  • 2.使用在电脑终端命令行工具中,找到1创建的文件夹,并转到改文件夹指定目录;
  • 3.执行 npm init
  • 4.如图所示:

在这里插入图片描述

  • 5.执行命令后,会在文件夹下创建一个package.json 文件,用于管理项目各种依赖和对应的配置参数

在这里插入图片描述

二、创建项目文档架构、添加依赖、配置webpack

1.一般地,工程化项目文件需要分模块,下面笔者进行如下的划分:

  • 2.1 在项目根目录下,创建src文件夹
  • 2.2 在src 创建 pages文件夹,用于存放各个模块页面
  • 2.3 创建webpack.config.js 与 babel.config.js 分别用于 webpack 配置和babel 配置,配置具体内容在1.6介绍

在这里插入图片描述

  • 1.4在正式配置webpack 之前,需要将需要用到的工具包进行下载,那么,我们在刚刚创建的package.json 中添加对应包,配置如下:
javascript">{
  "name": "reactdemo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack-dev-server",
    "build": "webpack"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/cli": "^7.21.0",
    "@babel/core": "^7.21.0",
    "@babel/preset-react": "^7.18.6",
    "babel-loader": "^9.1.2",
    "clean-webpack-plugin": "^4.0.0",
    "css-loader": "^6.7.3",
    "html-webpack-plugin": "^5.5.0",
    "i": "^0.3.7",
    "less-loader": "^11.1.0",
    "mini-css-extract-plugin": "^2.7.5",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-router": "^6.10.0",
    "react-router-dom": "^6.10.0",
    "style-loader": "^3.3.2",
    "terser-webpack-plugin": "^5.3.7",
    "webpack": "^5.76.2",
    "webpack-bundle-analyzer": "^4.8.0",
    "webpack-cli": "^5.0.1",
    "webpack-dev-server": "^4.11.1"
  }
}

其中,script 是配置webpack对应的构建命令行,执行 npm run dev 可以执行webpack-dev-server 本地命令
devDependencies选项为对应的依赖

  • 1.5 配置好package.json 后,在命令行执行npm install ,便会把对应的文件下载到 node/modules 文件夹中,在项目按需引入对应的模块即可;
  • 1.6 下面进行webpack 配置,配置如下所示:
javascript">const path = require("path")
const htmlWebpackPlugin = require("html-webpack-plugin")
const { CleanWebpackPlugin } = require("clean-webpack-plugin")
const miniCssExtractPlugin = require("mini-css-extract-plugin")
const TerserPlugin = require("terser-webpack-plugin")
const Anlyzer = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;

module.exports = {
    entry: {
        index: {
            import: "./src/index.js",//webpack 打包入口
        },
        react: ['react'],
        "react-dom": ['react-dom'],
        "react-router-dom": ['react-router-dom'],
    },
    watch: false,
    output: {
        path: path.join(__dirname, "./dist"),
        filename: '[name].[chunkhash].js',
        publicPath: "/",
        asyncChunks: true,
        chunkFilename: `[name].[contenthash:8].async.js`
    },
    mode: "development",
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                use: {
                    loader: "babel-loader",
                    options: {
                        exclude: /node_modules/gi,
                        cacheDirectory: true,
                    }
                }
            }, {
                test: /\.(less)$/,
                use: [miniCssExtractPlugin.loader, 'css-loader', 'less-loader'],
                include: /src/
            }
        ]
    },
    optimization: {
        chunkIds: "deterministic",
        minimize: true,
        minimizer: [
            new TerserPlugin({
                terserOptions: {//压缩文件
                    format: {
                        comments: false,
                        max_line_len: true,
                        beautify: true,
                        ascii_only: true,
                        preserve_annotations: true,
                    }
                },
                extractComments: false
            })
        ],
        splitChunks: {
            chunks: "all"
        }
    },

    resolve: {
        extensions: ['.js', '.json', '.jsx']
    },
    plugins: [
        new htmlWebpackPlugin({
            template:"./public/index.html",//使用指定html作为模板,在文件中引入打包后的资源文件
        }),
        new CleanWebpackPlugin(),
        new miniCssExtractPlugin({
            filename: '[name].[contenthash:8].css',
            chunkFilename: '[name].[contenthash:8].chunk.css'
        }),
        // new Anlyzer()
    ],

    devServer: {
        server: "http",
        static: {
            directory: path.join(__dirname, "/"),
            watch: {
                ignored: "*.jsx",
                usePolling: false,
            },
            serveIndex: true
        },
        allowedHosts: ['.host.com'],
        port: "9000",
        hot: true,
        historyApiFallback: true
    }
}
  • 1.7 babel 配置如下
javascript">module.exports={
    "presets":["@babel/preset-react"]
}

三、编写react代码

  • 3.1 创建 app.js 文件,添加如下代码,代码创建了一个函数组件,具体内容如下
javascript">import React from "react";

function WelcomeClass({ props }) {
    return <h1>Hello,{props}</h1>
}

export default WelcomeClass

其中,props 是父组件向其传递的参数

  • 3.2 创建index.js 创建一个根组件,并引入31创建的子组件,代码如下所示;
javascript">import React from "react"
import App from "./app"
import { createRoot }  from "react-dom/client"
const root = createRoot(document.getElementById("app"))
root.render(
    <React.StrictMode>
        <App props={'DD'}/>
    </React.StrictMode>
)

注意事项 document.getElementById(“app”) 需要在index 文件中,创建一个id 为app 的标签。
这个 html 文件,在**/public/index.html** 中,也是webpack 配置 中,hmlt-webpack-plugin 指定的文件
html文件如下所示
在这里插入图片描述

<!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>Document</title>
</head>
<body>
    <div id="app"></div>
</body>
</html>

四、启动项目

  • 4.1 在 vscode 使用终端工具 打开对应项目执行 npm run dev 命令,如下图所示
    在这里插入图片描述
    4.2 等构建成功后,在浏览器打开http://localhost:9000/ 效果如下图:
    在这里插入图片描述

http://www.niftyadmin.cn/n/245926.html

相关文章

rancher部署flink集群

rancher版本&#xff1a;v2.6.8 k8s版本&#xff1a;v1.22.13rke2r1 flink集群版本&#xff1a;1.15.0 flink安装模式&#xff1a;session cluster 写在前面&#xff1a;因为参照官网的说明安装过程中出现了很多问题&#xff0c;特记录于此&#xff0c;避免后续重复踩坑 目…

变压器计算—12V1A为例

1、初级圈数NP(Vinmin*Tonmax)/(Ae*Bmax) Vinmin:最小输入电压一般按AC输入90v计算&#xff0c;换算成直流是90*1.4126V Tonmax:最大导通时间如f65K(常用的一个频率) …

MySQL数据库,聚合查询

目录 1、聚合查询 1.1聚合函数 1.1.1count函数 1.1.2sum函数 1.1.3avg函数 1.1.4max函数 1.1.5min函数 1.2group by子句 1.3having 1、聚合查询 1.1聚合函数 聚合函数查询又叫函数查询&#xff0c;它是通过一些特定的函数根据需求来查询相关的信息&#xff0c;常见的…

Node【NPM】

文章目录 &#x1f31f;前言&#x1f31f;NPM使用&#x1f31f;NPM使用场景&#x1f31f;NPM的常用命令&#x1f31f;NPM命令使用介绍&#x1f31f; 使用NPM安装模块&#x1f31f; 下载三方包&#x1f31f; 全局安装VS本地安装&#x1f31f; 本地安装&#x1f31f; 全局安装&am…

Linux文件系统 文件恢复

inode和block block 用于存储文件数据。 文件是存储在硬盘上的&#xff0c;硬盘的最小存储单位叫做“扇区”&#xff08;sector&#xff09;&#xff0c;每个扇区存储512字节。连续八个扇区组成一个"块"&#xff08;block&#xff09;&#xff0c;一个块是4K大小&…

政策和技术引导企业布局光伏组件回收市场 积极应对光伏组件“退役潮”

一、发展光伏组件回收是实现我国碳中和的战略需求 光伏组件回收主要是通过对其各组件部分进行物理或化学方法处理&#xff0c;进而得到拥有经济价值的材料&#xff0c;进而减少环境污染&#xff0c;实现对废弃光伏组件资源的回收再利用。 我国是光伏组件制造及应用大国&#…

1187.使数组严格递增 学习记录

题目描述 给你两个整数数组 arr1 和 arr2&#xff0c;返回使 arr1 严格递增所需要的最小「操作」数&#xff08;可能为 0&#xff09;。 每一步「操作」中&#xff0c;你可以分别从 arr1 和 arr2 中各选出一个索引&#xff0c;分别为 i 和 j&#xff0c;0 < i < arr1.l…

java记录-网络编程 TCP/UDP

网络编程三要素&#xff1a; IP&#xff1a;标识计算机端口&#xff1a;标识应用程序 0-65535 普通程序用1024-65535协议&#xff1a;通信规则 ps.套接字&#xff08;socket&#xff09;是IP和端口号的组合&#xff0c;通过套接字能够找到某主机上的某程序&#xff0c;实现点…