• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com专业计算机教程网站
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure
您的位置:首页 > 网页设计 >vue > Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )

Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )

作者:MonkeyWang 字体:[增加 减小] 来源:互联网 时间:2017-05-30

本文主要包含vue 服务端渲染,vue 移动端,vue 移动端ui,vue前后端分离,vue 移动端框架等相关知识,MonkeyWang 希望在学习及工作中可以帮助到您

Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本。网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 vue-hacker-news。本人在公司做Vue项目的时候,一直苦于产品、客户对首屏加载要求,SEO的诉求,也想过很多解决方案,本次也是针对浏览器渲染不足之处,采用了服务端渲染,并且做了两个一样的Demo作为比较,更能直观的对比Vue前后端的渲染。

talk is cheap,show us the code!话不多说,我们分别来看两个Demo:(欢迎star 欢迎pull request)

1.浏览器端渲染Demo: https://github.com/monkeyWangs/doubanMovie

2.服务端渲染Demo:https://github.com/monkeyWangs/doubanMovie-SSR

两套代码运行结果都是为了展示豆瓣电影的,运行效果也都是差不多,下面我们来分别简单的阐述一下项目的机理:

一、浏览器端渲染豆瓣电影

首先我们用官网的脚手架搭建起来一个vue项目

npm install -g vue-cli
vue init webpack doubanMovie
cd doubanMovie
npm install
npm run dev
</div>

这样便可以简单地打起来一个cli框架,下面我们要做的事情就是分别配置 vue-router, vuex,然后配置我们的webpack proxyTable 让他支持代理访问豆瓣API。

1.配置Vue-router

我们需要三个导航页:正在上映、即将上映、Top250;一个详情页,一个搜索页。这里我给他们分别配置了各自的路由。在 router/index.js 下配置以下信息:

import Vue from 'vue'
import Router from 'vue-router'
import Moving from '@/components/moving'
import Upcoming from '@/components/upcoming'
import Top250 from '@/components/top250'
import MoviesDetail from '@/components/common/moviesDetail'
import Search from '@/components/searchList'
Vue.use(Router)
/**
 * 路由信息配置
 */
export default new Router({
 routes: [
 {
 path: '/',
 name: 'Moving',
 component: Moving
 },
 {
 path: '/upcoming',
 name: 'upcoming',
 component: Upcoming
 },
 {
 path: '/top250',
 name: 'Top250',
 component: Top250
 },
 {
 path: '/search',
 name: 'Search',
 component: Search
 },
 {
 path: '/moviesDetail',
 name: 'moviesDetail',
 component: MoviesDetail
 }
 ]
})
</div>

这样我们的路由信息配置好了,然后每次切换路由的时候,尽量避免不要重复请求数据,所以我们还需要配置一下组件的keep-alive:在app.vue组件里面。

<keep-alive exclude="moviesDetail">
 <router-view></router-view>
</keep-alive>
</div>

这样一个基本的vue-router就配置好了。

2.引入vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

简而言之:Vuex 相当于某种意义上设置了读写权限的全局变量,将数据保存保存到该“全局变量”下,并通过一定的方法去读写数据。

Vuex 并不限制你的代码结构。但是,它规定了一些需要遵守的规则:

应用层级的状态应该集中到单个 store 对象中。

提交 mutation 是更改状态的唯一方法,并且这个过程是同步的。

异步逻辑都应该封装到 action 里面。

对于大型应用我们会希望把 Vuex 相关代码分割到模块中。下面是项目结构示例:

├── index.html
├── main.js
├── api
│ └── ... # 抽取出API请求
├── components
│ ├── App.vue
│ └── ...
└── store
 ├── index.js  # 我们组装模块并导出 store 的地方
 └── moving  # 电影模块
 ├── index.js # 模块内组装,并导出模块的地方
 ├── actions.js # 模块基本 action
 ├── getters.js # 模块级别 getters
 ├── mutations.js # 模块级别 mutations
 └── types.js # 模块级别 types
</div>

所以我们开始在我们的src目录下新建一个名为store 的文件夹 为了后期考虑 我们新建了moving 文件夹,用来组织电影,考虑到所有的action,getters,mutations,都写在一起,文件太混乱,所以我又给他们分别提取出来。

stroe文件夹建好,我们要开始在main.js里面引用vuex实例:

import store from './store'
new Vue({
 el: '#app',
 router,
 store,
 template: '<App/>',
 components: { App }
})
</div>

这样,我们便可以在所有的子组件里通过 this.$store 来使用vuex了。

3.webpack proxyTable 代理跨域

webpack 开发环境可以使用proxyTable 来代理跨域,生产环境的话可以根据各自的服务器进行配置代理跨域就行了。在我们的项目config/index.js 文件下可以看到有一个proxyTable的属性,我们对其简单的改写

