VUE:開發微信H5頁面爬坑總結

VUE:開發微信H5頁面爬坑總結

剛入門前端的時候寫過很多的微信H5頁面,時隔多年感覺應該是手到擒來,不曾想竟很是費了一些功夫。現在把本次開發過程中遇到的問題以及我是如何解決的,做個記錄。防止自己以後再去解決解決過的問題。

一、微信網頁授權

網頁授權流程分為四步,這裡只說前端需要做的,其中的第一步:跳轉授權頁面獲取code。 這裡分享下我的授權邏輯(下圖),它有兩個優點:

  1. 授權跳轉在dom渲染之前,體驗會好一些;
  2. 本地存儲了openId,前後端均不用頻繁的與微信服務器交互。
VUE:開發微信H5頁面爬坑總結

二、微信jssdk授權

如果你頁面中有用到分享、上傳圖片、微信支付等功能,那麼需要先進行js-sdk授權。我這邊封裝成了2個方法:initConfig和setShare,方便在路由/頁面切換的時候重複調用。

//main.js
import wxsdk from './config/wxsdk.js' //該模塊提供initConfig和setShare方法,具體代碼太長見github
Vue.prototype.wxsdk = wxsdk;//掛載到全局
//使用
 created() {
 this.wxsdk.initConfig(location.href.split("#")[0], () => {
 this.wxsdk.setShare(this.user.openId);
 });
 }

三、webpack-dev-server解決跨域

講真的所有跨域解決方案都必須有服務端的參與,誠然這個問題是瀏覽器拋出的,但讓前端去解決真的很冤。下面兩個配置讓你永遠告別跨域煩惱。本地開發用webpack-dev-server,測試生產環境用nginx。

//接口根路徑http://47.105.59.***:9090/zt-wx
//以vue-cli搭建的項目config舉例 config/index.js
 dev: {
 proxyTable: {
 '/zt-wx': {
 target: 'http://47.105.59.***:9090', //目標接口域名
 changeOrigin: true //是否跨域
 }
 },
 }
//實際發起請求時的url
this.http.get(`/zt-wx/api/wx/info`).then(); //http是我自己對axios的再封裝 
//nginx代理配置
server {
 location /zt-wx {
		proxy_pass http://47.105.59.***:9090;
 }
} 

四、iso初次加載白屏、跳轉白屏

問題現象: ios頁面初次加載白屏,刷新後正常,但切換到其他頁面再後退,又會白屏。

問題原因:在ios機器上使用webview開發Vue項目時候,go history(-1),無法將body的高度拉掉,使得內容被遮住了。

解決辦法:html,body都是100%,#app撐起了父元素的高度,但是瀏覽器默認的滾動scroll並不是#app,而是body,某些因素,造成返回history 後,無法復原(ios 的鍋),為此,我們將#app進行了絕對定位,並讓它重新成為 scroll 的對象,從而解決問題。

#app {
 position: absolute;
 top: 0;
 left: 0;
 width: 100%;
 height: 100%;
 overflow: scroll;
 -webkit-overflow-scrolling: touch;
}

參考資料:
https://blog.csdn.net/guxuehua/article/details/79026655

五、ios路由/跳轉頁面後分享失效

問題現象:ios微信路由到另一個頁面選擇圖片OK,但分享失效,刷新這個頁面分享就正常了。

解決方式:在IOS分享出錯,但是刷新一下即可分享成功的主要原因是:vue-router切換的時候操作的都是瀏覽器的歷史記錄,iOS會把第一次剛進入時的URL作為真實URL。安卓會把當前URL作為真實URL。

根據IOS和安卓的區別我們可以用設備檢測來區分用他們

if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)){

// 處理iOS

} else (/(Android)/i.test(navigator.userAgent)) {

// 處理安卓

}

在IOS下我們可以把第一次進入的url保存起來,然後在使用微信SDK獲取簽名的時候使用

