持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
前言
大家好呀,我是L同学。在上篇文章WebSocket介绍中,我们学习了WebSocket的知识点,包括什么是WebSocket、socket.io 的使用等相关知识点。今天,在这篇文章中,我们将学习如何在react项目中配置路径别名、配置@别名路径提示、路由鉴权等相关知识点。
配置路径别名
在项目中,我们会配置@路径别名简化路径。需要注意的是,CRA 将所有工程化配置,都隐藏在了 react-scripts
包中,所以,项目中看不到任何配置信息。如果要修改 CRA 的默认配置,有以下几种方案:
- 【推荐】通过第三方库来修改,比如,
@craco/craco
- 通过执行
yarn eject
命令,释放react-scripts
中的所有配置到项目中(注意:该操作不可逆!!!)
配置@路径别名步骤:
- 安装修改 CRA 配置的包:
yarn add -D @craco/craco
- 在项目根目录中创建 craco 的配置文件:
craco.config.js
,并在配置文件中配置路径别名 - 修改
package.json
中的脚本命令 - 在代码中,就可以通过
@
来表示 src 目录的绝对路径 - 重启项目,让配置生效
在/craco.config.js 文件中配置以下信息:
const path = require('path')
module.exports = {
// webpack 配置
webpack: {
// 配置别名
alias: {
// 约定:使用 @ 表示 src 文件所在路径
'@': path.resolve(__dirname, 'src')
}
}
}
在package.json 中将 start/build/test 三个命令修改为 craco 方式。
"scripts": {
"start": "craco start",
"build": "craco build",
"test": "craco test",
"eject": "react-scripts eject"
},
@别名路径提示
在 VSCode 中,jsconfig.json 文件中的有时候会有红色波浪线提示错误,直接忽略即可,不会影响路径提示。配置完路径别名后,需要让vscode识别@路径并给出路径提示。
让vscode识别@路径并给出路径提示实现步骤:
- 在项目根目录创建
jsconfig.json
配置文件 - 在配置文件中添加以下配置
在/jsconfig.json 文件中配置以下信息:
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
}
}
配置完成之后,VSCode 会自动读取 jsconfig.json
中的配置,让 vscode 知道 @ 就是 src 目录。
路由鉴权
在项目中,我们访问需要登陆的页面,如果未登录时访问需要拦截并跳转到登录页面。这个需求的实现思路是自己封装 AuthRoute
路由鉴权组件,实现未登录拦截,并跳转到登录页面。
我们的思路是AuthRoute
组件的用法应该与 Route
组件完全一致,并且 AuthRoute 组件也能够实现路由配置功能。所以,我们要封装的 AuthRoute 组件就是对 Route 组件的封装,并同时实现了鉴权功能。另一个点是分别对登录或未登录,进行相应处理。
// Route 用法:
<Route path="/home" component={Home} />
// AuthRoute 用法:
<AuthRoute path="/home" component={Home} />
实现路由鉴权步骤:
- 在 components 目录中,创建 AuthRoute/index.js 文件
- 判断是否登录
- 登录时,直接渲染相应页面组件
- 未登录时,重定向到登录页面
- 将需要鉴权的页面路由配置,替换为 AuthRoute 组件
components/AuthRoute/index.js 中
import { Route, Redirect } from 'react-router-dom'
import { isAuth } from '@/utils'
const AuthRoute = ({ component: Component, ...rest }) => {
return (
<Route
{...rest}
render={props => {
// 判断是否登录
if (!isAuth()) {
// 未登录
return (
<Redirect
to={{
pathname: '/login',
state: { from: props.location.pathname }
}}
/>
)
}
// 登录
return <Component />
}}
/>
)
}
export { AuthRoute }
App.js 中
import { AuthRoute } from '@/components/AuthRoute'
// 使用 AuthRoute 组件,替换 Route 组件
<AuthRoute path="/home" component={Layout}></AuthRoute>