打造开箱即用的 react 移动端框架
前言
如果你使用 React,或者想要学习 React,还在为 create-react-app 的各种配置而烦恼,对项目配置等有疑惑,或许这篇文章能够帮助你~
如果对你有帮助,请一定不要吝惜你的 Star~
- 在移动端常常会遇到缓存页面的问题,vue中有 keep-alive 解决,而在 React 中使用
react-keeper
就能完美解决这个问题,并且使用上更加方便简洁 - ant mobile 由 v2 升级到 v5 ,是时候更新一波了~
- 如果有小伙伴对 dva 不太理解,可在语雀上看详细使用文档,从最直观的角度来讲,
dva
相比于redux
更加简洁,使用起来更加方便
🎉 react
移动端开发脚手架,技术栈 react(hook)
+ antd moblie
+ typescript
+ react-keeper
+ dva
该脚手架基于 create react app
创建,方便快速搭建 react 移动端项目
gitHub: react-mobile
在线地址:react-mobile-Domesy
另外有对PC端刚兴趣的小伙伴推荐一波 Ant Design Pro V5 入门实战
基础配置
我们先使用npx创建项目
npx create-react-app react-mobile(文件名)
接下来我们就 react-mobile
进行对应的配置 (此时的是兼容 eslint 的)
如果要创建ts的话,只需要修改下命令即可(ts)
npx create-react-app react-mobile(文件名) --template typescript
1.创建项目配置文件
插件
react-app-rewired customize-cra
执行命令
npm install react-app-rewired customize-cra --save
作用:
在不 eject 的情况下,覆盖 create-react-app 的配置形成 config-overrides.js
配置:
在 package.json
中的 script 下的 react-scripts 替换为 react-app-rewired 即可
{
...
"scripts": {
"start": "react-app-rewired start",
"build": "react-app-rewired build",
"test": "react-app-rewired test",
"eject": "react-scripts eject"
},
...
}
然后在更目录下创建 config-overrides.js
文件,以后所有的配置就在此文件中
const { override } = require('customize-cra');
module.exports = override(
);
2.配置less文件
插件
less less-loader
执行命令:
yarn add less less-loader -D
作用:
支持 Less文件
配置:在 config-overrides.js
文件
const { addLessLoader } = require('customize-cra');
module.exports = override(
...,
addLessLoader({
lessOptions: {
javascriptEnabled: true,
modifyVars: { //全局公用样式,可以将此文件提出,专门做一个配置文件
'@primary-color': '#1DA57A'
},
localIdentName: '[local]--[hash:base64:5]' // 自定义 CSS Modules 的 localIdentName
}
}),
...
);
3.压缩js、css
插件
compression-webpack-plugin
执行命令
yarn add compression-webpack-plugin -D
作用:
压缩js、css
配置 在 config-overrides.js
文件
说明: 为了更好的配置,我们将分为开发模式和打包模式,我们只需要配置对应的打包模式即可,另外,默认的算法为 gzip 如果有更改可自行更改
const CompressionWebpackPlugin = require('compression-webpack-plugin');
//配置开发模式和打包模式
const addCustomize = () => config => {
// 打包模式
if(process.env.NODE_ENV === 'production') {
config.devtool = false; //去除map文件
// 添加js打包gzip配置
config.plugins = [...config.plugins, new CompressionWebpackPlugin({
test: /.js$|.css$/, // 压缩js与css
threshold: 1024, // 只处理比这个值大的资源,单位字节
})]
} else if(process.env.NODE_ENV === 'development'){
}
return config
}
module.exports = override(
...,
addCustomize()
);
4.配置独具一格的小玩意
作为一个程序员,我们可以让所在的项目加一点小玩意,就好比特定的标识,那么我们也给这个项目加点独具一格的小玩意吧~
结合 node.js 我们让这个项目打包的时候加入 DOMESY 吧😄
插件
clear: 清屏
chalk: 装饰作用,使之终端上的输出加上颜色
figlet: 作用是将字母转化为图片,使之更加醒目
使用命令
yarn add figlet clear chalk@^4.1.0 -S
配置 在 addCustomize 里配置就行
// 配置开发模式和打包模式
const addCustomize = () => config => {
// 打包模式
if(process.env.NODE_ENV === 'production') {
...
const { promisify } = require('util');
const clear = require('clear')
const chalk = require('chalk')
const figlet = promisify(require('figlet'))
clear()
const log = content => console.log(chalk.blue(content))
figlet('DOMESY !').then(res => log(res))
...
} else if(process.env.NODE_ENV === 'development'){
}
return config
}
这里注意下 chalk 为 '^4.1.0'的版本
来让我们看下效果吧~
5.安装组件库
在这里我们选择的组件库为 ant-desgin-mobile,这个组件库最近才进行更新,直接从 V2 跳到了 V5~,所以基本V2的所有组件都无法用,当然官方给出了点迁移指南~, 详情请看:Ant Design Mobile 迁移指南
插件
antd-mobile
执行命令
yarn add antd-mobile@next
然后直接引入就可以了
import { Button } from 'antd-mobile'
retrun (
<Button color='primary'>Primary</Button>
)
6. 单位转化
大家都知道,在 PC 端中, css 是以 px 为单位,而在移动端中 是以 rem 为单位,如果做移动端,要进行 px 转化为 rem, 那么就会很麻烦,这是就需要一个插件 自动将其转化
必须在 less 文件中起作用,行内样式无用
插件 postcss-px2rem-exclude lib-flexible
作用:将px自动转化为rem
执行命令:
yarn add postcss-px2rem-exclude lib-flexible -S
配置 lib-flexible
我们只需要在 index.js 中引入 import 'lib-flexible
配置postcss-px2rem-exclude
为方便起见,我们只要在 打包模式配置即可,这样在开发模式的单位就还是 px了
module.exports = override(
...,
process.env.NODE_ENV === 'production' ? addPostcssPlugins([require("postcss-px2rem-exclude")({ remUnit: 37.5, exclude: /node_modules/i })]) : null,
addDecoratorsLegacy(),
...
);
注意:
- 为方便调试,只在打包模式使用,开发模式不适用
- 页面需要配置,通常H5以375为标准
7.去除eslint警告
删除esLint,在 package.json
中的 "eslintConfig" 配置规则
{
...,
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
],
"rules": {
"no-undef": "off",
"no-restricted-globals": "off",
"no-unused-vars": "off"
}
},
...
}
同时,我们可以引入 disableEsLint
const { disableEsLint } = require('customize-cra');
module.exports = override(
...
disableEsLint(), //忽略eslint警告
);
8.配置别名
只需要在 customize-cra
中引出 addWebpackAlias即可
const { override, addWebpackAlias } = require('customize-cra');
module.exports = override(
...,
addWebpackAlias({
["@/"]: path.resolve(__dirname, "src/")
}),
...
);
如果是ts的话,文件内还是无法识别别名,需要在 tsconfig.json 中进行配置一下
在tsconfig.json
{
"extends": './paths.json',
...
}
在 path.json 中
{
"compilerOptions": {
"baseUrl": "src",
"paths": {
"@/*": [
"*"
]
}
}
}
这样就不会报错了
9.分模块打包
在内置中分为开发环境和生成环境,对应的分别为 production
和 development
模式
当然这些在 process.env
下
在开发中我们有各种各样的环境,一般公司至少有 测试环境 和 正式环境,在好一点的有灰度环境
每个环境对应的接口域名是不同的,但我们对应的包
其实办法有很多,最low的设置一个变量手动切换,在 之上通过监测地址栏进行打包(这种非常有限制,地址换需要改代码~,也比较low)
那么有没有更好的方法呢?我们希望通过名令去打对应环境的包,这样就回很方便
插件:cross-env
执行命令
yarn add cross-env
配置:在 package.json
{
...,
"scripts": {
"start": "react-app-rewired start ",
"start:pre": "cross-env REACT_APP_ENV=pre react-app-rewired start",
"build": "react-app-rewired build",
"starbuildt:pre": "cross-env REACT_APP_ENV=pre react-app-rewired start ",
"test": "react-app-rewired test",
"eject": "react-scripts eject"
},
...
}
这样就ok了
你只需要执行 yarn run start:pre 就OK了
此时你的环境变量就会多一个 REACT_APP_ENV = pre的,我们就可以以这个变量作为判断的标准,进行分模块打包了
我们打印下 process.env
10.配置装饰器
装饰器不用多说,只能用于 class 组件,当然这里推崇使用 Hook,但为了有使用 class 的小伙伴,也就直接把装饰也配置上吧~
插件: @babel/plugin-proposal-decorators
执行命令 yarn add @babel/plugin-proposal-decorators
const { override, addDecoratorsLegacy } = require('customize-cra');
module.exports = override(
...,
addDecoratorsLegacy(),
...
);
11.配置打包分析
我们可以根据写完的页面进行打包大小的分析
插件:webpack-bundle-analyzer
执行命令
yarn add webpack-bundle-analyzer
打包后会在 build 下生成一个静态报告文件 report.html, 而不是启动一个 web 服务
const { override, addWebpackPlugin } = require('customize-cra');
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
module.exports = override(
...,
process.env.NODE_ENV === 'production' ? addWebpackPlugin(
new BundleAnalyzerPlugin({
analyzerMode: 'static'
) : undefined
);
12.其他事项
- 打包的时候无法正常显示,需要在 package.json 中配置 “homepage”: "." 即可
{
...,
"homepage": ".",
...
}
- 将 public 中的 index.html 改为
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
本文仅提供参考,若有不对的地方,欢迎在评论区留下您宝贵的意见
其他文章:
转载自:https://juejin.cn/post/7052204193968291870