重温react:从搭建企业级项目开始

背景

最近开始在开始面试,发现很多公司都需要react这个技术,我虽然会,但是不是很熟悉,就想着学习学习。

这要用到的技术是vite + react + react-redux + react-router-dom + @reduxjs/toolkit等技术

创建react项目

  1. 安装项目:
npm init vite@latest

2.安装需要的依赖

npm install react-redux react-router-dom
npm install @reduxjs/toolkit
npm install @types/node -D
npm install vite-plugin-compression -D

store

  1. 创建文件
src/store/index.ts
src/store/modules/mainReducer.ts

2.mainReducer.ts

import { createSlice } from '@reduxjs/toolkit';
import type { RootState } from '../index';

interface CounterState { // 定义初始化状态的类型
  mainValue: number
}
const initialState: CounterState = { // 初始化状态
  mainValue: 1,
}
export const counterSlice = createSlice({
  name: 'mainCounter',
  initialState,
  reducers: {
    getMain: (state) => {
      state.mainValue += 1
    },
    setMain: (state) => {
      state.mainValue += 1
    },
  },
})

export const { getMain, setMain } = counterSlice.actions;
export const selectCount = (state: RootState) => state;
export default counterSlice.reducer; 

3.index.ts

import { configureStore } from '@reduxjs/toolkit';
import mainCounterSlice from './modules/mainReducer';

const store = configureStore({
    reducer: {
        mainCounter: mainCounterSlice
    },
});

export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;

export default store;

router

  1. 创建文件
router/index.ts

2.index.ts

import { lazy } from "react";
import { RouteObject } from 'react-router-dom'
const Index = lazy(() => import('@/views/index'))

const Router: RouteObject[] = [
  {
    path: '/',
    element: <Index />
  }
]
export default Router;

占位符:

import { Outlet } from 'react-router-dom';

function Layout() {
  return (<div className='layout'>
    789
    <Outlet />
  </div>)
}

views/index

简单代码:

// views/index.tsx
import { useSelector, useDispatch } from 'react-redux';

function Home() {
  return (<div className='home'>你好!!!</div>)
};
export default Home

修改main.tsx

HashRouter 这个是hash值

import ReactDOM from 'react-dom/client';
import store from './store/index';
import {BrowserRouter} from 'react-router-dom';
import { Provider } from 'react-redux';
import App from "@/App";
const root = ReactDOM.createRoot(
  document.getElementById("root") as HTMLElement
);
root.render(
  <Provider store={store}>
    <BrowserRouter>
      <App></App>
    </BrowserRouter>
  </Provider>
);

修改App.tsx

import { Suspense } from "react";
import { useRoutes } from 'react-router-dom';
import routes from '@/router';

function App() {
  return <div className="App">
    <Suspense fallback="Loading...">
      <div className="main">
        {useRoutes(routes)}
      </div>
    </Suspense>
  </div>;
};

export default App;

使用store

import { useSelector, useDispatch } from 'react-redux';
import { setMain } from '@/store/modules/mainReducer';

function Home() {
  const counts = useSelector((state: any) => state.mainCounter);
  // 修改
  const dispatch = useDispatch();
  const handleBtnClick = () => {
    dispatch(setMain());
  }

  console.log('counts', counts);
  return (<div className='home'>
    <div className='box'>
      <div>{ counts.mainValue }</div>
      <button onClick={handleBtnClick}>增加</button>
    </div>
  </div>)
}
export default Home;

环境配置

根据自己的需求配置就行;

  • .env.development
  • .env.production
  • .env.test

【获取环境变量的方式一】:

import.meta.env

【获取环境变量的方式二】:

import { defineConfig, loadEnv  } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path';
import viteCompression from 'vite-plugin-compression';

export default ({ mode }: any) => {
  const env = loadEnv(mode, process.cwd());
  console.log('----',env);
  return defineConfig({
    plugins: [
      react(),
      viteCompression({
      verbose: true,
      disable: false,
      threshold: 10240,
      algorithm: 'gzip',
      ext: '.gz',
    }),],
    resolve: {
      alias: {
        '@': path.resolve(__dirname, './src')
      }
    }
  })
};

启动不同环境

以下增加了pre启动命令,当然;你也可以写更多的命令。

"scripts": {
    "dev": "vite",
    "pre": "vite --mode production",
    "build": "tsc -b && vite build",
    "lint": "eslint .",
    "preview": "vite preview"
},

保存自动格式化

如果你觉得不需要的话可以不配置。

  1. 安装依赖
npm install eslint -D
npm install prettier -D

2.配置.eslintrc.js

module.exports = {
  env: {
    browser: true,
    es2021: true,
    node: true, // 解决 'module' is not defined报错。
  },
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/recommended',
    'plugin:react/recommended',
  ],
  overrides: [
    {
      env: {
        node: true,
      },
      files: ['.eslintrc.{js,cjs}'],
      parserOptions: {
        sourceType: 'script',
      },
    },
  ],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
  },
  plugins: ['@typescript-eslint', 'react'],
  rules: {},
};

3.配置.eslintignore

dist/*
node_modules/*
*.json
public

4.配置.prettierrc.js

module.exports = {
  // 一行的字符数,如果超过会进行换行,默认为80
  printWidth: 100,
  // 行位是否使用分号,默认为true
  semi: true,
  // 字符串是否使用单引号,默认为false,使用双引号
  singleQuote: true,
  // 一个tab代表几个空格数,默认为2
  tabWidth: 2,
  // 是否使用尾逗号,有三个可选值"<none|es5|all>"
  trailingComma: "none",
};

5.配置.prettierignore

node_modules/**
dist/**
public/**
doc/**

安装sass

npm install sass

配置@

tsconfig.app.json

"baseUrl": ".", //查询的基础路径
"paths": { "@/*": ["src/*"] }, //路径映射,配合别名使用

打包配置

import { defineConfig, loadEnv } from 'vite'
import react from '@vitejs/plugin-react'
import path, { resolve } from 'path';
import viteCompression from 'vite-plugin-compression';

// https://vitejs.dev/config/
export default ({ mode }: any) => {
  const env = loadEnv(mode, process.cwd());
  console.log('----', env);
  return defineConfig({
    plugins: [
      react(),
      viteCompression({
        verbose: true,
        disable: false,
        threshold: 10240,
        algorithm: 'gzip',
        ext: '.gz',
      }),],
    resolve: {
      alias: {
        '@': path.resolve(__dirname, './src')
      }
    },
    build: {
      outDir: resolve(__dirname, 'dist'), // 指定输出路径
      chunkSizeWarningLimit: 1500,
      sourcemap: false, // 是否生成 source map
      emptyOutDir: true, //Vite 会在构建时清空该目录
      // 打包时清楚console和debugger
      terserOptions: {
        compress: {
          keep_infinity: true,
          drop_console: true,
          drop_debugger: true,
        },
      },
      rollupOptions: {
        output: {
          compact: true, //压缩代码,删除换行符等
          assetFileNames: '[ext]/[name]-[hash].[ext]', //静态文件输出的文件夹名称
          chunkFileNames: 'js/[name]-[hash].js', //chunk包输出的文件夹名称
          entryFileNames: 'js/[name]-[hash].js', //入口文件输出的文件夹名称
        },
      },
    },
  })
};

总结

以上的配置是主要框架的配置,一些细节方面的可能需要你根据自己的需求进行配置处理,比如:axios、swiper等一些需要东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值