基于 react vue 的移動端終極適配方案

先上github地址 https://github.com/gaohan1994/react-vw-layout 有空點個贊蛤~~

2018-4-19日更新適配到安卓低版本的插件buggyfill(是我疏忽導(dǎo)致大家以為vw解決方案兼容范圍過小用狱,原第六步css-modules改為buggyfill耻涛,css-modules順延為第七步)

2018-4-16日更新css-modules配置茉贡,前面步驟不變旬蟋,可直接跳到第七步。

寫在前面的話

在接觸到大漠先生牽頭開發(fā)的vw解決方案之前大咱,我使用的是阿里的第一代適配解決方案 lib-flexible 在使用vw解決方案開發(fā)一套H5之后礁竞,我真正的被vw的威力所折服夷恍。
由于大漠先生只給出了vue-cli的配置方式拱雏,并未給出react系列對應(yīng)腳手架create-react-app配置版本棉安,在看過大漠先生的配置之后底扳,我在create-react-app腳手架生成的項目上進行了一套配置铸抑,使得使用react的各位師兄弟也可以使用vw解決方案!
話不多說開工

vue使用方式:《如何在Vue項目中使用vw實現(xiàn)移動端適配》
關(guān)于具體如何使用請參考
再聊移動端頁面的適配
使用Flexible實現(xiàn)手淘H5頁面的終端適配

移動端適配最接近完美的解決方案在react中的使用方式衷模。本文只講create-react-app創(chuàng)建的項目如何配置鹊汛,具體每個插件的用途和使用方法請先查閱大漠先生的文章蒲赂,我相信大漠先生的文章已經(jīng)講的很明白。

《如何在Vue項目中使用vw實現(xiàn)移動端適配》

《如何在Vue項目中使用vw實現(xiàn)移動端適配》

《如何在Vue項目中使用vw實現(xiàn)移動端適配》

重要的事情說三遍刁憋。一定要先大概看一下大漠先生的文章再往下看滥嘴,否則可能會一頭霧水。

1.創(chuàng)建項目

create-react-app react-vw-layout
cd react-vw-layout
npm start

打開http://localhost:3000/ 可以看到react歡迎頁面至耻,第一步成功若皱。

2.打開配置選項

由于react默認隱藏webpack配置需要手動顯示。

npm run eject
//Are you sure you want to eject? This action is permanent. (y/N) 
y

運行完eject之后項目結(jié)構(gòu)如下


項目結(jié)構(gòu).png

第二步收工尘颓,第三部開始配置各種插件走触。

3.增加配置

安裝postCss插件

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

config/webpack.config.dev.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配置

加入配置代碼位置如下

{
    test: /\.css$/,
    use: [
      require.resolve('style-loader'),
      {
        loader: require.resolve('css-loader'),
        options: {
          importLoaders: 1,
        },
      },
      {
        loader: require.resolve('postcss-loader'),
        options: {
          // Necessary for external CSS imports to work
          // https://github.com/facebookincubator/create-react-app/issues/2677
          ident: 'postcss',
          plugins: () => [
            require('postcss-flexbugs-fixes'),
            autoprefixer({
              browsers: [
                '>1%',
                'last 4 versions',
                'Firefox ESR',
                'not ie < 9', // React doesn't support IE8 anyway
              ],
              flexbox: 'no-2009',
            }),
            //加入地點
            //加入地點
            //加入地點
          ],
        },
      },
    ],
},  

需要加入的代碼如下


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

重新npm start頁面顯示如下

測試demo.png

可以說是非常OK疤苹,剩下最后一個問題互广,配置生產(chǎn)環(huán)境webpack配置文件。

5.配置生產(chǎn)環(huán)境webpack.config.js

操作與配置測試環(huán)境文件相同先引入插件卧土,在相同的位置配置postCss插件
配置完成后執(zhí)行npm run build
打開static/css/main.********.css

打包后的css.png

可以看到已經(jīng)成功編譯惫皱,打完收工

6.加入viewport-units-buggyfill配置

這一步不過在大漠先生的文章中或是我自己的項目中都已經(jīng)配置,系我自己的疏忽忘記寫在文章中導(dǎo)致大家以為vw兼容范圍小尤莺。抱歉B梅蟆!颤霎!

打開public/index.html

首先在<head></head>中引入阿里cdn