而安卓分享只需要每次調用encodeURIComponent(location.href.split('#')[0])即可;

六、上傳圖片報錯:處理異常

這個報錯甚是詭異,因為前端和後端代碼均沒有“處理異常”這4個字。本來想甩鍋給微信不管了的,但隨後在做限制上傳圖片大小功能的時候陰差陽錯的給解決了。

問題原因:後端tomcat服務默認設置表單提交數據大小上限為2M,大於2M就會報錯。

解決辦法:後端大神把server.xml中maxPostSize的值改為-1後解決。

參考資料:
https://blog.csdn.net/w18756901575/article/details/79374621

七、正確導出圖片格式

這個項目首頁基本是由圖片堆砌成的,一開始切出來的圖(默認.png)壓縮後在400k-1.3M之間。一開始還以為PSD素材有問題。直到項目最後才閃回,想起圖片格式的知識點,改導出成.jpg格式後壓縮出來的圖片基本控制在100K以內了。具體的.png.jpg這些圖片格式的知識有興趣的自己查。

八、vuex使用之同步用戶信息

講道理小項目是不應該用vuex的,但是用著確實爽,即簡單又省心省力。由於我總是忘記它的方法名,所以在這裡貼下代碼,方便以後隨時cv。

//config/store.js
const store = new Vuex.Store({
 state: {
 user: {}
 },
 mutations:{
 updateUser(state, data){
 state.user = data;
 }
 }
})
//在組件中使用
computed: {
 user() {
 return this.$store.state.user;
 }
}
//在需要的時候更新數據
this.$store.commit("updateUser", user);

九、使用html2canvas生成的海報不顯示圖片

問題原因:引入的圖片資源路徑跨域造成的。

解決辦法:我先是按照官方給的那個php的方案弄的,未能解決。最後舔著臉讓後端大佬把圖片資源目錄挪到我web服務目錄下給解決的。

//安裝
npm install --save html2canvas
//引入
import html2canvas from "html2canvas";
//使用
const myPosterWrap = document.getElementById("posterWrap");
html2canvas(myPosterWrap).then(canvas => {
 this.posterSrc = canvas.toDataURL("image/png");
 this.uploadPosterImg(this.posterSrc);
});

十、css黑科技之放置指定比例的圖片

就是把不定寬圖片按指定比例顯示,直接上碼(1:1.25)。

//html

十一、ios頁面加載不全不能滾動

問題描述 :ios從首頁進入,跳轉其他頁面再後退到首頁,首頁只顯示一屏內容且無法滾動。

問題原因:首頁子元素的高度是動態設置的。在於ios瀏覽器內核的別緻渲染邏輯:它會預先找到相應的overflow: scroll元素,如果子元素高度高於父元素,則建立原生的scrollView實現滾動。問題就出現在這個“預先”上,它預先獲取的高度並不是子元素渲染後的真實高度。

解決辦法:給設置了滾動的#app元素下的子元素p-index設置min-height: calc(100% + 1px);

#app {
 position: absolute;
 top: 0;
 left: 0;
 width: 100%;
 height: 100%;
 overflow: scroll;
 -webkit-overflow-scrolling: touch;
}
.p-index{
 min-height: calc(100% + 1px);
}
複製代碼

其實能解決全靠這篇博文,這裡就不贅述了。
https://blog.csdn.net/nongweiyilady/article/details/83039868

神奇的是,我能看到這篇文章全來賴於地鐵上無聊打開了很久沒打開的CSDNapp,切到前端分類,“不滾動”三個字立馬映入眼簾,點進去的第一眼 ,就感覺是對的人了。迷茫的時候就看書,古人誠不我欺!

一些忠告

能小程序就別網頁開發;

不意淫不揣摩待定的需求;

堅持看圖作業的優良傳統;

迷茫的時候就看書,焦慮的時候去學習;


分享到:


相關文章: