前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于 TVUE 框架在中型移动端项目的直出同构实践

基于 TVUE 框架在中型移动端项目的直出同构实践

原创
作者头像
王鹤
修改于 2017-08-31 01:36:49
修改于 2017-08-31 01:36:49
3.6K10
代码可运行
举报
文章被收录于专栏:王鹤的专栏王鹤的专栏
运行总次数:0
代码可运行

作者简介:王鹤,高级前端工程师,隶属于腾讯SNG增值产品部。主要负责QQ个性化业务的功能开发及技术优化。目前专注于框架的研究,致力于提升效能,解放生产力。

一、前言

TVUE框架是WONDER和harryxiang、mitnickliu、justynchen、yucongchen、roamye等小伙伴在vuejs框架基础上结合业务本身做的一系列优化,封装,改进的框架实践,同时也学习借鉴了部分QQ动漫项目组的一些优秀的思想。包含脚手架,基于QUI的VUE组件,最新的JS语法特性,PWA,内置SONIC加速方案,配套可扩展的编译系统等。因为主要语言是用typescript编写,所以故命名为「TVUE」框架,本文只阐述和直出同构相关部分的内容,其它框架内的内容另行介绍。

在WONDER的[《vuejs+ts+webpack2项目实战》][1]中,我们SNG增值产品部个性化商城业务已经用上了基于typescript、vuejs、webpack2(现在应该是webpack3)、gulp的一整套开发流程。在之前的实践中,我们是基于纯前端的VUE使用,即CDN服务器返回纯框架,异步JS渲染整个页面。不过这里缺乏页面直出&同构的实践场景。中型移动端项目的最佳实践,还是基于首屏页面直出,其它屏以组件形式异步加载的方式为佳,再结合比较成熟的SONIC加速方案提升页面的打开速度,提升用户体验,而且对SEO支持友好。

二、技术选型

大方向的技术选型WONDER在[《vuejs+ts+webpack2项目实战》][2]中已经阐述得非常清楚了。具体细节选型,结合我们自身业务,有选择的使用VUE提供的全家桶。

1、是否使用vue-router。根据我们自身业务的场景,比较适合用多页面应用,路由采用后端路由,我们的后端server是TSW,后端框架是koa。使用koa在middleware中编写router功能即可。所以我们的业务不太依赖vue-router,而且vue-router部分也可以通过缓存和异步组件自行实现。

2、是否使用vuex。对于我们的业务属于中型项目,且我们的业务属于多页面应用,间接地把业务进行了二次细分。那么VUEX反而繁琐和不灵活,VUEX对于多页的支持也需要改造。所以在我们的业务中,组件的传递都是通过props和global event bus来实现,足矣满足我们的日常需求。

3、是否需要后端webpack打包。前端webpack打包肯定是必要的,一是文件模块依赖的处理,二是各种loader语法的转换。后端是否要webpack打包这个WONDER认为可选。不打包在后端来说也是没有问题的。打包也可以,就是发布文件少,扔到服务器即可用。可能也会做一些loader处理。我们的业务暂时没有需要后端打包。

三、VUE同构

1、环境一致性

前后端同构语言一致这是基本。另外涉及到同构,就有两个问题绕不开,一是采用ES6 modules 还是commonjs。二是环境不同,环境变量不同,请求访问的方式不同。

1)第一个问题,首先很遗憾Node直到最新版本也没有支持ES6 modules 的import语法。所以后端代码使用此语法,还需要babel等进行转换成commonjs的模式。在我们的业务中用的是typescript的转换能力。后端最终是commonjs,而前端要使用tree-shaking。那么前后端最终两者的编译方式是不同的。

所以在我们业务中的解决方案是前端在开发环境中和后端一样,使用commonjs的语法进行打包。然而在生产环境中,前端使用es6 modules进行打包,利用webpack的tree-shaking能力进行代码精简和压缩。

有压缩&无tree-shaking的打包大小

有压缩&有tree-shaking的打包大小

这里tree-shaking的效果还是蛮明显的,有接近40%的优化。

2)第二个问题,因为前后端环境不同,比如前端有window对象,document对象,后端没有(这里TSW有window对象,vue的识别出现问题)。如果有这方面的兼容性问题,请处理好。

