WY音樂播放器制作(4)

本章主要填坑

IOS中無法進(jìn)行歌曲預(yù)加載

Player組件

  • IOS中系統(tǒng)不會(huì)自動(dòng)加載歌曲,所以oncanplay永遠(yuǎn)不會(huì)執(zhí)行

  • 解決方案:如何監(jiān)聽IOS中歌曲已經(jīng)準(zhǔn)備好了,通過ondurationchange事件來監(jiān)聽

  • ondurationchange 當(dāng)歌曲加載完成后執(zhí)行

手機(jī)預(yù)覽項(xiàng)目沒有控制臺(tái)展示

main.js

  • 解決方案:為了能在手機(jī)中調(diào)試項(xiàng)目,添加 vconsole 插件
import VConsole from 'vconsole'

const vconsole = new VConsole()
Vue.use(vconsole)

路徑的簡寫

vue.config.js

module.exports = {
  /* 部署應(yīng)用包的基本URL, 避免出現(xiàn)打包后項(xiàng)目找不到資源問題 */
  publicPath: './',
  configureWebpack: {
    //配置別名,默認(rèn)src為@,修改后需要重新編譯才能生效
    resolve: {
      alias: {
        'api': '@/api',
        'assets': '@/assets',
        'components': '@/components',
        'router': '@/router',
        'store': '@/store',
        'views': '@/views',
        'tools': '@/tools',
        'plugin': '@/plugin'
      }
    }
  }
}

保持頁面狀態(tài)驯镊,避免每次進(jìn)入頁面都需要加載一次暗膜,優(yōu)化性能

App.vue

  • 問題:每次進(jìn)入頁面渴丸,都需要請(qǐng)求數(shù)據(jù),用戶體驗(yàn)不好绽昏,而且切換頁面之后疮装,之前頁面不能保持狀態(tài)

  • 解決方案:使用 keep-alive 組件阅虫,保持某些頁面狀態(tài)

<keep-alive include="Singer,Search">
   <router-view></router-view>
</keep-alive>

處理空白頁面,優(yōu)化用戶體驗(yàn)

main.js

  • 問題:由于數(shù)據(jù)沒有請(qǐng)求過來,出現(xiàn)頁面空白現(xiàn)象柒巫,用戶體驗(yàn)差

  • 解決方案:添加一個(gè)加載的插件励堡,每次請(qǐng)求數(shù)據(jù),在數(shù)據(jù)沒有回來之前堡掏,展示加載插件

// 導(dǎo)入自定義的插件
import Loading from 'plugin/loading/index'

// 使用
Vue.use(Loading, {
 title: '正在加載...'
})

api/network.js

  • 在請(qǐng)求數(shù)據(jù)中添加響應(yīng)和攔截器应结,然后使用加載的插件
let count = 0
// 添加請(qǐng)求攔截器
axios.interceptors.request.use(function (config) {
 // 在發(fā)送請(qǐng)求之前做些什么
 count++
 Vue.showLoading()
 return config
}, function (error) {
 // 對(duì)請(qǐng)求錯(cuò)誤做些什么
 Vue.hiddenLoading()
 return Promise.reject(error)
})

// 添加響應(yīng)攔截器
axios.interceptors.response.use(function (response) {
 // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么
 count--
 if (count === 0) {
   Vue.hiddenLoading()
 }
 return response
}, function (error) {
 // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么
 Vue.hiddenLoading()
 return Promise.reject(error)
})

打包上傳到服務(wù)器,發(fā)現(xiàn)有些點(diǎn)擊事件失效

ScrollView

  • 問題:發(fā)現(xiàn)在ScrollView組件包裹的內(nèi)容中泉唁,點(diǎn)擊事件都失效了(在IScroll包裹中失效)

  • 解決方案:移動(dòng)端添加 click: true,tap: true,mouseWheel: true 使點(diǎn)擊事件生效

      mounted() {
        // 這里能拿到頁面元素
        this.iscroll = new IScroll(this.$refs.wrapper, {
          click: true,
          tap: true,
          mouseWheel: true,
          scrollbars: false, // 隱藏滾動(dòng)條
          probeType: 3, // 監(jiān)聽滾動(dòng)偏移位
          // 解決拖拽卡頓問題(禁用其他事件)
          scrollX: false,
          scrollY: true,
          disablePointer: true,
          disableTouch: false,
          disableMouse: true
        });
      }
    

