react create-react-app v5 从零搭建项目(不暴露 eject)

这篇具有很好参考价值的文章主要介绍了react create-react-app v5 从零搭建项目(不暴露 eject)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

好久没用 create-react-app做项目了,这次为了个h5项目,就几个页面,决定自己搭建一个(ps:mmp 好久没用,搭建的时候遇到一堆问题)。

我之前都是使用 umi 。后台管理系统的项目 使用 antd-pro框架。实际上antd-pro 是基于umi搭建集成的框架。里面封装好了各种东西,开箱即用。

读本篇文章建议 打开 csdn的目录功能,可以让你更快捷的找到你需要的配置:
react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节

我的环境如下:
create-react-app v5

    "axios": "^1.5.0",
    "http-proxy-middleware": "^2.0.6",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-router": "^6.16.0",
    "react-router-dom": "^6.16.0",
    "customize-cra": "^1.0.0",
    "react-app-rewired": "^2.2.1"

v5版本 好多问题,有很多 问题,有些插件 里的办法也不适配了(坑很多,很多 time:2023-09-27)。
我说的坑多,是我不想暴露 webpack配置的情况下 使用 react-app-rewired 和 customize-cra 这个来配置一些东西遇到的。本身并不是 create-reacr-app的问题。

所以你如果不想这么麻烦,那你可以直接 npm run eject然后用传统的webpack配置。
如果你不想用第三方插件重写webpack的话,可以看我这篇:react create-react-app v5 从零搭建(使用 npm run eject)

v5刚出来没多久,v4的话问题就很少,基本稳定了!如果你不想用v5 可以安装指定版本的 create-react-app 。

搭建过程:

一、创建项目:
安装Node 和 npm: Node >= 14.0.0 和 npm >= 5.6

npx install -g create-react-app

npx create-react-app my-app

react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节
npx 不是拼写错误 —— 它是 npm 5.2+ 附带的 package 运行工具。

react 官网文档

二、配置各种必备的东西

npm start 运行 看到下图就说明项目创建成功了!
react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节

配置路由:

1.下载 react-router-dom

npm install react-router-dom

1.首先 npm react-router-dom
2.App.js 里 写上如下代码:

import React from "react";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import routes from './routes';
const App = () => {
  console.log(routes)
  return (
    <BrowserRouter>
      <Routes>
        {routes.map((route) => (
          <Route key={route.path} path={route.path} element={route.component} />
        ))}
        {/* <Route path="*" element={<Home />} />  */}
      </Routes>
    </BrowserRouter>
  );
};

export default App;

react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节
3.index.js里写上:

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

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

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节

4.在src下新建一个 routes.js文件 写上:

// 导入你的页面组件  
import Home from './pages'; 
//可以用 path:"*" 写个 404页面,我暂时不需要
const routes = [
  { path: "/", component: <Home/>}
];

export default routes;

react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节
运行看到 Home组件里的东西就说明成功了。之后可以在 scr/router.js里导入其他组件 写上 path和routers就行了。

注意:react-router-dom v6 和v5 api不太一样,比如 v5 把 Route 上是 component v6是element。具体写法 建议参考 你所用的版本 文档!

如果遇到了Uncaught TypeError: Cannot read properties of null (reading ‘useRef‘) 报错,可以看react create-react-app v5 配置路由(报错及注意事项)

配置less:

可以参考:
react create-react-app 配置less

配置Proxy代理:

使用 http-proxy-middleware
1.安装http-proxy-middleware

npm install http-proxy-middleware --save

2.src目录新建一个setupProxy.js
代码大致如下:
然后 请求接口时以/api/xx就会自动走代理。

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function(app) {
    app.use(
      '/api',
      createProxyMiddleware({
        target: 'http://localhost:8000',
        changeOrigin: true,
        // pathRewrite: {  
        //     '^/api': '/',  
        //   },  
      })
    );
  };

