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

news2024/12/23 14:24:58

一、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 中添加对应包,配置如下:
{
  "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 配置,配置如下所示:
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 配置如下
module.exports={
    "presets":["@babel/preset-react"]
}

三、编写react代码

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

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

export default WelcomeClass

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

  • 3.2 创建index.js 创建一个根组件,并引入31创建的子组件,代码如下所示;
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.coloradmin.cn/o/443174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云看消博会:政策、技术、玩家造就的数字化革命

配图来自Canva可画 会展作为展示地域经济、文化、技术等软硬实力的最佳舞台&#xff0c;在塑造城市品牌形象、加速地域经济发展中发挥着重要的促进作用。近几年&#xff0c;在数字经济浪潮的推动下&#xff0c;会展产业走上了网联化、数字化、智能化的道路&#xff0c;催生了不…

上货避坑指南 私域上货选品工具 无货源选品上货 采集商品详情数据API分享 详情图 sku信息

电商开店之后&#xff0c;第一件事就是上货了&#xff0c;上货其实也是有技巧的。 上传商品时我们一定要注意细节&#xff0c;不可忽略一些重要细节&#xff0c;所以商家们在上传商品前&#xff0c;不可忽略是否预售、标题、主图、详情页、保证金、上架时间这几个细节。 详情…

PHP实现输入数值计算幂次,输入工资,判断个人所得税的金额这两个程序的代码

目录 前言 一、输入数值计算幂次 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 二、输入工资&#xff0c;判断个人所得税的金额 2.1运行流程&#xff08;思想&#xff09; 2.2代码段 2.3运行截图 前言 1.因多重原因&#xff0c;本博文有两个代码程…

【动手学深度学习】使用块的网络(VGG)

使用块的网络&#xff08;VGG&#xff09; 本文为李沐老师《动手学深度学习》一书的学习笔记&#xff0c;原书地址为&#xff1a;Dive into Deep Learning。 另&#xff0c;给自己练习时没有gpu资源的小伙伴推荐下kaggle数据科学网站&#xff0c;每周免费训练时长30h。 1 网络结…

Compose TextField

TextField​ Composable fun TextField(value: String,onValueChange: (String) -> Unit,modifier: Modifier Modifier,enabled: Boolean true,readOnly: Boolean false,textStyle: TextStyle LocalTextStyle.current,label: Composable (() -> Unit)? null,place…

unity,物理材质2d

介绍 2D物理材质(Physics Material 2D)是Unity中用于设置2D游戏对象的物理特性的一种方式。2D物理材质可以控制2D游戏对象的摩擦力、弹性系数等物理属性&#xff0c;从而影响其在物理引擎中的运动行为。以下是2D物理材质的详细介绍&#xff1a; 方法 摩擦力 2D物理材质的主要…

Qt+FFmpeg简单实现录屏并保存为MP4视频

一、前言 最近需要实现一个录屏功能&#xff0c;网上查了好多资料&#xff0c;最可靠的方案当然还是用FFmpeg实现&#xff0c;但是也踩了很多坑&#xff0c;包括FFmpeg版本问题&#xff0c;vs2019里相关编译问题&#xff0c;FFmpeg也不太熟悉&#xff0c;很多代码不太容易看懂&…

springboot+vue学生毕业离校系统(源码+说明文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的学生毕业离校系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

Flutter Android问题记录 - 升级Android Studio 2022.2.1版本后运行项目报错

文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 最近一个Flutter项目有新需求&#xff0c;开发时一直是在iOS设备上运行&#xff0c;花了几天做完后运行到Android设备测试&#xff0c;结果项目构建失败了。 开发环境 Flutter: 3.7.11Android Studio: 2022…

java工程师前景分析

本篇文章主要讲解java工程师的职业就业环境及职业剖析 作者&#xff1a;任聪聪 日期&#xff1a;2023年4月18日 java工程师目前属于很饱和的一个岗位&#xff08;2023年4月18日&#xff09;&#xff0c;但也会伴随劳动市场的变化出现不饱和的情况的。 实际上对于想入行it行业的…

PHP下的MySQL的基础学习

文章目录 一、MySQL LIKE 子句二、MySQL UNION 操作符三、MySQL 排序四、MySQL GROUP BY 语句五、MySQL 连接的使用总结 一、MySQL LIKE 子句 我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据&#xff0c; 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。…

virsh dump 内核转储 crash 分析swapper内核进程

为了节约时间&#xff0c;虚拟机配置4G内存&#xff0c;避免dump时间过长、文件过大 <memory>4194304</memory><currentMemory>4194304</currentMemory> //memory这两个值最好设成一样<vcpu>4</vcpu>vnc登录虚拟机 编写一个CPU消耗程序a.…

Word控件Spire.Doc 【字体】教程(1):在 Word 中更改字体颜色

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

【AI生产力工具】ChatPDF:将 PDF 文档转化为交互式阅读体验的利器

文章目录 简介一、ChatPDF 是什么&#xff1f;二、ChatPDF 的优势三、ChatPDF 的应用场景四、如何使用 ChatPDF&#xff1f;五、结语 简介 随着数字化时代的发展&#xff0c;PDF 文件已经成为了日常工作和学习中不可或缺的一部分。然而&#xff0c;仅仅将 PDF 文件上传或下载并…

网络抓包分析【IP,ICMP,ARP】以及 IP数据报,MAC帧,ICMP报和ARP报的数据报格式

网络抓包分析&#xff0c;IP数据报&#xff0c;MAC帧&#xff0c;ICMP报&#xff0c;ARP报格式以及不同网络通信的过程。 网络抓包工具 wireshark以太网v2MAC帧IP数据报格式ICMP报文格式ARP协议及ARP报文格式抓包分析IP数据报抓包分析icmp数据报的抓包分析ARP数据报的抓包分析 …

Windows下Release版本Qt程序生成日志和dump文件(用于程序异常崩溃检测)

文章目录 前言一、基于qInstallMessageHandler生成输出日志二、基于qBreakpad生成dump文件三、基于DbgHelp和SetUnhandledExceptionFilter生成dump文件四、示例完整代码五、下载链接总结 前言 在实际项目开发时&#xff0c;一般打包发布给客户的程序是release版本Qt程序&#…

Spark大数据处理学习笔记(2.2)搭建Spark Standalone集群

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/DrziJ】 文章目录 一、在master虚拟机上安装配置Spark1.1 将spark安装包上传到master虚拟机1.2 将spark安装包解压到指定目录1.3 配置spark环境变量1.4 编辑spark环境配置文件1.5 创建slaves文件&…

Unity记录3.3-地图-柏林噪声生成 2D 地图

文章首发及后续更新&#xff1a;https://mwhls.top/4486.html&#xff0c;无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评&#xff0c;非常感谢&#xff01; 汇总&#xff1a;Unity 记录 摘要&#xff1a;柏林噪声生成…

再学C语言51:C库中的字符串函数(3)

一、strcpy()函数 功能&#xff1a;复制字符串&#xff0c;在字符串中的作用等价于赋值运算符 示例代码&#xff1a; /* test of strcpy() function */ #include <stdio.h> #include <string.h>int main(void) {char arr1[] "Easy doesnt enter into grow…

基于html+css的图片展示19

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…