WY音乐播放器制作(4)

本章主要填坑

IOS中无法进行歌曲预加载

Player组件

  • IOS中系统不会自动加载歌曲,所以oncanplay永远不会执行

  • 解决方案:如何监听IOS中歌曲已经准备好了,通过ondurationchange事件来监听

  • ondurationchange 当歌曲加载完成后执行

手机预览项目没有控制台展示

main.js

  • 解决方案:为了能在手机中调试项目,添加 vconsole 插件
import VConsole from 'vconsole'

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

路径的简写

vue.config.js

module.exports = {
  /* 部署应用包的基本URL, 避免出现打包后项目找不到资源问题 */
  publicPath: './',
  configureWebpack: {
    //配置别名,默认src为@,修改后需要重新编译才能生效
    resolve: {
      alias: {
        'api': '@/api',
        'assets': '@/assets',
        'components': '@/components',
        'router': '@/router',
        'store': '@/store',
        'views': '@/views',
        'tools': '@/tools',
        'plugin': '@/plugin'
      }
    }
  }
}

保持页面状态,避免每次进入页面都需要加载一次,优化性能

App.vue

  • 问题:每次进入页面,都需要请求数据,用户体验不好,而且切换页面之后,之前页面不能保持状态

  • 解决方案:使用 keep-alive 组件,保持某些页面状态

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

处理空白页面,优化用户体验

main.js

  • 问题:由于数据没有请求过来,出现页面空白现象,用户体验差

  • 解决方案:添加一个加载的插件,每次请求数据,在数据没有回来之前,展示加载插件

// 导入自定义的插件
import Loading from 'plugin/loading/index'

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

api/network.js

  • 在请求数据中添加响应和拦截器,然后使用加载的插件
let count = 0
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
 // 在发送请求之前做些什么
 count++
 Vue.showLoading()
 return config
}, function (error) {
 // 对请求错误做些什么
 Vue.hiddenLoading()
 return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
 // 对响应数据做点什么
 count--
 if (count === 0) {
   Vue.hiddenLoading()
 }
 return response
}, function (error) {
 // 对响应错误做点什么
 Vue.hiddenLoading()
 return Promise.reject(error)
})

打包上传到服务器,发现有些点击事件失效

ScrollView

  • 问题:发现在ScrollView组件包裹的内容中,点击事件都失效了(在IScroll包裹中失效)

  • 解决方案:移动端添加 click: true,tap: true,mouseWheel: true 使点击事件生效

      mounted() {
        // 这里能拿到页面元素
        this.iscroll = new IScroll(this.$refs.wrapper, {
          click: true,
          tap: true,
          mouseWheel: true,
          scrollbars: false, // 隐藏滚动条
          probeType: 3, // 监听滚动偏移位
          // 解决拖拽卡顿问题(禁用其他事件)
          scrollX: false,
          scrollY: true,
          disablePointer: true,
          disableTouch: false,
          disableMouse: true
        });
      }
    

打包后上传到服务器刷新报错

解决方案:

  • 不在使用history路由模式,使用hash模式,但是,使用hash模式不利于SEO
  • 依旧使用history路由模式,但是需要后端人员处理

SPA页面优缺点

SPA优点

  • 有良好的交互体验,不会重新加载整个网页, 只是局部更新

  • 前端负责页面呈现和交互, 后端负责数据

  • 减轻服务器压力,只用处理数据不用处理界面

  • 共用一套后端程序代码

SPA缺点

  • SEO难度较高,只有一个界面, 无法针对不同的内容编写不同的SEO信息

  • 初次加载耗时多,为实现单页Web应用功能及显示效果,需要在加载页面的时候将所有JavaScript、CSS统一加载,在Vue中可以使用按需加载解决

SPA页面预渲染

  • 为了解决首次请求时间过长,SEO难的问题

  • 安装插件:vue-cli-plugin-prerender-spaprerender-spa-plugin

    vue.config.js

    module.exports = {
      pluginOptions: {
        prerenderSpa: {
          registry: undefined,
            /* 这里填入需要分离的路由 */
          renderRoutes: [
            '/',
            '/recommend',
            '/singer',
            '/rank',
            '/search',
            '/account',
            '/detail'
          ],
          useRenderEvent: true,
          headless: true,
          onlyProduction: true
        }
      }
    }
    
  • 打包之后发现dist文件夹中有 7 个 html文件

SPA页面SEO优化

  • 问题:我们已经用预渲染将组件分离成不同的html文件了,那么如何添加SEO信息呢?

  • 解决方案:安装vue-meta-info插件,给每个打包的html文件的头部添加SEO信息

    main.js

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

    vue-meta-info.js

    export default {
      recommend: {
        title: '我是recommend',
        meta: [
          {
            name: 'keyWords',
            content: '关键字1,关键字1,关键字1'
          },
          {
            name: 'description',
            content: '这是一段网页的描述1'
          }
        ]
      },
        //...
    }
    
  • 给每个路由组件添加信息

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

解决预渲染打包后标签重复问题

vue.config.js

  • 问题:预渲染打包后出现两个<meta name="viewport".*user-scalable=no">标签

    由于node是模拟浏览器运行环境,计算的尺寸出现问题,打包后的重复标签的值不正确,刷新后,重复的标签发生作用,导致页面样式排版达不到预期

  • 解决方案:查找到重复的标签,并替换掉

postProcess: route => {
   // 预渲染内容写入之前的额外操作
   let reg = /<meta name="viewport".*user-scalable=no">/gi
   let res = route.html.match(reg)
   route.html = route.html.replace(res[1], '')
}

打包上架后加载插件出现重复

vue.config.js

  • 问题:和标签重复是一个问题

  • 解决方案:这里使用jsdom插件来处理

  • 安装jsdom

    const jsdom = require('jsdom')
    const { JSDOM } = jsdom
    
    postProcess: route => {
      // 预渲染内容写入之前的额外操作
      // 1.根据字符串创建一个网页
      let html = new JSDOM(route.html)
      // 2.从创建好的网页中拿到document对象
      let dom = html.window.document
      // 3.找到对应的元素, 删除对应的元素
      let loadingEle = dom.querySelector('.container')
      dom.body.removeChild(loadingEle)
    
      route.html = html.serialize()
      return route
      }
    }
    
END
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容

  • 完整代码地址https://github.com/Kevin5979/WYmusic.git[https://gi...
    kevin5979阅读 482评论 0 1
  • 完整代码地址https://github.com/Kevin5979/WYmusic.git[https://gi...
    kevin5979阅读 529评论 0 1
  • 一、概念介绍 Vue.js和React.js分别是目前国内和国外最火的前端框架,框架跟类库/插件不同,框架是一套完...
    刘远舟阅读 1,066评论 0 0
  • Nuxt爬坑 第一节:nuxt.js相关概述 nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作S...
    阿_军阅读 1,018评论 0 0
  • 本项目是本人2019年学习vue的练手项目,此文记录项目练习过程中的的一些细节和难点。(文章最后更新时间:2019...
    前端辉羽阅读 621评论 0 11