打包后上傳到服務(wù)器刷新報(bào)錯(cuò)

解決方案:

  • 不在使用history路由模式鹅龄,使用hash模式,但是亭畜,使用hash模式不利于SEO
  • 依舊使用history路由模式扮休,但是需要后端人員處理

SPA頁面優(yōu)缺點(diǎn)

SPA優(yōu)點(diǎn)

  • 有良好的交互體驗(yàn),不會(huì)重新加載整個(gè)網(wǎng)頁, 只是局部更新

  • 前端負(fù)責(zé)頁面呈現(xiàn)和交互, 后端負(fù)責(zé)數(shù)據(jù)

  • 減輕服務(wù)器壓力贱案,只用處理數(shù)據(jù)不用處理界面

  • 共用一套后端程序代碼

SPA缺點(diǎn)

  • SEO難度較高肛炮,只有一個(gè)界面, 無法針對(duì)不同的內(nèi)容編寫不同的SEO信息

  • 初次加載耗時(shí)多,為實(shí)現(xiàn)單頁Web應(yīng)用功能及顯示效果宝踪,需要在加載頁面的時(shí)候?qū)⑺蠮avaScript侨糟、CSS統(tǒng)一加載,在Vue中可以使用按需加載解決

SPA頁面預(yù)渲染

  • 為了解決首次請(qǐng)求時(shí)間過長瘩燥,SEO難的問題

  • 安裝插件:vue-cli-plugin-prerender-spa秕重、prerender-spa-plugin

    vue.config.js

    module.exports = {
      pluginOptions: {
        prerenderSpa: {
          registry: undefined,
            /* 這里填入需要分離的路由 */
          renderRoutes: [
            '/',
            '/recommend',
            '/singer',
            '/rank',
            '/search',
            '/account',
            '/detail'
          ],
          useRenderEvent: true,
          headless: true,
          onlyProduction: true
        }
      }
    }
    
  • 打包之后發(fā)現(xiàn)dist文件夾中有 7 個(gè) html文件

SPA頁面SEO優(yōu)化

  • 問題:我們已經(jīng)用預(yù)渲染將組件分離成不同的html文件了,那么如何添加SEO信息呢?

  • 解決方案:安裝vue-meta-info插件厉膀,給每個(gè)打包的html文件的頭部添加SEO信息

    main.js

    import MetaInfo from 'vue-meta-info'
    
    Vue.use(MetaInfo)
    
  • 新建文件來存儲(chǔ)管理SEO信息

    vue-meta-info.js

    export default {
      recommend: {
        title: '我是recommend',
        meta: [
          {
            name: 'keyWords',
            content: '關(guān)鍵字1,關(guān)鍵字1,關(guān)鍵字1'
          },
          {
            name: 'description',
            content: '這是一段網(wǎng)頁的描述1'
          }
        ]
      },
        //...
    }
    
  • 給每個(gè)路由組件添加信息

    import MetaInfo from "../../../vue-meta-info";
    export default {
      name: "xxx",
      MetaInfo: MetaInfo.recommend,
        // ...
    }
    
  • 刪除到public/index.html中頭部的SEO

解決預(yù)渲染打包后標(biāo)簽重復(fù)問題

vue.config.js

  • 問題:預(yù)渲染打包后出現(xiàn)兩個(gè)<meta name="viewport".*user-scalable=no">標(biāo)簽

    由于node是模擬瀏覽器運(yùn)行環(huán)境溶耘,計(jì)算的尺寸出現(xiàn)問題,打包后的重復(fù)標(biāo)簽的值不正確服鹅,刷新后凳兵,重復(fù)的標(biāo)簽發(fā)生作用,導(dǎo)致頁面樣式排版達(dá)不到預(yù)期

  • 解決方案:查找到重復(fù)的標(biāo)簽企软,并替換掉

