微信小程序內嵌網頁的一些(最佳)實踐

2021-12-30 大轉轉FE
前言

3 個月前,微信小程序推出了 web-view 組件引發了一波小高潮,筆者所在的大前端團隊寫過一篇淺析,詳情可見:淺談微信小程序前端生態。

我們曾大膽猜想,這一功能,可能直接導致小程序數量增長迎來一波高峰。

畢竟磨刀霍霍卻一直資源不足的團隊應該不少,現在可以把已有 H5 應用嵌入到小程序 web-view 容器中,以最低的開發成本坐蹭微信流量紅利,何樂而不為呢?

我們也曾暢想也許「小程序頁面+ web 頁」混合開發(甚至 web 更重)會成為以後的新趨勢。

2M 代碼限制(如今已更新至 4M)使得像「轉轉官方」這樣功能繁複的小程序必須考慮引入 web 內容,再有就是小程序審核發布機制使得它終究不能像 web 一樣迭代迅速。

正好筆者所在的業務線,存在已有的 H5 應用卻無對應小程序的情況。我們在開發對應小程序時也算收穫了不少經驗(踩了不少坑),分享給有小程序需求的朋友們~

最大的坑:不支持服務通知

是的,web-view 不支持推送服務通知(或稱模板消息)。

如圖所示,類似訂閱號在對話列表的模式

為什麼能稱為最大的坑?我們先了解一下服務通知,以下引用全部來自微信官方小程序文檔。

基於微信的通知渠道,我們為開發者提供了可以高效觸達用戶的模板消息能力,以便實現服務閉環並提供更佳的體驗。

看起來很厲害,如果咱們的小程序沒這個功能會怎樣?

「用完即走」是小程序的口號,沒有服務通知代表失去了高效觸達(召回)用戶的能力,然後用戶就再也回不來了,促活和留存怎麼辦?

很多功能不是像訂閱號裡看篇文章一樣,幾分鐘就能搞定的,比如絕大部分電商的行為:從搜索、瀏覽比價、跟賣家交流,到加入購物車僅僅是走完了不到一半的生命周期;然後才是下單支付評價,還不包括推薦復購取消退款等等,沒個15-30分鐘哪裡夠。然而,沒有用戶會一直開著某個小程序,別人還要切出去聊天刷朋友圈呢。沒有了化同步為異步的能力,絕大部分產品邏輯如何實現服務閉環?

一篇教你突破小程序模板消息推送限制的文章中,也總結了服務通知的「多、快、好、省」等特點。這些先不展開,我們還能看到:

該小程序近 30 天訪問來源數據顯示,有 20% 左右的用戶通過模板消息進入小打卡,在各種來源中排名第 3 位(如果分母去掉新用戶的來源,比率和排名會更高);

況且,用戶基本都不會關閉微信的消息推送,相較 App 的推送和簡訊推送來說,小程序的推送觸達率會高很多。

so,沒有哪個(正經的)小程序會不支持服務通知(流氓些的比如拼多多,看了個商品能給你連著推 N 條)。試想一下沒有推送通知的 APP,你的產品、運營和老闆們會同意麼?

為什麼不支持

然而,為什麼 web-view 不支持服務通知?哪裡坑了?還請繼續看微信官方文檔裡的定義。

下發條件:用戶本人在微信體系內與頁面有交互行為後觸發

總結起來就是,支付3條、提交表單(該表單需聲明為要發模板消息)1條,7天有效。

首先,這裡區別了支付和提交表單兩種行為,要分不同的情況上報,開始了看到沒…

然後,web-view 不支持支付能力(其 JSAPI 能力不包含微信支付),這個在微信的文檔裡沒有顯式的聲明,不過能在微信的 web-view 問題匯總中看到,這個也挺坑的…

其實,支付行為對小程序本身而言只是極少數的交互,大多數小程序甚至不含支付。所以我們基本還得靠表單,可問題就出在這:小程序的 web-view 和表單(form 組件) 不兼容!!!

PS:我們先區分下 form 組件,它跟 web-view 內網頁的表單(form 標籤)沒有任何關係。

PS:RN 和 Weex 也沒有 form 組件。為什麼筆者一看到 form 就想到如下的圖?

1999年12月發布的 HTML 4.01 Specification 就支持了 form,自 AJAX 在2005年風靡世界後,跨域、文件上傳都有了 form 之外的解決方案,誰沒事還用這玩意?

