移动端开发项目搭建流程记录

一、项目搭建

1、目录创建:

create-react-app:创建项目。

引入样式文件index.scss 引入报错,提示没有找到sass 文件。需要我们安装依赖:yarn add sass -D

  • 使用组件库:antd design mobile 移动端ui组件库。

2、项目配置项:

当我们想要修改项目的配置的时候,而且我们不想要影响原来的webpack的配置,我们需要安装两个插件,分别是:react-app-rewiredcustomize-cra;

  • react-app-rewired:是用来修改启动命令的。
  • 在根目录下新建文件config-overrides.js
//config-overrides.js
	
	//用于覆盖webpack的配置
	module.exports = function override(config,env) {
    // do stuff with the webpack config ...
    return config
}
  • 通过上面的启动命令之后,我自动的配置上面的文件。

安装命令:
npm install react-app-rewired customize-cra --save-dev

  • 我们还需要配置按需加载,需要安装插件:

npm install babel-plugin-import -D

  • 按需加载还需要修改上面的config-overrides.js文件内容
//config-overrides.js

const {
    override,
    fixBabelImports,
    addLessLoader,
} = require("customize-cra");


module.exports = override(
    fixBabelImports("import", {
        libraryName: "antd", libraryDirectory: "es", style: true // change importing css to less
    }),
    addLessLoader({
        javascriptEnabled: true,
        modifyVars: { "@primary-color": "#1DA57A" }
    })
);

按需加载的好处就是不用在index.js文件中直接导入全的antd-mobile样式了

项目报错了,需要把,的版本降低,使用下面的命令:
react-app-rewired@2.0.2-next.0

  • 配置根目录文件的提示路径
//jsconfig.json--跟目录下
	{
  "compilerOptions": {
    "baseUrl": "./",
    "paths": {
      "@/*": ["src/*"],
      "@/scss/*": ["src/assets/styles/*"]
    }
  }
}

3、整体目录

在这里插入图片描述

4、配置视口单位插件

目标:通过webpack插件将px单位自动转换成视口长度单位vw/vh,实现页面对不同屏幕的自动适配。

  • 使用postcss-px-to-viewport插件,可让我们直接在代码中按设计稿的px值来编写元素尺寸,他们最终会自动转换成vw/vh长度单位。
  • 安装 postcss-px-to-viewport
	yarn add postcss-px-to-viewport -D
  • config-overrides.js中添加配置代码:
	

项目报错antd无法加载的时候检查下面的配置,可以解决无法加载的问题
在这里插入图片描述

二、使用craco来配置webpack配置。

为什么使用这两个种方式来配置webpack的配置,是因为使用create-react-app创建的项目不会暴露config配置项。
通过这个方式,可以配置webapck配置,并且合并到webpack配置项中。

在这里插入图片描述

链接: cacro文档地址

最重要的浏览器适配,使用 postcss-px-to-viewport

1、安装

	yarn add postcss-px-to-viewport-8-plugin

2、配置cacro.config.js文件

	
const path = require('path')

const pathResolve = pathUrl => path.join(__dirname, pathUrl)

module.exports = {
    style: {
        postcss: {
            mode: "extends",
            loaderOptions: {
                postcssOptions: {
                    ident: "postcss",
                    plugins: [
                        [
                            "postcss-px-to-viewport-8-plugin",
                            {
                                viewportWidth: 375, // 设计稿的视口宽度
                            },
                        ],
                    ],
                },
            },
        },
    },
    webpack: {
        configure: (webpackConfig, { env, paths }) => {
            return webpackConfig
        },
        alias: {
            '@@': pathResolve('.'),
            '@': pathResolve('src')
            // 此处是一个示例,实际可根据各自需求配置
        }
    },
    plugins: [
    ]
}


上面的两种方式,第二种通过cacro的方式可以实现浏览器适配,第一种报错,暂时未解决

三、表单校验的两种方式

