create-react-app+react-app-rewired搭建viewport解决方案

create-react-app搭建vw-layout解决方案

前言:我第一次接触到vw适配移动端的方案是在大漠先生的博客里(如何在Vue项目中使用vw实现移动端适配),强烈建议没看过的朋友先去看一下这篇博客。vw解决方案早有耳闻,我也很想上手尝试一下,因此想要本身上手配置一个CRA脚手架的解决方案。在本身动手以前也先查了一些资料,其中Ghan的这篇博客颇有帮助:使用create-react-app脚手架搭建vw-layout解决方案。和Ghan的方案不一样,我研究了下决定借助react-app-rewired来搭建。下面把个人配置过程写在这里,有什么不对的地方欢迎批评,小白第一次配,求轻拍。css

先上一些背景资料。主要用到如下几个工具:
react-app-rewired:一个CRA再配置的工具,源自React社区,能够在不eject的状况下自定义配置CRA脚手架建立的app。原理很简单,在项目根目录下新建一个配置文件(config-overrides.js),把webpack的配置做为一个config对象传入react-app-rewired,再用config-overrides中的配置对其作修改,而后用修改后的config对象对项目打包。
react-app-rewire-postcss:一个react-app-rewired中使用的postcss-loader。经过在config-overrides.js中加载这个loader并自定义配置,从而实现修改CRA默认配置的目的。html

除此以外还要用到几个常规插件:
cssnano-preset-advanced
postcss-aspect-ratio-mini
postcss-px-to-viewport
postcss-write-svg
cssnano
postcss-viewport-units
postcss-flexbugs-fixes
postcss-preset-envvue

其中,postcss-flexbugs-fixes、postcss-preset-env是目前版本CRA的默认配置,就不作过多的解释了;因为cssnano的配置中使用了preset: "advanced"配置,须要安装cssnano-preset-advanced包;zhipostcss-aspect-ratio-mini、postcss-px-to-viewport、postcss-write-svg、cssnano、postcss-viewport-units这几个插件是这个方案的核心,大漠先生已经作了很是详细的解释,强烈建议你们去看大漠的这篇文章。react

开始

构建

create-react-app vwpage

安装依赖

yarn add postcss-aspect-ratio-mini postcss-px-to-viewport postcss-write-svg postcss-viewport-units cssnano cssnano-preset-advanced react-app-rewired postcss-preset-env --dev
//使用yarn做为包管理工具,习惯npm的朋友也能够用npm

这里简单说明一下,大漠先生的教程中提到的postcss-cssnext已经中止维护了,整合进了postcss-preset-env这个项目中,所以不须要再安装postcss-cssnext了,具体信息参见该项目github。webpack

react-app-rewired配置

在项目根目录下新建config-overrides.js文件。内容以下:git

module.exports = function override(config, env) {
    //do stuff with the webpack config...
    return config;
}

安装react-app-rewire-postcss Loaders

yarn add react-app-rewire-postcss --dev

配置config-overrides.js

module.exports = function override(config, env) {
    require('react-app-rewire-postcss')(config, {
        plugins: loader => [
            require('postcss-flexbugs-fixes'),
            require('postcss-preset-env')({
                autoprefixer: {
                    flexbox: 'no-2009',
                },
                stage: 3,
            }),
            require('postcss-aspect-ratio-mini')({}),
            require('postcss-px-to-viewport')({
                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.
            }),
            require('postcss-write-svg')({
                utf8: false
            }),
            require('postcss-viewport-units')({}),
            require('cssnano')({
                preset: "advanced",
                autoprefixer: false,
                "postcss-zindex": false
            })
        ]
    });
    return config;
}

兼容方案

大漠老师在博客中提到了Viewport Units Buggyfill做为兼容工具,我简单看了下这个项目的gitHub介绍,这是一个buggyfill,主要是修复某些浏览器中关于viewport实现的bug,而不是做为polyfill在彻底不支持viewport的浏览器中来实现它。github

1.引入JavaScript文件:
viewport-units-buggyfill主要有两个JavaScript文件:viewport-units-buggyfill.js和viewport-units-buggyfill.hacks.js。你只须要在你的HTML文件中引入这两个文件。好比在react项目中的index.html引入它们:web

<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>

2.在body中加入如下代码:npm

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

One more thing

修改项目package.json中的npm scripts:json

/* package.json */

  "scripts": {
-   "start": "react-scripts start",
+   "start": "react-app-rewired start",
-   "build": "react-scripts build",
+   "build": "react-app-rewired build",
-   "test": "react-scripts test --env=jsdom",
+   "test": "react-app-rewired test --env=jsdom"
}

后记:完结撒花~本文简单研究了一下如何搭建viewport解决方案,若有错误欢迎指出。

相关文章
相关标签/搜索