Net通信并不完全一样,前端使用的是http协议网络通信,后端实际上从性能考虑,可以使用pb协议进行通信,不需要到http协议。当然这些在使用中倒不是瓶颈。

另外不推荐使用官方推荐的axios,我们在实践中发现一是axios代码非常多,源代码多达近1600行,这在移动端确实有点浪费。另外axios还不支持常见的JSONP和getScript方式的请求方式。所以这块建议大家根据自己需要用自己的Net库代替。可以参考一下我们的Net库,足够满足我们的业务需求。

核心代码200行。满足5种请求方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

export { get, post, getJSON, getJSONP, getScript }

http://static.zybuluo.com/wwanghee/9ky01ng8vnwgoi9rcob48316/net.ts

2、编写同构代码

先看目录结构,基本不需要额外的介绍,主要是方便文章中代码文件的理解:

代码同构一直是我们的理想编码方式,一份代码,前后端通用。结合VUE框架本身,VUE的SSR给我们提供了实现的可能。直出的本质无非是后端输出一份字符串,而且结合stream,进行文件的流式输出。代码类似下面这样:

view/index.first.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let app = new Vue({
    data: {
        firstData: firstData
    },
    template: '<firstScreen :firstData="firstData"></firstScreen>',
    components: {firstScreen}
});

let context = {
    env: '<script> window.ENV = ' + JSON.stringify(this.env) + '</script>',
    fisrtData: '<script> window.INITIAL_DATA = ' + JSON.stringify(firstData) + '</script>',
};

const renderer = require('vue-server-renderer').createRenderer({
    template: require('../html/index.html')
});

renderer.renderToString(app, context, (err, html) => {
    if (err) throw err;
    stream.write(html);
    stream.end();
});

虽然代码行数不多,这里要着重讲一下,有很多细节在里面。

1)后端部分的new Vue和前端部分的new Vue写法略有不同:

后端部分的new Vue:

view/index.first.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as Vue from 'vue';
import firstScreen from '../comp/firstScreen'
let app = new Vue({
    data: {
        firstData: firstData
    },
    template: '<firstScreen :firstData="firstData"></firstScreen>',
    components: {firstScreen}
});

前端部分的new Vue:

js/index.first.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as Vue from 'vue';
import firstScreen from '../comp/firstScreen'

let app = new Vue({
    data: {
        firstData: window['INITIAL_DATA']
    },
    template: '<firstScreen :firstData="firstData"></firstScreen>',
    components: {firstScreen}
});

app.$mount('#main');

HTML部分

html/index.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="main">
    <!--vue-ssr-outlet-->    
</div>

后端部分的挂载点根据,前端部分的挂载点根据组件中的id="main"

数据部分,后端的firstData由后端拼好数据,前端这里有点讲究。有涉及数据共享的部分。传统的做法是通过vuex的store来实现,在我们的场景中,我们没有使用vuex。只是首屏渲染部分我们采取全局变量的方式来完成数据共享和一致性。

2)context的妙用

VUE中提供的context上下文来传递变量给到首屏页面是个非常方便的东西,可以做很多初始化工作。

比如我们经常需要获取会员信息等,定义一个全局变量可以很方便的任意地方进行使用。不需要异步加载。

再比如我们页面做性能测试的时候,需要badjs脚本,蹦失率脚本等,且需要进行灰度处理。这使用context再方便不过了。

后端:

view/index.first.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let context = {
    //灰度蹦失率的脚本,QQ尾号为6进行蹦失率统计
    notifyWebStatus: utils.getUin() % 10 == 6 ? notifyWebStatus : '' 
};

前端模板:

html/index.html

四、VUE直出与CDN切换

在做了VUE同构直出之后,我们惊喜地发现我们自然而然的具备了直出和CDN页面任意切换的能力,我们只需要稍微改造一下就能实现。此处感谢QQ动漫团队的灵感和启发。

1、首屏数据部分进行一次同构,让后端和前端都可以通过同样的CGI取到相同的数据

common/model.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function getFirstData() {
    if (window['INITIAL_DATA']) {
        return window['INITIAL_DATA'];
    } else {
        return await net.get('/sign/cgi/getFirstData');
    }
}

2、后端改为:

view/index.first.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let firstData = await model.getFirstData();
let app = new Vue({
    data: {
        firstData: firstData
    },
    template: '<firstScreen :firstData="firstData"></firstScreen>',
    components: {firstScreen}
});

3、前端改为:

js/index.first.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.getFirstData().then((firstData) => {
    let app = new Vue({
        data: {
            firstData: firstData
        },
        template: '<firstScreen :firstData="firstData"></firstScreen>',
        components: {firstScreen}
    });
    app.$mount('#main');
});

4、那么我们新建一个名为index_cdn.html文件

这个文件是放在CDN的,唯一和直出文件不同的地方就是一个

直出版本:

html/index.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="main">
    <!--vue-ssr-outlet-->
</div>

CDN版本:

html/index_cdn.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="main">
    <firstScreen></firstScreen>
</div>

其它完全一模一样!

这样我们做的事情就可以在直出Server抗不住的情况下,轻松切到CDN啦,只不过内容全部都是异步拉取的了。对于暂时的用户体验来说并没有太大影响,避免出现Server过载,业务出现无法访问的情况。

通过此方案我们可以制定一个流量控制策略,轻松在直出和CDN两者间切换自如。

五、VUE直出与SONIC的结合

VasSonic是最近比较火的一个H5页面加速方案,方案详情见:https://www.qcloud.com/community/article/500037

如果在手Q环境中,那接入相当简单。如果不是,请参考github开源代码:https://github.com/Tencent/VasSonic

不过实际上由于VUE的一些BUG导致接入会出现问题,好在WONDER为大家把坑填平了。

1、VUE的SSR部分无法保留注释

看过Sonic原理和方案的同学知道Sonic是依赖注释来拆分模板和数据的。但是因为VUE的SSR部分代码有个BUG,导致无法保留注释。

这个问题在官方文档2.4版本已提供comments参数来解决,并且github上也有相关讨论https://github.com/vuejs/vue/pull/5951 但实际上,What a sad,并没有彻底解决,代码是有BUG的。

既SSR部分即使设置comments:true也是不行的。WONDER修改了两处vue-server-render的代码,修复了这里的问题。准备提PR给Vue官方,看他们准备如何处理。修改如下:

6871行,源代码为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Object.assign(vm.$options, compileToFunctions(template, {
    scopeId: _scopeId
}));

修改代码为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Object.assign(vm.$options, compileToFunctions(template, {
    scopeId: _scopeId,
    comments: vm.$options.comments
}));

3012行,源代码为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

options.comment(html.substring(4, commentEnd));

修改代码为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

options.comment(html.substring(0, commentEnd+3));

改完代码,只需要轻松声明一下注释保留即可comments: true:

组件声明部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component({
    template: require('./index.html'),
    props: {
        firstData: Object
    },
    comments: true,
    components: {paybar, item}
})

2、处理好源代码的BUG之后,我们就可以开心地使用VUE和SONIC的结合啦

1)将数据块包裹在sonicdiff标签中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<item :module="firstModule" :splitBanner="firstData.splitBanner"></item>

2)引入sonic_differ模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

import * as differ from 'sonic_differ';

3)在输出字符串的地方用differ模块处理一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
renderer.renderToString(app, context, (err, html) => {
    if (err) throw err;

    let buffer = differ(this, html);
    stream.write(buffer.data.toString());
    stream.end();
});

4)在页面的URL参数上加一个sonicMode=3,表示在手Q环境中开启SONIC模式(如果是非手Q环境,请按照SONIC的文档进行接入。)

六、VUE直出与测速优化

测速优化是老生常谈的问题,在接入VUE的同构方案之后,我们对测速还是需要进行优化的。不过这些优化都可以在编译流程中完成。

关于前端的测速核心还是网络耗时+页面耗时(首屏可交互)

1、网络耗时

网络耗时包含服务器的耗时+纯网络耗时。

首先直出的页面和CDN页面相比,服务端有渲染的耗时问题。我们之前在使用VUE直出的时候还担心这里会有性能问题,但实际在中型项目中使用,实验室数据还可以,如下图所示:

纯网络耗时比较好的思想是充分利用缓存,那么SONIC方案就是一个很好的方案,上面已经详细介绍过了。主要优势体现在局部刷新和完全Cache上面。测速数据如下:

2、页面耗时

关于页面耗时,我们先看我们的页面结构分解

由于我们使用VUE同构,并且对底层库进行了大量的重构。我们的业务完全脱离zepto,只使用qqapi的140行核心代码。也就是我们只依赖vue作为我们的库。

那么VUE库采用手Q离线包的方案,将公共库缓存到手Q里,减少公共库加载的阻塞。

index.first.js 标记为「inline」,编译系统通过任务和插件先进行webpack的打包和tree-shaking,再识别标识「inline」,将文件替换为本地文件并打在html里面。

index.entry.js 标记为「hash」,编译系统通过任务和插件先进行webpack的打包和tree-shaking,再识别标识「hash」,读取webpack的依赖声明文件「profile.json」,将文件替换为hash文件。

整个流程通过编译系统来处理,然后交给发布系统进行发布。

此时目前我们实验室的数据,页面耗时在330ms左右。

3、黑科技

首屏可交互的点在index.first.js中,尽管公共库有离线包的存在,但是还是会有一些阻塞。并且index.first.js也是有执行耗时。更彻底的办法是通过插件将首屏需要用到的监听事件和方法抽离出来,不依赖vue公共库,即可直接事件响应。

此处和QQ动漫团队学习交流了一下。核心思路是把数据和小chunk方法提前到vue公共库以前,这样可以在没有vue公共库的情况下,也可以完成简单的交互(比如跳转,对话框,选中态等),因为在没有VUE驱动的情况下,核心思想是需要数据和事件方法的。

在VUE

预计再提升150ms。

七、结束语

此篇为系列文章中的四篇中的第三篇。短期总共规划应该有四篇,分别是:

1、《TVUE框架的脚手架&IDE环境搭建&新手必备踩坑》(作者:harryxiang, justynchen, wonderhwang)(9月初完成,目前草稿)

此篇为新手入门必备

2、《TVUE框架的初级实践》(作者:wonderhwang)(已完成),其实就是[《vuejs+ts+webpack2项目实战》][1]

此篇学习之后可以完成简单的前端开发

3、《TVUE框架的中型移动端项目直出同构实践》(作者:wonderhwang, mitnickliu, justynchen, layenlin)(已完成)。

就是本文,此篇学习后可以完成中型移动端项目的前端开发,并且提供经过线上检验的性能优化方案。

4、《TVUE框架的QUI》(作者:yucongchen, roamye)(十月初完成,目前草稿)

主要结合QUI组件进行快速组件开发