1、两种方式都是基于Formik的组件的基础上

	//第一种实现的方式:基于formik自己的组件库
	import styles from './index.module.scss'
	import TopBar from "@/components/common/TopBar";
	import Input from '@/components/common/Input'
	import { useFormik } from 'formik'
	export default  function Login() {
        const formik = useFormik({
            initialValues:{
                mobile:'',
                code:''
            },
            onSubmit:(values)=>{
                console.log(values)
            },
            validate:(values)=>{
                const errors = {};
                if(!values.mobile) {
                    errors.mobile = '手机号码不能为空';
                }
                if(!values.code) {
                    errors.code = '验证码不能为空';
                }
                return errors;
            }
        });
    const onExtraClick = ()=>{
        console.log('haha')
    }
    const {values:{mobile,code},handleChange,handleSubmit,errors,handleBlur,touched} = formik;
    return (
        <div className={styles.root}>
            <TopBar>登录</TopBar>
            <div className='content'>
                <h3>短信登录</h3>
                <form onSubmit={handleSubmit}>
                    <div className='input-item'>
                        <Input
                            placeholder='请输入手机号'
                            name='mobile'
                            onChange={handleChange}
                            value={mobile}
                            autoComplete="off"
                            onBlur = {handleBlur}
                        ></Input>
                        {/*<div className='validate'>手机号码错误信息</div>*/}
                        {touched.mobile && errors.mobile?<div className='validate'>{errors.mobile}</div>:null}
                    </div>
                    <div className='input-item'>
                        <Input
                            placeholder='请输入验证码'
                            extra='获取验证码'
                            onExtraClick={onExtraClick}
                            onChange={handleChange}
                            autoComplete="off"
                            value={code} name="code"
                            onBlur={handleBlur}
                        ></Input>
                        {/*<div className='validate'>验证码错误信息</div>*/}
                        { touched.code && errors.code ?<div className='validate'>{errors.code}</div>:null}
                    </div>
                    <button type='submit' className='login-btn'>登录</button>
                </form>
            </div>
        </div>

    )
}
	//第二种方式:基于formik中使用yup组件,这种方式更加清晰,更加灵活,推荐使用这种。
	import styles from './index.module.scss'
	import TopBar from "@/components/common/TopBar";
	import Input from '@/components/common/Input'
	import { useFormik } from 'formik'
	import * as Yup from 'yup'
	export default  function Login() {
        const formik = useFormik({
            initialValues:{
                mobile:'',
                code:''
            },
            onSubmit:(values)=>{
                console.log(values)
            },
            validationSchema:Yup.object({
                mobile:Yup.string().required('手机号不能为空').matches(/^1[3-9]\d{9}$/,'手机号格式错误'),
                code:Yup.string().required('验证码不能为空').matches(/^\d{6}$/,'验证码格式错误')
            })
        });
    const onExtraClick = ()=>{
        console.log('haha')
    }
    const {values:{mobile,code},handleChange,handleSubmit,errors,handleBlur,touched} = formik;
    return (
        <div className={styles.root}>
            <TopBar>登录</TopBar>
            <div className='content'>
                <h3>短信登录</h3>
                <form onSubmit={handleSubmit}>
                    <div className='input-item'>
                        <Input
                            placeholder='请输入手机号'
                            name='mobile'
                            onChange={handleChange}
                            value={mobile}
                            autoComplete="off"
                            onBlur = {handleBlur}
                        ></Input>
                        {/*<div className='validate'>手机号码错误信息</div>*/}
                        {touched.mobile && errors.mobile?<div className='validate'>{errors.mobile}</div>:null}
                    </div>
                    <div className='input-item'>
                        <Input
                            placeholder='请输入验证码'
                            extra='获取验证码'
                            onExtraClick={onExtraClick}
                            onChange={handleChange}
                            autoComplete="off"
                            value={code} name="code"
                            onBlur={handleBlur}
                        ></Input>
                        {/*<div className='validate'>验证码错误信息</div>*/}
                        { touched.code && errors.code ?<div className='validate'>{errors.code}</div>:null}
                    </div>
                    <button type='submit' className='login-btn'>登录</button>
                </form>
            </div>
        </div>

    )
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值