Taro 兼容 h5 踩坑指南

最近一周在改造 公羊閱讀?? Taro 版本適配 h5 端漾抬,過(guò)程中改改補(bǔ)補(bǔ),好不酸爽碑诉。
本文記錄??遇到的問(wèn)題彪腔,希望為有相同需求的哥們??節(jié)約點(diǎn)時(shí)間。
Taro 版本:1.3.9进栽。
client_mobile_taro github地址

解決跨域問(wèn)題

h5 發(fā)請(qǐng)求會(huì)報(bào)跨域問(wèn)題德挣,需要使用代理轉(zhuǎn)換請(qǐng)求。

編輯根目錄下的 config/index.js 文件

h5: {
    devServer: {
        host: 'localhost',
        port: 10086,
        proxy: {
            '/api/v1': {
                target: 'http://localhost:8000',  // 服務(wù)端地址
                changeOrigin: true
            }
        }
    },
}
  • 代理前的請(qǐng)求:http://localhost:10086/api/v1/user
  • 代理后的請(qǐng)求:http://localhost:8000/api/v1/user

樣式單位

小程序里規(guī)定 1px = 2rpx快毛,Taro 對(duì)于像素(px)有一套自己的規(guī)則格嗅。

在 Taro 里可以寫(xiě) rpx 作為單位。

  • Taro 代碼轉(zhuǎn)小程序代碼:無(wú)縫轉(zhuǎn)換為小程序單位唠帝;
  • Taro 代碼轉(zhuǎn) h5 代碼:無(wú)法轉(zhuǎn)換屯掖。
// taro
height: 10rpx;

// weapp
height: 10rpx;

// h5
// 無(wú)法轉(zhuǎn)換單位

在 Taro 里寫(xiě) px 作為單位。

  • Taro 代碼轉(zhuǎn)小程序代碼:1px = 1rpx襟衰,這一點(diǎn)和小程序文檔里介紹的規(guī)則不一樣贴铜;
  • Taro 代碼轉(zhuǎn) h5 代碼:會(huì)自動(dòng)將 px 轉(zhuǎn)換為 rem 單位
// taro 
height: 10px;

// weapp
height: 10rpx;

// h5
height: 0.625rem;

在 Taro 里寫(xiě) PX (大寫(xiě)字母)作為單位右蒲。

  • Taro 代碼轉(zhuǎn)小程序代碼:1PX = 2rpx阀湿;
  • Taro 代碼轉(zhuǎn) h5 代碼:1PX = 1px。
// taro
height: 10PX;

// weapp
hegiht: 20rpx;

// h5
height: 10px;

實(shí)際開(kāi)發(fā)中瑰妄。如果你是將小程序端代碼用 Taro 重寫(xiě)一遍陷嘴,直接將小程序里面的樣式文件復(fù)制到 Taro 里,并且將所有的 rpx 替換成 px间坐,即可同時(shí)適應(yīng)小程序端和 h5 端灾挨。

樣式?jīng)_突

h5 頁(yè)面源代碼如下:

Taro h5 端源碼

可以看到,一個(gè) class="taro_pages" 就是一個(gè)頁(yè)面竹宋,所有頁(yè)面都寫(xiě)在??同一個(gè) html 頁(yè)面內(nèi)劳澄,通過(guò) display: "none" 隱藏暫時(shí)不需要的頁(yè)面。

so蜈七,不同頁(yè)面的樣式名(class)如果一樣秒拔,頁(yè)面之間會(huì)互相影響。

官方提供 CSS Module 的寫(xiě)法來(lái)避免樣式名稱(chēng)重復(fù)的問(wèn)題飒硅,不過(guò)個(gè)人感覺(jué)這樣寫(xiě)起來(lái)很難看砂缩。

實(shí)際開(kāi)發(fā)中,我會(huì)將每個(gè)樣式都加上該頁(yè)面的英文單詞作為前綴三娩。比如頁(yè)面書(shū)架(shelf)頁(yè)面庵芭,樣式名稱(chēng)原本為 class="novel-list",拼接之后就變成 class="shelf_novel-list"雀监。

窗口高度

  • 小程序端有頭部導(dǎo)航條和底部導(dǎo)航條双吆,下左圖;
  • h5 端默認(rèn)是沒(méi)有頭部導(dǎo)航條的,下右圖好乐。
h5端默認(rèn)沒(méi)有頭部導(dǎo)航條

