基于 React 脚手架搭建 React + dva + webpack + less
Mac
- react-create-app 创立 react 我的项目及 typescript,react-create-app 须要本人装置配置,不赘述
npx create-react-app [app0729- 自定义文件名] --typescript
执行yarn start
能够看到默认页面了~ - 裸露 webpack,即生成 webpack 配置等文件, config/script
yarn eject
- 装置 dva
yarn add dva
-
配置路由
yarn add history
- src 下创立 routes 文件夹,该文件夹内放各个页面,每个页面独自创立文件夹
😊举个栗子~
// home.tsx import {Link} from 'dva/router'; import React from 'react'; const Home = ({history}: any): JSX.Element => { return ( <div className="home-wrapper"> <h1>home</h1> <p onClick={() => { // history 跳转 history.push('/orderList'); } }> 去订单列表页 </p> // link 标签跳转 <Link to={'/orderList'}> 去订单列表页 </Link> </div> ) } export default React.memo(Home);
- 批改 src/app.tsx 文件 — 管制路由
- src 下创立 routes 文件夹,该文件夹内放各个页面,每个页面独自创立文件夹
import React from 'react';
import {Router, Route, Switch} from 'dva/router';
import dynamic from 'dva/dynamic';
const routes = [
{
key:'home',
path: '/',
component: () => import('./routes/Home/home'),
},
{
key:'/orderList',
path: '/orderList',
component: () => import('./routes/Order/orderList/index'),
},
{
key:'/orderDetail',
path: '/orderDetail',
component: () => import('./routes/Order/orderDetail/index'),
}
];
function RouterConfig({history, app}: any) {
return (<Router history={history}>
<Switch>
{routes.map((item: any): any => (
<Route
key={item.key}
path={item.path}
exact
// @ts-ignore
component={dynamic({
// @ts-ignore
app,
models: item.models,
component: item.component,
})}
/>
))
}
</Switch>
</Router>
);
}
export default RouterConfig;
- 批改 src/index.tsx 文件 入口文件
import dva from 'dva';
// import './index.css';
import {createBrowserHistory} from 'history';
// 1. Initialize
const app = dva({history:createBrowserHistory()
});
// 2. Plugins -- 能够挂载 loading 等插件
// app.use({});
// 3. Model -- 引入全局 model 可稍后尝试
// app.model(require('./models/app').default);
// 4. Router
app.router(require('./App.tsx').default);
// 5. Start -- 挂载到 #root DOM 上
app.start('#root');
执行 yarn start
曾经能够看到页面内容了,能够点击跳转页面~
-
装置 less,react 脚手架自带的是 sass,如果想应用 sass 可间接装置
- 执行
yarn add --dev less less-loader
,
如果提醒 node 版本号谬误如
less-loader@10.0.1: The engine "node" is incompatible with this module. Expected version ">= 12.13.0". Got "10.18.0"
, 可执行yarn add --dev less less-loader --ignore-engines
, 疏忽 node 版本号即可。- webpack 配置 less
-config/webpack.config.js 批改 lessRegex、lessModuleRegex 替换 sassRegex、sassModuleRegex
- 执行
const lessRegex = /\.less$/;
const lessModuleRegex = /\.module\.less$/
// const sassRegex = /\.(scss|sass)$/;
// const sassModuleRegex = /\.module\.(scss|sass)$/;
// Opt-in support for SASS (using .scss or .sass extensions).
// By default we support SASS Modules with the
// extensions .module.scss or .module.sass
{
test: lessRegex, // 替换
exclude: lessModuleRegex, // 替换
use: getStyleLoaders(
{
importLoaders: 1, // 替换
sourceMap: isEnvProduction
? shouldUseSourceMap
: isEnvDevelopment,
},
'less-loader' // 替换
),
// Don't consider CSS imports dead code even if the
// containing package claims to have no side effects.
// Remove this when webpack adds a warning or an error for this.
// See https://github.com/webpack/webpack/issues/6571
sideEffects: true,
},
// Adds support for CSS Modules, but using SASS
// using the extension .module.scss or .module.sass
{
test: lessModuleRegex, // 替换
use: getStyleLoaders(
{
importLoaders: 1, // 替换
sourceMap: isEnvProduction
? shouldUseSourceMap
: isEnvDevelopment,
modules: {getLocalIdent: getCSSModuleLocalIdent,},
},
'less-loader' // 替换
),
},
src/routes/Home 下创立 style.less 并在 home.tsx 文件内引入 import './style.less';
, 重启服务。
如果呈现以下问题,阐明装置的 less-loader 版本过高,不反对 getOptions 办法,装置低版本即可,执行 yarn add --dev less-loader@7.0.0
即可(能够本人尝试哪个版本号可用)
再执行 yarn start
就能够启动服务了,此时 less 已可应用了
如果呈现 less 生成的款式的 class 名字都是 hash 命名,阐明上述配置中的 getStyleLoaders-modules 有问题,依照配置更改即可~