具体配置可以参考:React create-react-app 里配置代理(解决跨域)

配置axios:

1.安装 axios

cnpm install axios --save

2.src/utils 新建一个 request.js文件(没有utils就新建一个目录然后再建一个request.js)
3.request代码如下:
这个是最简单的配置了,你可以根据自己的需求配置 请求拦截里的东西。

import axios from 'axios'

 // axios的配置文件, 可以在这里去区分开发环境和生产环境等全局一些配置
 const devBaseUrl = 'http://api.k780.com/'
 const proBaseUrl = 'http://xxxxx.com/'
 
 // process.env返回的是一个包含用户的环境信息,它可以去区分是开发环境还是生产环境
 export const BASE_URL =  process.env.NODE_ENV === 'development' ? devBaseUrl : proBaseUrl
 export const TIMEOUT = 5000

var request = axios.create({
    baseURL:BASE_URL,//基准地址
    timeout:TIMEOUT
})
//拦截请求
request.interceptors.request.use((config)=>{
    return config
})
//拦截响应
request.interceptors.response.use((response)=>{
    return response
},function (error){
    //对响应的错误做点什么
    return Promise.reject(error);
}
)
 
export default request;

使用时就是:

import request from "@/utils/request";
 request.get("/api/fund_home/select_by_fund?fund=1001").then(res=>{
      console.log(res);
    })

当然 你也可以不叫 request 你可以叫 $axios 全看自己。
上面我给的配置说最简单的,一般来说 需要在 请求拦截里加上一些判断比如 错误提示,根据code值提示一下。可以借用 ui库的message组件 message.error(xxx)。还有 如果你需要加上token 还得统一加上token。

比如:我就在响应拦截里做了统一处理,status =200 并且 respnse.data.code=000000时才代表数据成功返回(这个需要根据你自己的接口规范来定)。否则 就需要 提示错误信息。Toast是antd-mobile里的,你可以根据自己需求变。

//拦截响应
request.interceptors.response.use(
  (response) => {
    console.log(response, "res");
    if (response && response.status == "200") {
      if (response.data && response.data.code == "000000") {
        //接口成功才返回数据
        return Promise.resolve(response.data);
      } else {
        Toast.show({
          content: response.data&&response.data.message,
          duration:2000,
          position: "top",
        });
      }
    }else{
        return Promise.reject(response.message)
    }
  },
  function (error) {
    //对响应的错误做点什么
    Toast.show({
        content: '网络异常',
        duration: 0,
        position: 'top',
      })
    return Promise.reject(error);
  }
);

还需呀注意的时使用 axios的时候一定要用catch捕获一下错误,要不然接口出错一定会导致页面直接有个遮罩层显示错误信息。
比如:
接口超时了,页面直接显示错误信息,但其实应该是显示页面才对,这样太影响用户体验了。
react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节
可以用的时候then后面加个catch,就不会直接显示在页面上了。

request
      .get("/api/fund_home/select_by_fund", {
        params: {
          fund: "混合",
        },
      })
      .then((res) => {
        console.log(res);
      })
      // .catch((error) => {
      //   console.log(error);
      // });

抽出到servers(模块化):
不过一般 项目里都会抽出来一个server模块(umi、antd-pro都是这样的),这样更加简洁。

1.在 src目录新建一个servers目录。
2.在 src/servers新建一个文件。
这个文件名 对应的就是模块名,比如:我现在写的是home页,那我就新建 home.js 。 后面写 其他模块就新建对应的js就行。
3.在 home.js里引入 封装好的 request,写上axios请求。
大致如下:你需要根据你自己的实际需求来写(@代表src,这个需要配置一下,如过你没配置就用相对路径引入就行)。

import request from "@/utils/request";

export function getList(params) {
    return request({
        url: "/api/fund_home/select_by_fund",
        method: "get",
        params
    });
}

react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节

然后就可以在 home页里使用了。