<script src="http://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如下

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="theme-color" content="#000000">
    <!--
      manifest.json provides metadata used when your web app is added to the
      homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
    -->
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json">
    <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
    <!--
      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="http://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>
    <!--
      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`.
    -->
    <script>
      window.onload = function () {
        window.viewportUnitsBuggyfill.init({
          hacks: window.viewportUnitsBuggyfillHacks
        });
      }
    </script>
  </body>
</html>

重新執(zhí)行npm start打開頁面發(fā)現(xiàn):

image

如果遇到img無法顯示,則添加全局css

img { 
    content: normal !important; 
}

OK配置成功捷绑。這樣就適配了低版本安卓機型

7.加入css-modules配置

一般的小項目不使用css-modules已經(jīng)可以hold住了韩脑,但是頁面多起來還是建議使用css-modules,下面介紹一下用法:

執(zhí)行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

修改導(dǎo)出方式
export default App=>export default CSSModules(App, styles);

保存粹污,從新執(zhí)行npm start查看頁面發(fā)現(xiàn)失敗

clipboard.png

原因是未打開css import配置段多,此時import styles from './App.css';該語句并未成功引入css文件。

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

{
    test: /\.css$/,
    use: [
      require.resolve('style-loader'),
      {
        loader: require.resolve('css-loader'),
        options: {
          //看這里看這里看這里看這里
          modules: true,
          
          importLoaders: 1,
        },
      },
      {
        loader: require.resolve('postcss-loader'),
        options: {
           //.....省略
        }
      }
    ],
  },

保存壮吩,再次執(zhí)行npm start查看頁面

clipboard.png

成功进苍!但是這個class名太過亂碼不適于調(diào)試,再次打開webpack.config.dev.js
找到如下位置加入語句localIdentName:'[name]_[local]_[hash:base64:5]'

{
    test: /\.css$/,
    use: [
      require.resolve('style-loader'),
      {
        loader: require.resolve('css-loader'),
        options: {
          modules: true,
          importLoaders: 1,
          //看這里看這里看這里
          localIdentName: '[name]_[local]_[hash:base64:5]'
        },
      },
      {
        loader: require.resolve('postcss-loader'),
        options: {
           //.....省略
        }
      }
    ],
  },

再次執(zhí)行npm start查看頁面

clipboard.png

OJBK大功告成鸭叙!

最后相同步驟加入到webpack.config.prod.js
執(zhí)行npm run build 查看打包文件

clipboard.png

彳亍吧觉啊,OK了。

END.其他想說的話

git地址再發(fā)一次沈贝,希望有空能幫忙點個贊謝謝~8苋恕! https://github.com/gaohan1994/react-vw-layout 沒有配置成功的可以參考一下。尤其是css-modules可能改的地方比較多嗡善。

當初看到大漠先生的vw適配方案真的是眼前一亮辑莫,在嘗試了之后覺得這套方案的生產(chǎn)力非常強悍,其實按照本文進行配置已經(jīng)可以滿足相當一部分項目罩引,<del>除了一點就是沒有使用css-modules各吨,當然我自己已經(jīng)成功配置了css-modules要修改的地方比較多,以后會出一篇文章來再繼續(xù)分享袁铐,</del>同時我是個Typescript重度患者揭蜒!我極度作死的成功配置了create-react-app typescript versionvw + css-modules版本,現(xiàn)在回想起來配置的那幾天真的生不如死剔桨。忌锯。。各種
踩坑领炫。 等如果有人需要ts + react + vw 解決方案的時候我再寫一篇文章吧偶垮。
那就到這里了,希望大家使用vw解決方案玩的愉快帝洪!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末似舵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子葱峡,更是在濱河造成了極大的恐慌砚哗,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砰奕,死亡現(xiàn)場離奇詭異蛛芥,居然都是意外死亡,警方通過查閱死者的電腦和手機军援,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門仅淑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胸哥,你說我怎么就攤上這事涯竟。” “怎么了空厌?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵庐船,是天一觀的道長。 經(jīng)常有香客問我嘲更,道長筐钟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任赋朦,我火速辦了婚禮篓冲,結(jié)果婚禮上李破,老公的妹妹穿的比我還像新娘。我一直安慰自己纹因,他們只是感情好喷屋,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布瞭恰。 她就那樣靜靜地躺著,像睡著了一般惊畏。 火紅的嫁衣襯著肌膚如雪密任。 梳的紋絲不亂的頭發(fā)上颜启,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音浪讳,去河邊找鬼。 笑死淹遵,一個胖子當著我的面吹牛口猜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播透揣,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼济炎,長吁一口氣:“原來是場噩夢啊……” “哼辐真!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侍咱,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤楔脯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后淤年,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡溉苛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年弄诲,在試婚紗的時候發(fā)現(xiàn)自己被綠了娇唯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寂玲。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡拓哟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出断序,到底是詐尸還是另有隱情,我是刑警寧澤漱凝,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布诸迟,位于F島的核電站,受9級特大地震影響壁公,放射性物質(zhì)發(fā)生泄漏慎玖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一湿硝、第九天 我趴在偏房一處隱蔽的房頂上張望润努。 院中可真熱鬧,春花似錦铺浇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惑折,卻和暖如春枯跑,著一層夾襖步出監(jiān)牢的瞬間白热,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工纳击, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乍恐,地道東北人测砂。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓砌些,卻偏偏與公主長得像,于是被迫代替她去往敵國和親存璃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容