postProcess: route => {
   // 預(yù)渲染內(nèi)容寫入之前的額外操作
   let reg = /<meta name="viewport".*user-scalable=no">/gi
   let res = route.html.match(reg)
   route.html = route.html.replace(res[1], '')
}

打包上架后加載插件出現(xiàn)重復(fù)

vue.config.js

  • 問題:和標(biāo)簽重復(fù)是一個(gè)問題

  • 解決方案:這里使用jsdom插件來處理

  • 安裝jsdom

    const jsdom = require('jsdom')
    const { JSDOM } = jsdom
    
    postProcess: route => {
      // 預(yù)渲染內(nèi)容寫入之前的額外操作
      // 1.根據(jù)字符串創(chuàng)建一個(gè)網(wǎng)頁
      let html = new JSDOM(route.html)
      // 2.從創(chuàng)建好的網(wǎng)頁中拿到document對(duì)象
      let dom = html.window.document
      // 3.找到對(duì)應(yīng)的元素, 刪除對(duì)應(yīng)的元素
      let loadingEle = dom.querySelector('.container')
      dom.body.removeChild(loadingEle)
    
      route.html = html.serialize()
      return route
      }
    }
    
END
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庐扫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仗哨,更是在濱河造成了極大的恐慌形庭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厌漂,死亡現(xiàn)場離奇詭異萨醒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)苇倡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門富纸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囤踩,“玉大人,你說我怎么就攤上這事晓褪「咧埃” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵辞州,是天一觀的道長。 經(jīng)常有香客問我寥粹,道長变过,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任涝涤,我火速辦了婚禮媚狰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阔拳。我一直安慰自己崭孤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布糊肠。 她就那樣靜靜地躺著辨宠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪货裹。 梳的紋絲不亂的頭發(fā)上嗤形,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音弧圆,去河邊找鬼赋兵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛搔预,可吹牛的內(nèi)容都是我干的霹期。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拯田,長吁一口氣:“原來是場噩夢啊……” “哼历造!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勿锅,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤帕膜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后溢十,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垮刹,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年张弛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荒典。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酪劫。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖寺董,靈堂內(nèi)的尸體忽然破棺而出覆糟,到底是詐尸還是另有隱情,我是刑警寧澤遮咖,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布滩字,位于F島的核電站,受9級(jí)特大地震影響御吞,放射性物質(zhì)發(fā)生泄漏麦箍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一陶珠、第九天 我趴在偏房一處隱蔽的房頂上張望挟裂。 院中可真熱鬧,春花似錦揍诽、人聲如沸诀蓉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渠啤。三九已至,卻和暖如春饵筑,著一層夾襖步出監(jiān)牢的瞬間埃篓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工根资, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留架专,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓玄帕,卻偏偏與公主長得像部脚,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子裤纹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • 完整代碼地址https://github.com/Kevin5979/WYmusic.git[https://gi...
    kevin5979閱讀 478評(píng)論 0 1
  • 完整代碼地址https://github.com/Kevin5979/WYmusic.git[https://gi...
    kevin5979閱讀 521評(píng)論 0 1
  • 一委刘、概念介紹 Vue.js和React.js分別是目前國內(nèi)和國外最火的前端框架,框架跟類庫/插件不同鹰椒,框架是一套完...
    劉遠(yuǎn)舟閱讀 1,061評(píng)論 0 0
  • Nuxt爬坑 第一節(jié):nuxt.js相關(guān)概述 nuxt.js簡單的說是Vue.js的通用框架锡移,最常用的就是用來作S...
    阿_軍閱讀 1,010評(píng)論 0 0
  • 本項(xiàng)目是本人2019年學(xué)習(xí)vue的練手項(xiàng)目,此文記錄項(xiàng)目練習(xí)過程中的的一些細(xì)節(jié)和難點(diǎn)漆际。(文章最后更新時(shí)間:2019...
    前端輝羽閱讀 619評(píng)論 0 11