import {getList} from "@/servers/home";
 getList({fund:"混合"}).then((res) => {
        console.log(res);
      })
      .catch((error) => {
        console.log(error);
      });

react axios配置

静态资源图片之类的可以在src下新建assets目录:

在 src新建文件夹assets。然后新建img可以存放图片。 新建 js,css可以存放静态的js和css。

其实放public里也可以:
在create-react-app中,assets目录和public目录都可以用来存放静态资源,但它们之间有一些区别。
assets目录是我们自己创建的,通常放置一些与组件紧密相关的静态资源,如图片、样式文件等。这些资源在Webpack打包时会被处理和压缩,并与代码一起打包到最终的构建文件中。在组件中引用这些资源时,需要使用import关键字进行导入。

public目录是在创建React应用时默认生成的,用于放置一些通用的静态资源,如HTML文件、favicon.ico文件等。这些资源在Webpack打包时不会被处理和压缩,并且会被直接复制到最终的构建文件中。在组件中引用这些资源时,需要使用相对路径进行引用。
总的来说,assets目录和public目录都可以用来存放静态资源,但它们在处理和使用静态资源时有所不同。因此,我们需要根据实际情况选择合适的目录来存放静态资源。

大白话就是 ,public里的文件打包会直接被复制到 dist里,assets则不会。

打包部署到非根目录:

create-react-app v5 打包配置(部署到非根目录)

使用环境变量

[react 使用环境变量的方法和步骤(dotenv-cli 实现使用环境变量步骤)]

打包去掉 map文件

create-react-app 打包去掉 map文件

注意严格模式(StrictMode)会导致开发环境接口请求两次

React中StrictMode严格模式,导致开发环境,接口会请求两次或多次( useEffect 请求多次)

不暴露 eject 配置自己的webpack:

  1. 下载react-app-rewired 和 customize-cra-5
npm install react-app-rewired customize-cra-5 --save-dev

修改package.json 里scripts配置:

 "start": "react-app-rewired start",
  "build": "react-app-rewired build",
  "test": "react-app-rewired test",
  "eject": "react-scripts eject"

2.在项目根目录创建一个config-overrides.js 文件

比如配置 less 建议具体参考 上面的配置 less:

const { override, addLessLoader, addPostcssPlugins } = require("customize-cra-5");

module.exports = override(
  addLessLoader({  
    lessOptions:{
      javascriptEnabled: true,  
      modifyVars: { '@primary-color': '#1DA57A' }, // 你的主题色  
    },
  }) 
);

比如:按需加载 antd(按需加载 )

按需加载ui库时因为ui库是less写的样式,所以配置时,需要先配置 less,上文中有步骤,ui库按需加载建议看官网文档,都会有方法和步骤及注意事项,其实现在 很多 ui库都支持 Tree Shaking ,v5也支持所以只要是ui库支持,那么就不用配置按需加载!!!

Create React App v5 默认支持 Tree Shaking。Tree Shaking 是一项优化技术,用于在打包过程中只包含实际使用的代码,减少最终打包文件的体积。
在 Create React App v5 的构建配置中,通过使用 Babel 和 webpack 的相关插件和配置,可以自动启用 Tree Shaking 功能。
具体来说,Create React App v5 使用了以下插件和配置来支持 Tree Shaking:

Babel 默认配置:Create React App v5 的默认 Babel 配置中使用了 @babel/preset-env,它会根据目标浏览器的兼容性要求,自动转译代码并进行 Tree Shaking。

webpack 配置:Create React App v5 配置了优化选项 sideEffects: false,在 production 环境中默认启用了 Tree Shaking。这使得 webpack 在打包时可以识别出未使用的代码并进行排除。
总结来说,Create React App v5 默认启用了 Tree Shaking,以帮助优化打包文件的体积。你无需额外进行配置即可享受 Tree Shaking 的好处。

