前言:我第一次接觸到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
在項目根目錄下新建config-overrides.js文件。內容以下:git
module.exports = function override(config, env) { //do stuff with the webpack config... return config; }
yarn add react-app-rewire-postcss --dev
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>
修改項目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解決方案,若有錯誤歡迎指出。