Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 635|回复: 0

跟我一起使用create-react-app脚手架搭建vw-layout解决方案

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 802 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726006
    发表于 2021-7-22 09:34:54 | 显示全部楼层 |阅读模式

    之前也是看过大漠的vw适配Vue-cli,我自己写H5,还有使用vue做项目的时候,会搭建大漠博客中的那一套。
    现在在github上面,看见了一位博主使用create-react-app也是用vw适配,非常开心,现在我们一起使用vw给react适配移动端项目吧~
    先放上博主大大的开源地址:https://github.com/gaohan1994/react-vw-layout
    给各位无私开源的程序员们点赞,你们是最可爱的人儿。
    1.创建项目

    cnpm install -g create-react-app
    create-react-app react-vw-layout
    cd react-vw-layout
    npm start
    

    2..打开配置选项
    由于react默认隐藏webpack配置需要手动显示。
    eject完的项目如下

    第二步收工,第三部开始配置各种插件。
    3.增加配置
    安装postCss插件

    cnpm i --save postcss-aspect-ratio-mini postcss-px-to-viewport postcss-write-svg postcss-cssnext postcss-viewport-units cssnano
    

    在config/webpack.confi.js文件中进行如下修改
    1.引入postCss插件

    const postcssAspectRatioMini = require('postcss-aspect-ratio-mini');
    const postcssPxToViewport = require('postcss-px-to-viewport');
    const postcssWriteSvg = require('postcss-write-svg');
    const postcssCssnext = require('postcss-cssnext');
    const postcssViewportUnits = require('postcss-viewport-units');
    const cssnano = require('cssnano');
    

    2.加入postCss配置

    加入配置代码位置如下

      {
            // Options for PostCSS as we reference these options twice
            // Adds vendor prefixing based on your specified browser support in
            // package.json
            loader: require.resolve('postcss-loader'),
            options: {
              // Necessary for external CSS imports to work
              // https://github.com/facebook/create-react-app/issues/2677
              ident: 'postcss',
              plugins: () => [
                require('postcss-flexbugs-fixes'),
                require('postcss-preset-env')({
                  autoprefixer: {
                    flexbox: 'no-2009',
                  },
                  stage: 3,
                }),
                // Adds PostCSS Normalize as the reset css with default options,
                // so that it honors browserslist config in package.json
                // which in turn let's users customize the target behavior as per their needs.
                // postcssNormalize()
                // 加入地点
                // 加入地点
              ],
              sourceMap: isEnvProduction && shouldUseSourceMap,
            },
          },
    

    需要加入的代码如下

    postcssAspectRatioMini({}),
    postcssPxToViewport({ 
      viewportWidth: 750, // (Number) The width of the viewport. 
      viewportHeight: 1334, // (Number) The height of the viewport. 
      unitPrecision: 3, // (Number) The decimal numbers to allow the REM units to grow to. 
      viewportUnit: 'vw', // (String) Expected units. 
      selectorBlackList: ['.ignore', '.hairlines'], // (Array) The selectors to ignore and leave as px. 
      minPixelValue: 1, // (Number) Set the minimum pixel value to replace. 
      mediaQuery: false // (Boolean) Allow px to be converted in media queries. 
    }),
    postcssWriteSvg({
      utf8: false
    }),
    postcssCssnext({}),
    postcssViewportUnits({}),
    cssnano({
      preset: "advanced", 
      autoprefixer: false, 
      "postcss-zindex": false 
    })
    

    4.测试
    修改App.js

    import React, { Component } from 'react';
    import './App.css';
    
    class App extends Component {
      render() {
        return (
          <div className="App">
            hello vw-layout
          </div>
        );
      }
    }
    export default App;
    

    修改App.css

    .App {
      width: 750px;
      height: 200px;
      background: #f27a7a;
      color: #ffffff;
      line-height: 200px;
      text-align: center;
    }
    

    接下来运行项目,运行项目会报错

    解决办法为:

    cnpm i cssnano-preset-advanced --save-dev
    

    运行项目

    5.生产环境打包项目
    使用npm run build报错

    解决办法为修改package.json文件

     [
        "last 2 versions",
        "android 4",
        "opera 12"
      ],
    

    接下来打包项目成功

    打开static/css/main.********.css

    6.加入viewport-units-buggyfill配置
    打开public/index.html

    首先在中引入阿里cdn

    <script src="//g.alicdn.com/fdilab/lib3rd/viewport-units-buggyfill/0.6.2/??viewport-units-buggyfill.hacks.min.js,viewport-units-buggyfill.min.js"></script>
    

    在body中,加入如下js代码:

    <script>
      window.onload = function () {
        window.viewportUnitsBuggyfill.init({
          hacks: window.viewportUnitsBuggyfillHacks
        });
      }
    </script>
    

    最终index.html如下

    //index.html
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <meta name="theme-color" content="#000000" />
        <meta
          name="description"
          content="Web site created using create-react-app"
        />
        <link rel="apple-touch-icon" href="logo192.png" />
        <!--
          manifest.json provides metadata used when your web app is installed on a
          user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
        -->
        <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
        <!--
          Notice the use of %PUBLIC_URL% in the tags above.
          It will be replaced with the URL of the `public` folder during the build.
          Only files inside the `public` folder can be referenced from the HTML.
    
          Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
          work correctly both with client-side routing and a non-root public URL.
          Learn how to configure a non-root public URL by running `npm run build`.
        -->
        <title>React App</title>
        <script src="//g.alicdn.com/fdilab/lib3rd/viewport-units-buggyfill/0.6.2/??viewport-units-buggyfill.hacks.min.js,viewport-units-buggyfill.min.js"></script>
      </head>
      <body>
        <noscript>You need to enable JavaScript to run this app.</noscript>
        <div id="root"></div>
        <script>
          window.onload = function () {
            window.viewportUnitsBuggyfill.init({
              hacks: window.viewportUnitsBuggyfillHacks
            });
          }
        </script>
        <!--
          This HTML file is a template.
          If you open it directly in the browser, you will see an empty page.
    
          You can add webfonts, meta tags, or analytics to this file.
          The build step will place the bundled scripts into the <body> tag.
    
          To begin the development, run `npm start` or `yarn start`.
          To create a production bundle, use `npm run build` or `yarn build`.
        -->
      </body>
    </html>
    

    重新执行npm start打开页面发现:

    如果遇到img无法显示,则添加全局css

    img { 
        content: normal !important; 
    }
    

    这样就适配了低版本安卓机型
    7.加入css-modules配置
    一般的小项目不使用css-modules已经可以hold住了,但是页面多起来还是建议使用css-modules,下面介绍一下用法:

    npm i --save react-css-modules
    

    在App.js文件中引入插件 import CSSModules from 'react-css-modules';

    修改css文件的引入方式 从import './App.css';修改为import styles from './App.css';

    修改引用Css方式 className=>styleName

    修改导出方式 export default App=>export default CSSModules(App, styles);

    保存,从新执行npm start查看页面发现失败

    原因是未打开css import配置,此时import styles from './App.css';该语句并未成功引入css文件。

    打开webpack.config.js加入modules: true 找到如下位置

      {
            loader: require.resolve('css-loader'),
            // options: cssOptions,
            // 代码看这里看这里
            options:{
              //添加添加添加
              modules:true,
              importLoaders:1,
            }
          },
    

    保存,再次执行npm start查看页面

    是这个class名太过乱码不适于调试,再次打开webpack.config.dev.js 找到如下位置加入语句localIdentName:'[name][local][hash:base64:5]'

     {
            loader: require.resolve('css-loader'),
            // options: cssOptions,
            // 代码看这里看这里
            options:{
              //添加添加添加
              modules:true,
              importLoaders:1,
              localIdentName: '[name]_[local]_[hash:base64:5]'
            }
          }
    

    再次运行项目

    我们可以看到对应的class,方便我们在项目中的调试
    最后我们执行npm run build 查看打包文件

    嗯,已经大功告成啦啦啦啦啦啦啦
    开心,再次感谢作者大大无私的分享经验

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-15 12:24 , Processed in 2.822595 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表