注意:antd-mobile无需配置手动按需加载
antd-mobile 按需加载
react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节
其实 antd 高版本也自带按需加载 可以不用配置(下面的代码只是个 演示,你如果有其他 ui库 或者 插件需要按需加载可以按照下面的步骤来):
react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节
antd 官方链接 按需加载

react-vant 也是:
react-vant官网
react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节
如果你有其他插件需要配置可以参考这个步骤来:
这几种方式都需要 babel-plugin-import 支持,所以没有的话需要先安装!!!
需要 cnpm install babel-plugin-import
后再配置

const {
  override,
  addLessLoader,
  addPostcssPlugins,
  fixBabelImports,
} = require("customize-cra-5");

module.exports = override(
  // addPostcssPlugins([require("autoprefixer")]), //自动给样式加浏览器前缀 不过 cra自带了所以可以不用这个
  // addLessLoader({
  //   lessOptions:{
  //     javascriptEnabled: true,
  //     modifyVars: { '@primary-color': '#1DA57A' }, // 你的主题色
  //   },

  // })

  // 针对antd-mobile 实现按需打包:根据import来打包 (使用babel-plugin-import)
    fixBabelImports("import", {
    libraryName: "antd",
    libraryDirectory: "es",
    style: true, //自动打包相关的样式 默认为 style:'css'
  }),
);

package.json里babel配置

1.在 package.json 文件中找到 “babel” 字段,如果没有请自行添加该字段。

2.在 “babel” 字段中添加 “plugins” 字段,并将 “plugins” 字段的值设置为一个数组,用于配置 babel 插件。

3.在 “plugins” 数组中添加 “import” 插件,并将其配置为按需加载。具体配置如下:
只添加 plugins就行,如果默认有其他配置,在后面加上就行。

{
  "babel": {
    "plugins": [
      [
        "import",
        {
          "libraryName": "react-vant",
          "style": true
        }
      ]
    ]
  }
}

比如:路径别名 src 写成@/xxx

  const {
  override,
  addLessLoader,
  addPostcssPlugins,
  fixBabelImports,
  addWebpackAlias
} = require("customize-cra-5");
const path = require('path')
  addWebpackAlias({
    '@': path.resolve('src')
  }),

然后 就可以使用 @来引入src下的文件了。

比如 引入 px2rem(虽然官方这么写 但是 我并不起作用):

目前我找了 issues 里没有解决方案(2023-09-28,以后或许有,因为我项目着急,我必须使用 px转换rem的操作,为了适配移动端 h5,所以我选择了暴露eject的方法,后续可能会有方法,如果有新方法可以评论区告诉我,我也会关注 github issues )
react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节

  addPostcssPlugins([require("postcss-px2rem")({ remUnit: 37.5 })])

2023-10-09补充:
后来国庆过后有人回复我了,我修改了一下代码,发现可以生效了!
react create-react-app v5配置 px2rem (不暴露 eject方式)
部分内容参考于 React移动端适配解决方案
customize-cra-5 的api可以去看github上的文档
react create-react-app v5 从零搭建项目(不暴露 eject),create-react-app v5,React,react.js,前端,前端框架,1024程序员节

customize-cra api doc文章来源地址https://www.toymoban.com/news/detail-729008.html