proxyTable: {
 '/api': {
 target: 'http://api.douban.com/v2',
 changeOrigin: true,
 pathRewrite: {
  '^/api': ''
 }
 }
 }
</div>

这样当我们访问

localhost:8080/api/movie

的时候 其实我们访问的是

http://api.douban.com/v2/movie

这样便达到了一种跨域请求的方案。

至此,浏览器端的主要配置已经介绍完了,下面我们来看看运行的结果:

为了介绍浏览器渲染是怎么回事,我们运行一下npm run build 看看我们的发布版本的文件,到底是什么鬼东西....

run build 后会都出一个dist目录 ,我们可以看到里面有个index.html,这个便是我们最终页面将要展示的html,我们打开,可以看到下面:

观察好的小伙伴可以发现,我们并没有多余的dom元素,就只有一个div,那么页面要怎么呈现呢?答案是js append,对,下面的那些js会负责innerHTML。而js是由浏览器解释执行的,所以呢,我们称之为浏览器渲染,这有几个致命的缺点:

js放在dom结尾,如果js文件过大,那么必然造成页面阻塞。用户体验明显不好(这也是我我在公司反复被产品逼问的事情)

不利于SEO

客户端运行在老的JavaScript引擎上

对于世界上的一些地区人,可能只能用1998年产的电脑访问互联网的方式使用计算机。而Vue只能运行在IE9以上的浏览器,你可能也想为那些老式浏览器提供基础内容 - 或者是在命令行中使用 Lynx的时髦的黑客

基于以上的一些问题,服务端渲染呼之欲出....

二、服务器端渲染豆瓣电影

先看一张Vue官网的服务端渲染示意图

从图上可以看出,ssr 有两个入口文件,client.js 和 server.js, 都包含了应用代码,webpack 通过两个入口文件分别打包成给服务端用的 server bundle 和给客户端用的 client bundle. 当服务器接收到了来自客户端的请求之后,会创建一个渲染器 bundleRenderer,这个 bundleRenderer 会读取上面生成的 server bundle 文件,并且执行它的代码, 然后发送一个生成好的 html 到浏览器,等到客户端加载了 client bundle 之后,会和服务端生成的DOM 进行 Hydration(判断这个DOM 和自己即将生成的DOM 是否相同,如果相同就将客户端的vue实例挂载到这个DOM上, 否则会提示警告)。

具体实现:

我们需要vuex,需要router,需要服务器,需要服务缓存,需要代理跨域....不急我们慢慢来。

1.建立nodejs服务

首先我们需要一个服务器,那么对于nodejs,express是很好地选择。我们来建立一个server.js

const port = process.env.PORT || 8080
app.listen(port, () => {
 console.log(`server started at localhost:${port}`)
})
</div>

这里用来启动服务监听 8080 端口。

然后我们开始处理所有的get请求,当请求页面的时候,我们需要渲染页面

app.get('*', (req, res) => {
 i
  


 

您可能想查找下面的文章:

  • Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
  • Vue 2.0 服务端渲染入门介绍

相关文章

  • 2017-05-30Vue.js实现移动端短信验证码功能
  • 2017-05-30详解Vue 实例中的生命周期钩子
  • 2017-05-30深入理解vue.js双向绑定的实现原理
  • 2018-11-02VUE 移动端适配:VUE-CLI 3 添加 flexible 及 px2rem
  • 2017-05-30Vue.js Ajax动态参数与列表显示实现方法
  • 2017-05-30vue2 前后端分离项目ajax跨域session问题解决方法
  • 2017-05-30vue.js 使用v-if v-else发现没有执行解决办法
  • 2017-08-02Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>'
  • 2017-05-30vue多级多选菜单组件开发
  • 2017-05-30vue指令以及dom操作详解

文章分类

  • html/xhtml
  • html5
  • CSS
  • XML/XSLT
  • Dreamweaver教程
  • Frontpage教程
  • 心得技巧
  • bootstrap
  • vue
  • AngularJS
  • HBuilder教程
  • css3
  • 浏览器兼容
  • div/css
  • 网页编辑器
  • axure

最近更新的内容

    • Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
    • Vue之嵌套router传参params与query
    • vue.js利用Object.defineProperty实现双向绑定
    • vue-router路由简单案例介绍
    • vue学习笔记之vue1.0和vue2.0的区别介绍
    • 基于Vue.js实现简单搜索框
    • 基于Vue2的移动端开发环境搭建详解
    • vuejs2.0运用原生js实现简单的拖拽元素功能示例
    • Vue表单验证插件的制作过程
    • vue学习笔记之指令v-text && v-html && v-bind详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有