二者實(shí)際存儲(chǔ)內(nèi)容的高度不同匾竿,會(huì)導(dǎo)致部分頁(yè)面變形,可以使用下面??的方法獲取窗體高度自行修改 css 樣式高度曹宴。

// utils/common.js
import Taro from '@tarojs/taro'

export function getWindowHeight(showTabBar = true) {
    const TAB_BAR_HEIGHT = 50
    const NAVIGATOR_HEIGHT = 44
    const info = Taro.getSystemInfoSync()
    const { windowHeight, statusBarHeight } = info
    const tabBarHeight = showTabBar ? TAB_BAR_HEIGHT : 0
  
    if (process.env.TARO_ENV === 'rn') {
      return windowHeight - statusBarHeight - NAVIGATOR_HEIGHT - tabBarHeight
    }
  
    if (process.env.TARO_ENV === 'h5') {
      return `${windowHeight - tabBarHeight}px`
    }
  
    return `${windowHeight}px`
}

不同端加載不同組件

使用場(chǎng)景:

  • 小程序端點(diǎn)擊按鈕會(huì)顯示用戶(hù)昵稱(chēng)和頭像搂橙;
  • H5 里沒(méi)有這個(gè) API歉提,二者應(yīng)當(dāng)生成不同的頁(yè)面笛坦。

方法一:不同端寫(xiě)不同的組件。下方代碼示例苔巨,在 index.js 中引入組件版扩,Taro 會(huì)自動(dòng)根據(jù)不同環(huán)境獲取不同的組件。

|-- shelf
    |-- components
        |-- header.weapp.js
        |-- header.h5.js
    |-- index.js

// index.js
import header from './components/header'

方法二:根據(jù) process.env.TARO_ENV 環(huán)境變量侄泽,渲染不同子組件礁芦。

// index.js

// ....
if (process.env.TARO_ENV === 'weapp') {
    // 微信小程序端執(zhí)行邏輯
} else if (process.env.TARO_ENV === 'h5') {
    // h5 端執(zhí)行邏輯
} else if (process.env.TARO_ENV === 'rn') {
    // react-native 端執(zhí)行邏輯
}

上面兩種方法乍看起來(lái),大多數(shù)人都會(huì)選擇第一種悼尾,會(huì)覺(jué)得第二種方法很復(fù)雜柿扣。

dk 在實(shí)際開(kāi)發(fā)中發(fā)現(xiàn):

  • 第一種反而更麻煩,組件并不僅僅只是渲染頁(yè)面闺魏,還要處理按鈕點(diǎn)擊事件未状,父子組件的狀態(tài)值傳遞等等,并沒(méi)有想象中簡(jiǎn)單析桥;
  • 第二種看起來(lái)好像要對(duì)每種環(huán)境都做單獨(dú)判斷司草,實(shí)際開(kāi)發(fā)中 h5 端和 rn 端的邏輯幾乎是一樣的,也就是只要判斷兩種情況:weapp 端和非 weapp 端即可泡仗。

封裝不同的請(qǐng)求方法

使用場(chǎng)景:

  • 微信小程序端登錄需要使用 code 去拿 openId埋虹,進(jìn)而獲取 token 和 userId,小程序端的登錄操作是隱式的娩怎;
  • h5 端和 rn 端需要提供登錄搔课、注冊(cè)等功能,用戶(hù)需要顯式登錄之后截亦,才能進(jìn)行之后的操作爬泥。

請(qǐng)求庫(kù)封裝必不可少,開(kāi)發(fā)者不希望每次請(qǐng)求都手動(dòng)獲取 token魁巩,亦或是手動(dòng)添加請(qǐng)求頭類(lèi)型急灭,像這種公共操作可以封裝一個(gè)請(qǐng)求庫(kù)。

參考代碼:request.js

POST 請(qǐng)求無(wú)法攜帶參數(shù)

  • 小程序端非 GET 請(qǐng)求默認(rèn)會(huì)把參數(shù)當(dāng)做 json 傳遞谷遂;
  • h5 端 官方文檔 上寫(xiě)著默認(rèn)也是 json 傳遞葬馋,實(shí)測(cè)并不是。
    在瀏覽器 Network 中發(fā)現(xiàn)請(qǐng)求體的 Content-Type 為 text/plain,參數(shù)被當(dāng)做字符串傳遞了畴嘶。

解決方法:手動(dòng)設(shè)置請(qǐng)求頭類(lèi)型蛋逾。

