工程搭建
接口文档:Airbnb API 开发文档
第一章:项目搭建
一、初始化工程
1. 创建工程
bash
npm install -g create-react-appbash
create-react-app airbnb
cd airbnb
npm start运行没问题后,删除不用的文件以及代码。
2. 项目目录结构

3. craco
1)craco 配置别名
官方文档:CRACO
1)默认 webpack 配置没有暴露,也不推荐。使用 craco 来配置,而不用暴露 React 脚手架的配置。
bash
npm i -D @craco/craco2)在项目的根目录中创建一个 CRACO 配置文件,并配置:
diff
my-app
├── node_modules
+ ├── craco.config.js
└── package.json3)更新 package.json 中 scripts 启动命令为 CRACO
diff
"scripts": {
- "start": "react-scripts start"
+ "start": "craco start"
- "build": "react-scripts build"
+ "build": "craco build"
- "test": "react-scripts test"
+ "test": "craco test"
}4)在 craco.config.js 文件中配置目录别名
js
const path = require('path');
const resolve = dir => path.resolve(__dirname, dir);
module.exports = {
webpack: {
alias: {
'@': resolve('src/'),
'components': resolve('src/components/'),
'utils': resolve('src/utils/'),
},
},
};2)启用 less
1)安装
bash
npm i -S craco-less2)craco.config.js 配置
js
const CracoLessPlugin = require('craco-less');
module.exports = {
// webpack 配置
// ......
// 插件配置
plugins: [
{
plugin: CracoLessPlugin,
},
],
};5. 重置 CSS
normalize.css
1)安装 normalize.css
bash
npm install --save normalize.css2)在 @\index.js 中添加
js
import 'normalize.css'rest.css
1)@\assets\css\reset.less
less
@import 'variables.less';
* {
margin: 0;
padding: 0;
list-style: none;
box-sizing: border-box;
}
*::before,
*::after {
box-sizing: border-box;
}
a {
text-decoration: none;
color: inherit;
}2)@\assets\css\index.css 引入 reset.less
3)@\assets\css\variables.less
4)@\index.js 文件中引入 @\assets\css\index.less
less
import '@/assets/css/index.less'二、引入技术
1. 路由配置
1)安装
bash
npm install react-router-dom2)@\router\index.js
js
import React from "react";
import { Navigate } from "react-router-dom";
const Home = React.lazy(() => import("@/views/home"))
const Entire = React.lazy(() => import("@/views/entire"))
const Detail = React.lazy(() => import("@/views/detail"))
const routes = [
{
path: '/',
element: <Navigate to="/home" />
},
{
path: '/home',
element: <Home />
},
{
path: '/entire',
element: <Entire />
}, {
path: '/detail',
element: <Detail />
}
]
export default routes3)配置 Suspense
jsx
import { BrowserRouter } from 'react-router-dom';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Suspense fallback={<div>Loading...</div>}>
<BrowserRouter>
<App />
</BrowserRouter>
</Suspense>
</React.StrictMode>
);4)@\App.js 生成路由元素
jsx
import { useRoutes } from "react-router-dom";
import routes from '@/router'
function App() {
return (
<>
<header className='header'>header</header>
<main className='page'>
{useRoutes(routes)}
</main>
<footer className='footer'>footer</footer>
</>
);
}
export default App2. redux 配置
1)安装
bash
npm install @reduxjs/toolkit react-reduxRTK 默认安装了 redux。
2)创建 store
js
import { configureStore } from "@reduxjs/toolkit"
const store = configureStore({
reducer: {},
})
export default store3)注入 store
jsx
import { Provider } from 'react-redux'
import store from './store'
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Suspense fallback={<div>Loading...</div>}>
<BrowserRouter>
<Provider store={store}>
<App />
</Provider>
</BrowserRouter>
</Suspense>
</React.StrictMode>
);3. Axios
1)安装
bash
npm install axios2)@\services\request\config.js
js
const BASE_URL = "http://codercba.com:1888/airbnb/api"
const TIMEOUT = 5000
export { BASE_URL, TIMEOUT }3)@\services\request\index.js 中封装 axios
js
import axios from "axios"
import { BASE_URL, TIMEOUT } from "./config"
class Myrequest {
constructor(baseURL, timeout) {
this.instance = axios.create({
baseURL,
timeout
})
this.instance.interceptors.request.use(config => {
return config
})
this.instance.interceptors.response.use(res => {
return res.data
}, err => {
return Promise.reject(err)
})
}
request(config) {
return this.instance.request(config)
}
get(config){
return this.request({...config,method:'get'})
}
post(config){
return this.request({...config,method:'post'})
}
}
export default new Myrequest(BASE_URL, TIMEOUT)4. 引入组件库
1)Material UI
官方文档:Installation - Material UI
[1] 安装组件库
bash
# 核心依赖
npm install @mui/material @emotion/react @emotion/styled
# Material UI 默认使用 emotion,而我们需要把它替换为 styled-components
npm install @mui/material @mui/styled-engine-sc[2] 设置模式
使用 5.15.19 版本,不设置 mode 会报错。

在 @\index.js 中进行如下配置。
jsx
import { ThemeProvider, createTheme } from '@mui/material/styles'
const darkTheme = createTheme({
palette: {
mode: 'dark',
},
});
export default function App() {
return (
<ThemeProvider theme={darkTheme}>
<App />
</ThemeProvider>
);
}[3] 看下是否集成好了
jsx
import Button from '@mui/material/Button';
<Button variant="contained" color="primary">
Hello World
</Button>2)Ant Design
[1] 安装组件库
bash
npm install antd --save[2] 看下是否集成好了
jsx
import { Button } from 'antd';
<Button type="primary">Button</Button>bash
npm install styled-components