美文网首页
react-app-rewired 搭建viewport解决方案

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

作者: 茶艺瑶 | 来源:发表于2019-08-02 17:33 被阅读0次

什么是viewport?

表示宽度是设备屏幕的宽度

在网上一直流传一种移动端的适配方案rem

在看了很多文章后,我发现一个问题,都是说说原理,并没有告诉你如何把rem 或者 vw 用的项目当中,难道你写代码的时候还会一边拿计算器一边计算单位长度嘛?我已经想象到那个画面了。知道你同事还知道你在做什么,那不知道你的同事,会不会在怀疑你是当会计的,还是不是流出一中 “归零归零” 的叫声,那到时估计不是计算机归零咯,是你钱包归零咯。

那我们应该怎么处理这种的单位换算。

先上一些背景资料。主要用到以下几个工具:

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默认配置的目的。

为什么用react-app-rewired?

因为antd罗!自己看文档

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

其中,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这几个插件是这个方案的核心,大漠先生已经做了非常详细的解释,强烈建议大家去看大漠的这篇文章。


npm i postcss-aspect-ratio-mini postcss-px-to-viewport postcss-write-svg postcss-viewport-units cssnano cssnano-preset-advanced react-app-rewired postcss-preset-env --save-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;
}

即刻

以上方法是由polyfill实现的,在完全不支持viewport的浏览器中来实现polyfill的浏览器中,我们还需要做点兼容。

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

<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中加入以下代码:

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

如果是Create-React-App的话
请查看这里

https://github.com/gaohan1994/react-vw-layout

Vue-cli3.0 默认就是vw-layout

相关文章

网友评论

      本文标题:react-app-rewired 搭建viewport解决方案

      本文链接:https://www.haomeiwen.com/subject/dfhrdctx.html