header: {
    'content-type': 'application/json'
}

componentDidShow() 不生效

實(shí)際開(kāi)發(fā)中,在筆記本電腦上用瀏覽器模擬移動(dòng)端時(shí) componentDidShow() 都是生效的窗悯,代碼部署到線上区匣,在手機(jī)上訪問(wèn)網(wǎng)站,發(fā)現(xiàn) componentDidShow() 不生效蒋院。我測(cè)試了百度瀏覽器和谷歌瀏覽器亏钩,都不生效。

暫時(shí)還沒(méi)找到替代的方案欺旧,如果你有 componentDidShow() 在 h5 端的替代方案姑丑,希望可以留言告知我(email: <span>me@dkvirus.com</span>)

補(bǔ)充:taro 升級(jí)到 1.3.14 后 componentDidShow() 生效了。

onPullDownRefresh() 不生效

在 pc 端瀏覽器以及真機(jī)上測(cè)試下拉刷新都不生效辞友,并且下拉之后栅哀,頁(yè)面沒(méi)有回去(頭部空白部分)。

onPullDownRefresh() 不生效
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末称龙,一起剝皮案震驚了整個(gè)濱河市留拾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲫尊,老刑警劉巖痴柔,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異马昨,居然都是意外死亡竞帽,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)鸿捧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屹篓,“玉大人,你說(shuō)我怎么就攤上這事匙奴《亚桑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵泼菌,是天一觀的道長(zhǎng)谍肤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)哗伯,這世上最難降的妖魔是什么荒揣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮焊刹,結(jié)果婚禮上系任,老公的妹妹穿的比我還像新娘恳蹲。我一直安慰自己,他們只是感情好俩滥,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布嘉蕾。 她就那樣靜靜地躺著,像睡著了一般霜旧。 火紅的嫁衣襯著肌膚如雪错忱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天挂据,我揣著相機(jī)與錄音以清,去河邊找鬼。 笑死棱貌,一個(gè)胖子當(dāng)著我的面吹牛玖媚,可吹牛的內(nèi)容都是我干的箕肃。 我是一名探鬼主播婚脱,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勺像!你這毒婦竟也來(lái)了障贸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吟宦,失蹤者是張志新(化名)和其女友劉穎篮洁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體殃姓,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袁波,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜗侈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篷牌。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖踏幻,靈堂內(nèi)的尸體忽然破棺而出枷颊,到底是詐尸還是另有隱情,我是刑警寧澤该面,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布夭苗,位于F島的核電站,受9級(jí)特大地震影響隔缀,放射性物質(zhì)發(fā)生泄漏题造。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一猾瘸、第九天 我趴在偏房一處隱蔽的房頂上張望界赔。 院中可真熱鬧桥嗤,春花似錦、人聲如沸仔蝌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敛惊。三九已至渊鞋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞧挤,已是汗流浹背锡宋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留特恬,地道東北人执俩。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像癌刽,于是被迫代替她去往敵國(guó)和親役首。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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

  • 背景 眾所周知如今市面上端的形態(tài)多種多樣显拜,手機(jī)Web衡奥、ReactNative、微信小程序, 支付寶小程序, 快應(yīng)用...
    這個(gè)前端不太冷閱讀 4,334評(píng)論 0 2
  • 文章發(fā)表于 http://blog.poetries.top/2019/06/08/taro-summary 一远荠、...
    程序員poetry閱讀 3,919評(píng)論 2 1
  • 前端開(kāi)發(fā)面試題 面試題目: 根據(jù)你的等級(jí)和職位的變化矮固,入門(mén)級(jí)到專(zhuān)家級(jí),廣度和深度都會(huì)有所增加譬淳。 題目類(lèi)型: 理論知...
    怡寶丶閱讀 2,588評(píng)論 0 7
  • 今天看到了100天日記這個(gè)標(biāo)簽?档址,決定給自己一次機(jī)會(huì). 嘗試一下. 無(wú)記錄,不發(fā)生. 就當(dāng)記錄每天的日程和感受. ...
    柏小豬閱讀 203評(píng)論 0 0
  • 楔 子 “歡迎回到世界邻梆,夏時(shí)守伸。”她聽(tīng)到這句話确虱,心像忽地浸入沸水中含友,驀地溫暖起來(lái)。 心態(tài)反意識(shí) 林間下起了細(xì)而密的雨...
    吳佑安安安閱讀 236評(píng)論 0 1