先不吐槽微信文檔裡 form 組件的定義是有多簡陋,再看其 web-view 組件的定義~

web-view 組件是一個可以用來承載網頁的容器,會自動鋪滿整個小程序頁面。

何止鋪滿,嘗試把 web-view 放在 form 組件內,form 組件都鋪沒了。so,自動鋪滿 = 頁面獨佔 = 所有其他元素都被直接覆蓋…好吧,別人在文檔最下方的 Bug & Tip 裡寫了行小字~

綜上,web-view 跟服務通知已絕緣。so,小程序裡網頁的交互行為不算在微信體系內!!?

我不禁回想起 Google 之前推出的 PWA(Progressive Web App),在這又有那麼一絲神似。

兩者同是基於 Web 的技術,開發出(或許)可替代 APP 的偽原生應用;

PWA 的推送通知因其 API 太超前和一些不知名的服務被和諧用不了(你懂的);

小程序的服務通知嘛,你要想用 web-view 做殼就發布上線也用不了。

扯遠了點,但大家都說:PWA 是引領下一代潮流的 Web 技術超集,而小程序是對 Web 技術進行修(閹割)補(Hack)的(黑)魔法…

不做展開,歡迎移步:如何客觀地評價「小程序」的體驗? Web 在繼續離我們遠去

那怎麼辦?

由於筆者團隊的業務對服務通知與支付有大量依賴,那麼我們就要徹底放棄 web-view,把之前的 H5 應用全部重寫至原生小程序了麼?顯然不是。

正如前文所說,支付僅是電商諸多環節中的一環,主要在商品 or 訂單詳情頁(這些必須重寫)。關於服務通知,通過幾個重寫後的原生小程序頁,也能收集到足夠的 form。

基於 wepy,模板部分就是個替換+適配的活,JS 麻煩些。離同構差距不小,美團您的 mpVue 呢?

剩下的業務,理論上都可以用 web-view 來實現!!!運營活動頁就不說了,開放 web-view 能力最大的優勢就是方便了這類需求。小程序首頁,甚至配置了 tabBar 的小程序頁都可以。因為我們還發現一個神奇的 feature…

大概是用了原生的 UITabBar,web-view 和 tabBar 能共存

總結

虧了 web-view 組件的及時推出,我們只需重寫部分詳情頁和其依賴的組件,最後復盤一下。

定位:小程序的 web-view 就像是 Hybrid 客戶端嵌 H5 頁一樣,需要一些基礎能力的時候,比如支付、服務通知(IM 和召回等場景)等等,最好使用原生小程序;

兼容性:這個無須過多擔心,最新的基礎庫統計數據,1.6.4+ 的覆蓋率已達 95% 以上;

數據通信:小程序 => web-view 可以在 url 中用 search、hash 的方式,web-view => 小程序可用 bindmessage,一般用來解決分享信息傳遞的問題;

登錄:a. web-view 內走微信授權,b. 小程序登錄後再進入 web-view,並把相關 cookie 通過 url 傳遞給 web-view。

其它 feature(歡迎討論和補充):

web-view 跟小程序是獨立的兩個環境,數據完全不通,包括 cookie、session、localStorage 等等;

但小程序內嵌 web-view 跟微信內置瀏覽器是一套環境,也就是說你在 web-view 裡面留下的以上痕跡,到微信裡內置瀏覽器打開也有;

在兩種環境下,不太容易區分到底是什麼環境,小程序官方給的判斷方法是 window.__wxjs_environment === 'miniprogram',但是在 web-view 進入第二頁時候,安卓機下這個變量就 undefined 了。

其它的坑(常見錯誤):

打開的域名沒有在小程序管理後臺設置業務域名(注意是業務域名,不是伺服器域名);

打開的頁面 302 過去的地址也必須設置過業務域名;

頁面可以包含 iframe,但是 iframe 的地址必須為業務域名;

打開的頁面必須為 https 服務;

