健康養生項目記錄 (flex 兼容寫法在打包後丟失、安卓4.4顯示錯誤、低版本機不兼容 promise、打包關閉console、keep-alive=>exclude、protocol)

這次項目須要兼容 andriod 4.4 ,ios 8 . 故此帶來了很多兼容問題css

1. vue 項目在本地表現正常,打包後出現部分樣式丟失。html

若是隻是小範圍的影響,能夠用如下注釋跳過 webpack 對 css 的壓縮計算 vue

/*! autoprefixer: off */
    -webkit-box-orient: vertical; /* autoprefixer: on */

大範圍的樣式更改,能夠直接修改  / build / webpack.prod.conf.js  文件(相關文章webpack

// new OptimizeCSSPlugin({
    // cssProcessorOptions: config.build.productionSourceMap
    // ? { safe: true, map: { inline: false } }
    // : { safe: true }
    // }),

爲了自動補全css前綴,配置 autoprefixer ,在package.json裏面找到 browserslist ,加上ios

"browserslist": [ "> 1%", "last 2 versions", "not ie <= 8", "iOS >= 8", "Android >= 4.4", "Firefox >= 20" ]

 "iOS >= 8","Firefox >= 20","Android > 4.4"es6

 2. vant    vant-swipe (有贊) vh 兼容性web

有讚的輪播插件在低版本安卓機中,樣式錯亂疊堆npm

緣由多是輪播組件的高度追溯父容器的 height ,而父容器不能固定一個高度,以 height : 100vh ; 替代,可是低版本安卓不兼容,高度錯亂,只要在 vue 的 mounted 鉤子中從新定義 父容器高度便可json

// html
  <van-swipe :style="`height:${viewHeight}px`" :loop="false" :touchable='false' :show-indicators='false'>

// js
mounted(){
this.$nextTick(function(){ let h = $(window).height() this.viewHeight = h }) }

 3. 在 protocol 協議中因爲要在 href 中用到回調,須要提早定義好方法,如:promise

window.location.href = 'protocol://getuserinfo#userinfocallback';

function userinfocallback () {
  // ...
}

可是 webpack 打包後會對方法名進行混淆,在執行回調時找不到 function 而報錯。知道了緣由就很容易解決了,只要把方法定義爲 window 屬性便可

window.userinfocallback = (result) => { // ...
}

4. 安卓低版本的機子 有可能存在 promise 的兼容問題,webpack 加載 promise 有好幾種方式,有些狀況下都不行,最暴力的方法就是直接加載一個 promise 的庫

// cmd
(c)npm install es6-promise --save-dev // main.js
import promise from 'es6-promise' promise.polyfill()

 5. 上線打包時關閉 console

在 / build / webpack.prod.conf.js(生產環境配置文件)中插入如下:

new UglifyJsPlugin({ uglifyOptions: { compress: { warnings: false, drop_console: true,                // [+] console
          pure_funcs: ['console.log']        // [+] 移除console
 } }, sourceMap: config.build.productionSourceMap, parallel: true }), 

 6. a標籤跳轉地址,只改變了路由參數,因爲 keep-alive ,頁面沒有及時刷新

<keep-alive include="a">
  <component>
    <!-- name 爲 a 的組件將被緩存! -->
    <!-- 能夠保留它的狀態或避免從新渲染 -->
  </component>
</keep-alive>


<keep-alive exclude="a">
  <component>
    <!-- 除了 name 爲 a 的組件都將被緩存! -->
  </component>
</keep-alive>

頁面上 js 部分 

watch: { '$route' (to, from) { // 頁面只是路由參數發生變化時,頁面並不刷新,因此須要監聽路由變化
      let id = this.$route.params.id if(id){ this.content = ''
        this.getContent(id) } } },

且在 webview 中, a 標籤打開新窗口會被禁用,相似   <a href="www.baidu.com" target="_blank"></a>,需去掉 target="_blank"

7. 項目中經過 protocol 從app獲取用戶信息 

setTimeout(function () { window.location.href = 'protocol://getuserinfo#userinfocallback'; }, 0);

把這段代碼放在  $(function) 中,可是同一個函數塊裏的其餘方法失效

$(function () { // 設置 rem 單位
 setRem(document, window) // protocol 獲取 token
  setTimeout(function () { window.location.href = 'protocol://getuserinfo#userinfocallback'; }, 0); // 設置分享數據
 wnlShare.setShareData({ url: location.href, // eslint-disable-line
    title: '健康一點——你的健康我關心', text: '根據你的身體健康,推薦調養改善建議', image: 'https://healthcdn.51wnl-cq.com/67a3b033-296d-dfe7-1809-721579e4f58b.jpg' }) })

   wnlShare.setShareData  就不能在正確的階段執行,app中沒法調用分享組件,排查後發現  protocol  需分開運行

window.onload = function () { // protocol 獲取 token
  setTimeout(function () { window.location.href = 'protocol://getuserinfo#userinfocallback'; }, 0); } $(function(){ // 設置 rem 單位
 setRem(document, window) // 設置分享數據
 wnlShare.setShareData({ url: location.href, // eslint-disable-line
    title: '健康一點——你的健康我關心', text: '根據你的身體健康,推薦調養改善建議', image: 'https://healthcdn.51wnl-cq.com/67a3b033-296d-dfe7-1809-721579e4f58b.jpg' }) })

 8. 打包後出現 webpackJsonp is not defined 

緣由是 manifest.js 沒有加載完成,window沒有定義webpackJsonp ,優先調用了 vendor.js 和 app.js 中的 webpackJsonp,網上不少說法是在 HtmlWebpackPlugin 插件中添加

chunks: ['manifest', 'vendor', 'app'],

可是效果不明顯,從問題根源出發,直接在 vendor.js 和 app.js 中添加語句

if (!window.webpackJsonp) location.reload()

若 webpackJsonp 未定義,強制刷新,因爲此過程短暫,刷新的行爲在用戶界面無感

相關文章
相關標籤/搜索