美文网首页让前端飞
由移动端浏览器上QQ定制化分享,引发的性能优化

由移动端浏览器上QQ定制化分享,引发的性能优化

作者: 尤小小 | 来源:发表于2018-12-07 16:21 被阅读8次

在移动端浏览器上分享微找找寻人给QQ好友

产品提了个新需求,要求在移动端浏览器上打开微找找寻人页面后,可以分享给QQ好友。这个需求提的合情合理,没毛病。那就开工吧。

腾讯移动WEB开发平台 上了解到可以使用他们的api来定制化分享,但是存在系统和设备型号的限制。另外还可以使用 meta 同样可以达到该接口的作用,这个方法甚好。

官网的demo:

 <meta itemprop="name" content="这是分享的标题"/>
 <meta itemprop="image" content="http://imgcache.qq.com/qqshow/ac/v4/global/logo.png" />
 <meta name="description" itemprop="description" content="这是要分享的内容" />

结合实际情况搞起来

在我们微找找寻人的项目里,目前配置了微信朋友、朋友圈分享,我们针对专题页、详情页这种特殊页面可以自定义分享,其它页面可以走默认分享。这次要增加的QQ分享,我考虑统一放到这个分享插件里处理,可以通过区分环境来决定是否要执行QQ分享的代码。

当前的项目是个单页面应用,定制化的分享最好通过动态插入的形式会好些。

实现:

    let doc = document;
    let head = doc.head || (doc.getElementsByTagName("head")[0] || doc.documentElement);
    function setShareMata(itemprop, content, name) {
        
        
        let node = doc.createElement("meta");
        node.setAttribute("itemprop", itemprop);
        node.content = content;
        node.name = name;
    
        head.appendChild(node);
    }    

    // 设置qq分享mate标签
    setShareMata('name', self.share.title, 'title');
    setShareMata('description', self.share.desc.substr(0, 50), 'description');
    setShareMata('image', self.share.imgUrl, 'img');                  

self 是经过处理的分享对象

给DOM提提速

从浏览器的性能优化上分析,浏览器渲染引擎和JS引擎是分开执行的,并且JS 的运行速度比DOM快的多这个特征,我们尽量减少对DOM的操作,让JS去给DOM分压。

DocumentFragment 接口表示一个没有父级文件的最小文档对象。它被当做一个轻量版的 Document 使用,用于存储已排好版的或尚未打理好格式的XML片段。最大的却别是因为 DocumentFragment 不是真实DOM树的一部分,它的变化不会引起DOM树的重新渲染的操作,且不会导致性能等问题。

上面我们直接用appendChild去往 head 标签去拼接目标内容,这样做当然可以,但却不够优雅。相比之下,DOM Fragment可以在维护性能的同时用更加结构化的方法去达成。
现在我们使用DOM Fragment 来改写上面的例子:

    let doc = document;
    let head = doc.head || (doc.getElementsByTagName("head")[0] || doc.documentElement);
    // 创建一个DOM Fragment对象作为容器
    let createContent = doc.createDocumentFragment();

    // 设置qq分享mate标签
    setShareMata('name', self.share.title, 'title');
    setShareMata('description', self.share.desc.substr(0, 50), 'description');
    setShareMata('image', self.share.imgUrl, 'img');

    function setShareMata(itemprop, content, name) {
        // meta此时可以通过DOM API去创建
        let node = doc.createElement("meta");

        node.setAttribute("itemprop", itemprop);
        node.content = content;
        node.name = name;
        // 像操作真实DOM一样操作DOM Fragment对象
        createContent.appendChild(node)
    }                        

    // 内容处理好了,最后再触发真实DOM的更改
    head.appendChild(createContent)

这两种写法都可以运行出同样的结果。可以看出如果是大批量的去从操作真实的DOM,使用DOM Fragment对象的性能会更好。这种结构化的特征,在优秀框架中jQuery、Vue的源码中也在使用。

到此QQ分享的功能就大功告成了,QQ定制化分享和DOM Fragment的操作get到了没有?

相关文章

  • 由移动端浏览器上QQ定制化分享,引发的性能优化

    在移动端浏览器上分享微找找寻人给QQ好友 产品提了个新需求,要求在移动端浏览器上打开微找找寻人页面后,可以分享给Q...

  • 浅谈前端性能优化(移动端)

    上一篇讲了PC端的部分:前端性能优化(PC端),这次继续说移动端的。相对于PC端的,移动web浏览器上有一些明显的...

  • H5性能优化

    移动端HTML5页面前端性能优化。如何优化HTML5在移动设置上的性能表现,首先需要明确以下几个原则:1、PC优化...

  • 浏览器判断

    移动端 PC端 ios 微信浏览器 QQ浏览器

  • 2017GMTC 移动Web优化

    移动Web优化专场主要讲在移动设备上如何优化H5,使得Web运行的性能能够尽可能的接近Natvie。 QQ移动页面...

  • 动态DNS

    今天看了一篇携程移动端性能优化的文章(https://mp.weixin.qq.com/s?__biz=MzA4M...

  • 移动开发第三方工具记录

    http://www.tingyun.com/听云可以实现您的应用性能全方位可视化,从PC端、浏览器端、移动客户端...

  • 滑动时候警告:Unable to preventDefault

    移动端Web界面滚动性能优化 Passive event listeners 最近更新了ios11.3,项目上发现...

  • 性能优化

    性能优化 代码层面: 缓存利用 请求数量 请求带宽 总的来说 移动端性能优化 具体优化 加号操作符 事件委托 避免...

  • web项目性能优化(整理)

    Web性能优化分为服务器端和浏览器端两个方面。 一、浏览器端,关于浏览器端优化,分很多个方面1、压缩源码和图片Ja...

网友评论

    本文标题:由移动端浏览器上QQ定制化分享,引发的性能优化

    本文链接:https://www.haomeiwen.com/subject/yzdkwftx.html