到了这里,关于react create-react-app v5 从零搭建项目(不暴露 eject)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用create-react-app创建react项目

    全局安装create-react-app 使用create-react-app创建一个项目 如果不想全局安装,可以直接使用npx 这需要等待一段时间,这个过程实际上会安装三个东西 react: react的顶级库 react-dom: 因为react有很多的运行环境,比如app端的react-native, 我们要在web上运行就使用react-dom react-scripts: 包含运

    2024年02月11日
    浏览(23)
  • react快速开始(三)-create-react-app脚手架项目启动;使用VScode调试react

    create-react-app(以下简称cra)作为react官方提供的脚手架工具,是目前生成react项目一个非常常用和主流的工具。很多企业级的应用搭建也是基于这个脚手架工具上二次开发 create-react-app脚手架 生成的 package.json中 scripts如下: 我们看到分别是项目的启动开发环境,构建,测试的

    2024年02月10日
    浏览(42)
  • 【React】02.create-react-app基础操作

    2023年最新珠峰React全家桶【react基础-进阶-项目-源码-淘系-面试题】 有利于团队协作开发 便于组件的复用:提高开发效率、方便后期维护、减少页面中的冗余代码 业务组件:正对项目需求封装的 普通业务组件:没有啥复用性,只是单独拆出来的一个模块 通用业务组件:具备

    2024年02月06日
    浏览(30)
  • 使用 create-react-app 创建 react 应用

    第一步 :全局安装: npm install -g create-react-app 第二步 :切换到想创建项目的目录,使用命令 create-react-app hello-react 第三步 :进入项目目录, cd hello-react 第四步 :启动项目, npm start 其中,public/index.htm,src/App.js,src/index.js 三个是最重要的文件。 public/index.html src/index.js 注意

    2024年01月25日
    浏览(32)
  • React官网力荐Next.js:为何它取代了Create-React-App?

    随着前端技术的快速发展,React作为一款领先的JavaScript库,不断推动着前端开发的变革。近期,React官网的一个显著变化引起了广大开发者的关注:它不再推荐使用Create-React-App作为构建React应用的默认工具,而是转向了Next.js。 那么,Next.js究竟有何魔力,让React官网做出如此决

    2024年04月26日
    浏览(25)
  • 从零搭建一个react + electron项目

    最近打算搭建一个react + electron的项目,发现并不是那么傻瓜式 于是记录一下自己的实践步骤 通过create-react-app 创建react项目 安装electron依赖 暴露react项目的配置文件 (这一步看自己需求,我需要改目录结构) 在package.json中有一个eject命令,直接执行就可以,执行前要保证没

    2024年02月14日
    浏览(27)
  • 【React 入门实战篇】从零开始搭建与理解React应用-二、前置准备与环境搭建

    二、前置准备与环境搭建 2.1 安装Node.js与npm 在开始React开发之前,我们需要确保Node.js和npm(Node Package Manager)已经安装在我们的计算机上。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,而npm则是Node.js的包管理器,用于安装和管理JavaScript库和工具。 安装Node.js: 访问Node.js官

    2024年04月10日
    浏览(73)
  • React--》从零开始搭建一个文章后台管理系统

    目录 项目准备 项目搭建 scss预处理器的使用 配置基础路由 组件库antd的使用 开发者工具的安装 登录模块 基本样式搭建 创建表单结构 获取表单数据并进行相关登录操作 对登录模块的token进行相关处理 路由鉴权实现 后台页面模块 基本页面结构搭建 菜单高亮显示 展示个人信

    2023年04月17日
    浏览(36)
  • 【React 入门实战篇】从零开始搭建与理解React应用-三、React核心概念与基础语法

    三、React核心概念与基础语法 3.1 JSX语法详解 JSX是React中的一个语法糖,它允许开发者在JavaScript代码中编写类似HTML的标记。这种语法使得开发者能够以一种声明式的方式描述界面,提高了代码的可读性和可维护性。 JSX的语法规则: 元素创建 :使用尖括号 来创建元素,就像在

    2024年04月08日
    浏览(39)
  • 【vue create】一.使用vue creat搭建项目

    场景 :使用vue create脚手架快速搭建vue的项目 前提 :需要安装node.js和cnpm以及yarn 并且cnpm需要设置为淘宝镜像,cnpm和yarn安装教程网上很多可以自行搜索 查看安装的版本(显示版本号说明安装成功) 1.cmd窗口跳到需要新建项目的文件夹下,使用vue create 2.我这里选择第三个Ma

    2024年02月06日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包