開發者自己檢查自己的 https 服務是否正常,測試方法:普通瀏覽器打開對應的地址; 等等,詳情請移步 web-view 問題匯總(https://developers.weixin.qq.com/blogdetail?action=get_post_info&lang=zh_CN&token=585555149&docid=ebfd9e5ec9986b4f23c41f8d8bbf2730)查閱,或在該帖子裡留言。

相關焦點

  • 微信小程序內嵌網頁能力開放意味著什麼?
    一句話總結就是,小程序的開發成本有了很大的下降。昨夜近零點時,微信很是「文章越短事兒越大」地宣布了「為便於開發者靈活配置小程序,小程序現開放內嵌網頁能力」,即 web-view 組件。一時間,朋友圈裡形成了一波刷屏。具體來看,開發者登陸小程序後臺配置業務域名,即可實現小程序內嵌網頁。
  • 微信新功能666!小程序可直接打開網頁,關聯公眾號增至500個
    昨夜,微信再次宣布小程序增添了兩項新功能:小程序內可直接打開網頁、小程序可關聯500個公眾號。 ①小程序內可直接打開網頁以後,我們在使用小程序時候,可以從小程序直接進入到內嵌網頁,同時也支持從內嵌網頁返回小程序。 在此之前,開發者需登錄小程序後臺配置業務域名。
  • 毫秒必爭,前端網頁性能最佳實踐
    現在越來越多的人開始建立自己的網站,博客,你的網頁響應速度如何呢?在這篇文章中我們來介紹一下提高網頁性能的最佳實踐,以及相應的問題解決方案,讓站長或者即將要成為站長的朋友了解如何去測試和提高網站響應速度,對自己的網站更有信心。最佳實踐最佳實踐我們引用的來自yahoo前端性能團隊總結的35條黃金定律。原文猛擊這裡。
  • iOS 14的App Clips有App功能,又有小程序的直接打開,支持掃碼NFC網頁內嵌
    2017年,微信小程序出現。步驟為1步:掃描二維碼或其它方式打開。2020年,Apple的App Clips出現。步驟為1步:掃描二維碼或其它方式打開。一、App Clips的初始界面App Clips剛打開時是一個卡片形狀的窗口,右上角是X(關閉)按鈕,中間是Open(打開)操作按鈕,右下角是App Store(應用商店)安裝APP的按鈕。
  • 微信小程序開發實踐入門教程
    在去年2017年1月9日,張小龍在2017微信公開課Pro上發布的小程序正式上線 。時至今日,小程序已經有整整一年時間了 。
  • 微信小程序 | 微信小程序簡介
    實際上,微信官方是沒有對外暴露過如此調用的,此類 API 最初是提供給騰訊內部一些業務使用,很多外部開發者發現了之後,依葫蘆畫瓢地使用了,逐漸成為微信中網頁的事實標準。2015年初,微信發布了一整套網頁開發工具包,稱之為 JS-SDK,開放了拍攝、錄音、語音識別、二維碼、地圖、支付、分享、卡券等幾十個API。
  • 從設計看網頁設計與微信小程序設計的差異性
    微信小程序是近兩年才出現的新事物,而網頁設計出現已經超過20多年。目前大多數的設計師都是脫胎於網頁設計師,並且不少設計師從事網站設計超過五年以上。這就產生了一個問題--長時間從事網頁設計,會形成一些「設計習慣」而這樣的設計習慣是不適合微信小程序設計的。本文,我們就來討論這樣一個問題---僅僅從設計的角度而言,網站設計與微信小程序設計,究竟有哪些不同?
  • 微信小程序UI自動化測試實踐:Minium!
    Appium實現微信小程序自動化測試的手段基本上還是套用針對 Hybrid App 的測試方案,通過定位H5 App資源控制項,並結合屏幕坐標的方式來操控小程序的頁面元素;網易推出的Airtest它是微信小程序官方推出自動化框架,提供了 Python3 和 JavaScript 版本(後者目前已停止維護,後文中的minium單指Python版本),目前最新的版本為1.0.0b2。
  • WordPress版微信小程序安裝使用說明
    「業務域名」主要用於web-view內嵌網頁時,用作域名白名單,如果不是業務域名裡的域名,在web-view內嵌裡訪問網頁時,就會報無法訪問的錯誤。插件的下載地址:https://github.com/iamxjb/wp-rest-api-for-app插件安裝啟用後,需要在後臺配置一些參數:1)wordpress後臺 => 設置 =>微信小程序設置在這個配置界面配置AppID,AppSecret,小程序首頁滑動文章ID,  前面兩個參數在微信小程序的後臺可以查到,這裡就不贅述
  • 我看微信小程序
    小程序對於微信,不是從0到1的新內容,它本身的能力並沒有和之前的內嵌H5有本質的飛越。此時推出小程序平臺,是因為微信對自己的生態的過去和未來都有了更清晰的洞見。不是紅利,是清流2013年8月,微信推出公眾號,打開了生態的大門。無數媒體、商家和機構的湧入,將微信從基礎的工具建設為繁榮的平臺。
  • 微信小程序的新接口 – 藍牙
    3月底,筆者欣喜的發現,微信小程序也發布了藍牙相關的更新,其中包括:•    新增 18 個藍牙相關的 API[4]•    新增 mac 版開發工具支持藍牙調試微信小程序,簡稱小程序, 是一種不需要下載安裝即可使用的應用,它實現了應用的輕量化,用戶掃一掃或搜一下即可打開應用。微信小程序對於藍牙的支持,對於開發者意味著什麼?
  • 微信小程序UI設計規範
    ,大家應該都不陌生,從2018年開始,小程序迅猛發展,小程序依託微信,憑藉「觸手可及用完即走」的用戶體驗備受青睞。第三部分:小程序菜單1、全局性的,不可自定義,位置固定官方小程序菜單位於所有界面(包括小程序內嵌的網頁和插件),且位置固定,開發者不可對其內容進行自定義只能選擇深淺兩種配色方案
  • 微信小程序支付功能全流程實踐
    前言微信小程序為電商類小程序,提供了非常完善、優秀、安全的支付功能。在小程序內可調用微信的API完成支付功能,方便、快捷。
  • 程序丨Unity3D性能優化最佳實踐(三):協程
    作者:Ian翻譯:Kelvin Lo / 海龜系列回顧:Unity3D性能優化最佳實踐(一):
  • 微信web開放標籤,讓網頁可以跳轉到小程序
    微信生態有很多玩法,比如URL Scheme跳轉到小程序、網頁跳轉到小程序、小程序和公眾號打通、小程序如何分享到朋友圈等等,它們不只是技術問題,而且還是值得研究的生態運營問題。在今後的文章中,我們會持續圍繞微信生態的雲開發來寫更多系列文章,歡迎關注。
  • 分享一些適用於Chromebook的最佳Linux程序
    即使該功能主要針對開發人員,例如那些希望在 Pixelbook 上運行 Android Studio 的開發人員,但仍有許多應用程式可以使普通用戶受益。如果你不確定要嘗試使用哪些應用程式,我們將在此做一些分享。
  • 兩天快速開發一個自己的微信小程序
    據今年 1 月阿拉丁發布的報告顯示,微信小程序 2020 年 DAU 已破 4 億,其總數超 380 萬。從數據上看,小程序網際網路已經爆發,百度、阿里、頭條等大廠都相繼推出自己的小程序平臺,小程序開發的熱度必然水漲船高。
  • [功能發布]Excel集成網頁控制項,內嵌於Excel單元格區域,可加載任意網頁
    網頁控制項內嵌單元格區域,用到的技術其實之前在Excel催化劑的其他功能上早已採用過,如插入圖片功能、關鍵詞逐字提示快速錄入功能和插入日期控制項幾大功能中都使用過。傳送門:Excel催化劑開源第9波-VSTO開發圖片插入功能,圖片帶事件本篇的網頁控制項也一樣,其不過是使用了第三方網頁控制項MiniBlink,一款體積最小的基於Google瀏覽器內核的開發組件。
  • 體驗撰文│微信小程序的新接口 – 藍牙
    3月底,筆者欣喜的發現,微信小程序也發布了藍牙相關的更新,其中包括:·新增 18 個藍牙相關的 API·新增 mac 版開發工具支持藍牙調試 微信小程序,簡稱小程序, 是一種不需要下載安裝即可使用的應用,它實現了應用的輕量化,用戶掃一掃或搜一下即可打開應用。
  • 微信小程序如何添加外部字體?
    不利於網站SEO(主流搜尋引擎不會將圖片alt內容作為判斷網頁內容相關性的有效因素)。網絡上有一些使用sIFR技術、或javascript/flash hack的方法,但實現起來或繁瑣,或有缺陷。下面要講的是如何只通過CSS的@font-face屬性來實現在網頁中嵌入任意字體。外部字體怎麼添加?