希望可以在基于VUE的架构之上深度挖掘,最终能提高效能和性能。早点下班回家~~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
mark
mark
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
面向亿万级用户的QQ一般做什么?——兴趣部落的 Web 同构直出分享
作者:李强,腾讯web开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。 原文链接:http://wetest.qq.com/lab/view/348.html 一、什么是同构
WeTest质量开放平台团队
2017/11/15
1.4K0
面向亿万级用户的QQ一般做什么?——兴趣部落的 Web 同构直出分享
Vue.js前后端同构方案之准备篇:代码优化
本文介绍了在WebAssembly中利用async/await实现异步编程的方法,通过WebAssembly编译器将异步代码编译成同步代码,并利用WebAssembly的运行时特性实现异步调用,从而在浏览器中实现类似于Node.js的异步编程体验。同时,针对目前主流的前端框架和库,如Vue.js、React等,也介绍了相应的实现方法。
王鹤
2017/05/08
6.6K1
Vue.js前后端同构方案之准备篇:代码优化
【Webpack】507- 基于Tree-shaking的多平台Web代码打包实践
在业务中,我们常常会遇到一个场景:同一套web业务代码要在多平台下执行其对应的不同职能。这样很容易出现两个问题:代码里“尸横遍野”的环境判断和分支,提高了代码维护难度;执行环境下载了其他环境的功能代码,造成了资源的浪费。只要我们合理使用Webpack的Tree-shaking功能,就可以很好地解决问题。
pingan8787
2020/02/26
9370
【Webpack】507- 基于Tree-shaking的多平台Web代码打包实践
React服务端渲染与同构实践
前两年服务端渲染和同构的概念火遍了整个前端界,几乎所有关于前端的分享会议都有提到。在这年头,无论你选择什么技术栈,不会做个服务端渲染可能真的快混不下去了!最近刚好实现了个基于 React&Redux 的同构直出应用,赶紧写个文章总结总结压压惊。
IMWeb前端团队
2019/12/04
1.2K0
Vue.js前后端同构方案之准备篇—代码优化
作者简介:王鹤,高级前端工程师,隶属于腾讯SNG增值产品部。主要负责QQ个性化业务的功能开发及技术优化。业务时间喜欢折腾设计、产品,新技术、理财等。品牌「爱财记」&「爱全端」创始人。 一、前言 目前Vue.js的火爆不亚于当初的React,本人对写代码还是有一定洁癖的,代码也是艺术。很长时间在找寻最适合自己的前端开发框架,包括在React最火的时候,我依然在坚持寻找,但React在我心目中并不完美。认识Vue.js的时候,Vue还是1.0阶段,发现其理念和我心目中的理念相当接近。 文档友好,API简洁易懂,
小时光
2018/01/29
1.2K0
Vue.js前后端同构方案之准备篇—代码优化
React 同构直出优化总结
文章主要讲述了服务端渲染与客户端渲染之间的区别、服务端渲染的优势、如何将服务端渲染进行落地以及总结。
腾讯AlloyTeam
2017/05/09
2.2K0
进阶 | 17年B站前端做过哪些不为人知之事?
前端爱好者的知识盛宴 本期推文的作者为吴俊毅,哔哩哔哩的前端架构师。 如果有任何问题欢迎留言评论。 如果你觉得IMWeb有用,欢迎转发。 关注我,我是你的IMWeb。 下面由吴俊毅开讲! B站的前端之路 2017年已经过去了,总结一下B站的前端进阶之路。 过去的开发模式中,我们采用了以后端为主的 MVC 架构方式。 具体来说,每次项目评审后,前后端会先一起约定好接口,之后分别进行开发,开发完,前端需要把页面提供给后端,后端配置上数据,然后返回出来。正式基于这样的开发模式,导致了总工作量的增加,同时沟通
用户1097444
2022/06/29
3080
进阶 | 17年B站前端做过哪些不为人知之事?
关于前后端同构,我的一点思路和心得(vue、nodejs、react、模版)
最近1年多,前后端同构慢慢变成一个流行词,也许很多人还停留在前后端分离的最佳实践道路上,但实际上又有一批人已经从简单的服务端渲染走向探索最佳前后端同构方案的路上了。不过,我只是膜拜后者的过客。 虽然大家可以去网络搜索一下相关的概念解释,但这里我还是简单列举一下,我理解的术语。 1、前端渲染:浏览器一侧使用js,借助模版或vue、react、angular等框架做的DOM结构生成。 2、后端渲染:服务器一侧,使用php、nodejs等技术实现DOM结构生成,并在HTTP请求中返回给浏览器。 3、同构:浏览器一
用户1258909
2018/07/03
1.7K0
微信手Q node.js直出框架Hawaii剖析——京东前台技术委员会专题
作者简介 资深前端开发工程师 京东前台技术委员会委员 微信手Q运营产品前端开发组组长 目前负责微信手Q购物入口的前端基础建设及portal开发工作 这篇文章主要讲述了Hawaii框架设计的背景、特
京东技术
2018/04/10
1.2K0
微信手Q node.js直出框架Hawaii剖析——京东前台技术委员会专题
亿万级访问量下的前端同构直出实践
王斌
2017/09/20
2.5K0
亿万级访问量下的前端同构直出实践
Vue 首页秒开实践指南
前端性能优化一直是衡量一个团队和一个前端的各方面水平,呈现快速的加载,是给人最直观,成就感也最足的一个感受,而且对用户体验是第一重要的概念,所以这个相当重要,现就来结合美团的实践方案来讨论一下。
coder_koala
2020/12/21
1.1K0
Vue 首页秒开实践指南
进阶| Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇)
前端爱好者的知识盛宴 导语 这是Vue多页面框架系列文章的第二篇,上一篇中,我们尝试从webpack-simple原型项目改造为一个多页面的Vue项目。而这里,我们继续往前,尝试把Vue多页面改造为Nodejs直出。由于步骤较多,所以本文片幅较长。 上一篇:纯前端Vue多页面改造 本文源代码: https://github.com/kenkozheng/HTML5_research/tree/master/Vue-SSR-Multipages-Webpack3 正文 1 认识原理 稍微详细的信息,大家可以
用户1097444
2022/06/29
1K0
进阶| Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇)
前端黑科技:美团网页首帧优化实践
本文根据美团资深研发工程师寒阳在美团技术沙龙第40期《前端遇上黑科技,打造全新界面体验与效率》的演讲内容整理而成。本文介绍了如何使用构建时预渲染技术,对移动端首帧白屏问题进行优化。
美团技术团队
2019/01/07
9170
面试官:SSR解决了什么问题?有做过SSR吗?你是怎么做的?
指由服务侧完成页面的 HTML 结构拼接的页面处理技术,发送到浏览器,然后为其绑定状态与事件,成为完全可交互页面的过程
@超人
2021/02/26
4.2K0
面试官:SSR解决了什么问题?有做过SSR吗?你是怎么做的?
前端性能优化--SSR篇
SSR 也算是前端性能优化中最常用的技术方案了,能有效地缩短页面的可见时间,给用户带来很好的体验。
被删
2024/01/24
1.5K0
前端性能优化--SSR篇
高品质互动在线课堂:前端开发优化实践
大家好,感谢LiveVideoStack提供分享的机会,今天的分享主题是《高品质的互动在线课堂与开发实践》,是基于我公司的一个授课平台产品展开介绍的。首先,自我介绍下,我有着十多年的前后端开发经验,最近几年的重点在前端架构和前端技术体系搭建等工作,曾在途牛等互联网公司工作,现任TutorABC前端负责人。
LiveVideoStack
2021/09/02
1.2K0
高品质互动在线课堂:前端开发优化实践
vuejs + ts + webpack 2 框架的项目实践
作者简介:王鹤,高级前端工程师,隶属于腾讯SNG增值产品部。主要负责QQ个性化业务的功能开发及技术优化。目前专注于框架的研究,致力于提升效能,解放生产力。 一、框架的选型 没有什么框架是全能的,都有其
王鹤
2017/08/21
5.5K1
vuejs + ts + webpack 2 框架的项目实践
【QQ音乐web团队】:ReactJS 服务端同构实践
最近在项目中接入了 ReactJS 并在服务端做了同构直出。关于 ReactJS 服务端同构业界已经有不少分享,这篇文章会主要注重实践的内容,把实现细节和遇到的问题整理后进行一些分享。 首先我们来看一下同构(isomorphic)是什么? 对于前端实现来讲,同构可以理解为同一个组件或逻辑只编写一次,前后端可以共用。简单的说,由于服务端 NodeJS 环境的存在,对于服务端同构,就是维护一套业务代码,可以分别在服务端和前端运行。 组件同构示意图 我们这次进行的同构,选型采用了 React + Redux
QQ音乐技术团队
2018/01/30
2K0
【QQ音乐web团队】:ReactJS 服务端同构实践
基于Vue-SSR优化方案归纳总结
Vue-SSR相信大家都不陌生,与传统 SPA 相比,服务器端渲染 (SSR) 能够具备更好的SEO,方便搜索引擎爬虫抓取工具可以直接查看完全渲染的页面,除此之外,SSR能够在更短的时间内渲染出页面内容,通过在服务端填充数据吐出到客户端的方式,让用户有更好的用户体验。 前言 基于VueSSR的页面优化常有,而针对VueSSR的再优化不常有。前段时间有幸作为宇宙无敌上级特派看门员参加了前端tweb大会,听取了腾讯视频Web高级工程师lucien(段隆贤) 分享了针对SSR场景下的一些优化,由于笔者之
腾讯技术工程官方号
2019/11/25
2.1K0
基于Vue-SSR优化方案归纳总结
基于 Vue 和 TS 的 Web 移动端项目实战心得
来源:https://juejin.im/post/5d759f706fb9a06afa32adec
coder_koala
2021/01/06
2.3K0
基于 Vue 和 TS 的 Web 移动端项目实战心得
推荐阅读
相关推荐
面向亿万级用户的QQ一般做什么?——兴趣部落的 Web 同构直出分享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档