- Notifications
You must be signed in to change notification settings - Fork38
Neveryu/vue-ssr-lessons
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
手把手带你学会 vue 的服务端渲染
本课程的内容是基于 vue ssr 的文档来的,课程的结果是完成一个 vue 服务端渲染的实例。所以在学习本课程的时候,建议你打开vue ssr 的文档,这样有助于理解。
本课程所包含的几个小节,都是循序渐进的,由易到难,每一个小节都是在前一个小节的基础上,添加新的内容,幅度平缓,易学易懂。
小提示:建议配合着vue ssr 的文档来学习本课程。
本课程内容如下:
| 【基础篇】 | 【中级篇】 | 【附加篇】 |
|---|---|---|
| Lesson1 | Lesson4 | Lesson7 |
| Lesson2 | Lesson5 | |
| Lesson3 | Lesson6 |
【基础篇】
用最简单,明白的方式创建一个 vue 服务端渲染的应用程序。
// 第 1 步:创建一个 Vue 实例constVue=require('vue')constapp=newVue({template:`<div>Hello World</div>`})// 第 2 步:创建一个 rendererconstrenderer=require('vue-server-renderer').createRenderer()// 第 3 步:将 Vue 实例渲染为 HTML// 在 2.5.0+,如果没有传入回调函数,则会返回 Promise:renderer.renderToString(app).then(html=>{console.log(html)// => <div data-server-rendered="true">Hello World</div>}).catch(err=>{console.error(err)})
课程 1 的运行步骤:
cd lesson1npm inpm start然后会在命令行看到输出内容:
<divdata-server-rendered="true">Hello World</div>
内容:与服务器集成,使用 Express 作为服务器提供服务;
课程 2 的运行步骤:
cd lesson2npm inpm start内容:使用一个页面模板index.template.html。
课程 3 的运行步骤:
cd lesson3npm inpm start本节内容讲解
renderer 只从应用程序生成 HTML 标记(markup),如果不提供模板的话,那么生成的 HTML 标记就应该是一个完整的 html 内容。
在这节中,我们提供一个额外的 HTML 模板,作为页面包裹容器,来包裹renderer 生成的 HTML 标记。
同时,模板还支持简单插值。我们可以通过传入一个 “渲染上下文对象”context,作为renderToString 函数的第二个参数,来提供插值数据。
【中级篇】
与纯客户端开发模式不同,服务端渲染的最终结果是生成Client Bundle 和Server Bundle。
在这一章,我们会添加entry-client.js 和entry-server.js 分别作为客户端和服务端的入口。app.js 是通用的入口,供entry-client.js 和entry-server.js 共同使用。所以entry-client.js 和entry-server.js 中都会引入app.js。
课程 4 的运行步骤:
cd lesson4npm inpm start与此同时,这一节中,webpack 也要加上了。
【至于webpack 的配置,感兴趣的可以看一下,比较简单。】
内容:这一节,加入vue-router 来实现路由的功能。
课程 5 的运行步骤:
cd lesson5npm inpm start路由vue-router 的添加是比较容易的;新建一个目录router 并创建一个路由实例,然后app.js、entry-client.js、entry-server.js 有小幅改动。
内容:这一节实现【数据】
本节内容讲解
我们知道,服务端渲染最重要的部分就是“数据”了。既然是服务端渲染,那么就应该是服务端将运算处理后的数据填到应用程序中,然后将整个应用程序返回到前端。所以在服务端渲染过程之前,需要先预取和解析好这些数据。
另一个需要关注的问题是在客户端,在挂载 (mount) 到客户端应用程序之前,需要获取到与服务器端应用程序完全相同的数据 - 否则,客户端应用程序会因为使用与服务器端应用程序不同的状态,然后导致混合失败。
【在这里需要好好的思考一下,vue 的服务端渲染是如何实现的?如何理解 “客户端应用程序会因为使用与服务器端应用程序不同的状态,然后导致混合失败” 这句话?第 4 节中的 vue 服务端渲染结构图是否理解清楚了?】
我们在服务端预取和解析数据的时候,将这些数据填充到“状态容器(state container)”中,然后客户端也使用这里面的数据,就可以保证客户端与服务器端拥有相同的状态了。【状态容器如何实现?】
我们使用 vuex 来作为“状态容器”,此外,我们将在 HTML 中序列化(serialize)和内联预置(inline)状态。这样,在挂载(mount)到客户端应用程序之前,可以直接从 store 获取到内联预置(inline)状态。
课程 6 的运行步骤:
cd lesson6npm inpm start本次更新内容较多,详细的说明请看这里 =>Lesson6
【附加篇】
内容:这一节增加了一些额外的辅助工具【gzip、缓存、favicon、title】;然后增加了生产环境的打包和运行命令。
课程 7 的开发运行步骤:
cd lesson7# install dependenciesnpm install# serve in dev mode, with hot reload at localhost:8080npm run dev
课程 7 打包 server 运行步骤:
# build for production(打生产环境的包)npm run build# serve in production mode(运行生产环境)npm run server
本次更新内容较多,详细的说明请看这里 =>Lesson7
交流学习 QQ 群:685486827,一键加群
1、我们在前三节使用的都是vue-server-renderer 中的createRenderer 方法;从第四节开始,我们使用的是createBundleRenderer,所创建的bundle renderer,用法和普通renderer 相同。createBundleRenderer 接收一个server bundle 生成的特殊 JSON 文件。但是bundle renderer 提供以下优点:
内置的
source map支持(在webpack配置中使用devtool: 'source-map')在开发环境甚至部署过程中热重载(通过读取更新后的
bundle,然后重新创建renderer实例)关键
CSS(critical CSS)注入(在使用*.vue文件时):自动内联在渲染过程中用到的组件所需的CSS。更多细节请查看 CSS 章节。使用
clientManifest进行资源注入:自动推断出最佳的预加载(preload)和预取(prefetch)指令,以及初始渲染所需的代码分割 chunk。
2、手动资源注入
默认情况下,当提供template 渲染选项时,资源注入是自动执行的。但是有时候,你可能需要对资源注入的模板进行更细粒度 (finer-grained) 的控制,或者你根本不使用模板。在这种情况下,你可以在创建renderer 并手动执行资源注入时,传入inject: false。>>点击查看详情
3、css提取
css提取可以说是一个很重要的知识点;不光在 vue 的服务端项目中,几乎在任何前端项目中,我们都希望css可以单独提取出来,这样可以对文件进行缓存以及部署 CDN。
【启用css 提取】
css 提取应该只用于生产环境,这样我们在开发过程中仍然可以热重载
要从*.vue 文件中提取 CSS,可以使用vue-loader 的extractCSS 选项(需要vue-loader 12.0.0+)
// webpack.config.jsconstExtractTextPlugin=require('extract-text-webpack-plugin')// CSS 提取应该只用于生产环境// 这样我们在开发过程中仍然可以热重载constisProduction=process.env.NODE_ENV==='production'module.exports={// ...module:{rules:[{test:/\.vue$/,loader:'vue-loader',options:{// enable CSS extractionextractCSS:isProduction}},// ...]},plugins:isProduction// 确保添加了此插件! ?[newExtractTextPlugin({filename:'common.[chunkhash].css'})] :[]}
请注意,上述配置仅适用于*.vue 文件中的样式,然而你也可以使用<style src="./foo.css"> 将外部 CSS 导入 Vue 组件。
如果你想从 JavaScript 中导入 CSS,例如,import 'foo.css',你需要配置合适的 loader:
module.exports={// ...module:{rules:[{test:/\.css$/,// 重要:使用 vue-style-loader 替代 style-loaderuse:isProduction ?ExtractTextPlugin.extract({use:'css-loader',fallback:'vue-style-loader'}) :['vue-style-loader','css-loader']}]},// ...}
【从依赖模块导入样式】
在使用 CSS 提取 + 使用CommonsChunkPlugin 插件提取 vendor 时,如果提取的 CSS 位于提取的vendor chunk 之中,extract-text-webpack-plugin 会遇到问题。为了解决这个问题,请避免在vendor chunk 中包含 CSS 文件。客户端 webpack 配置示例如下:
module.exports={// ...plugins:[// 将依赖模块提取到 vendor chunk 以获得更好的缓存,是很常见的做法。newwebpack.optimize.CommonsChunkPlugin({name:'vendor',minChunks:function(module){// 一个模块被提取到 vendor chunk 时……return(// 如果它在 node_modules 中/node_modules/.test(module.context)&&// 如果 request 是一个 CSS 文件,则无需外置化提取!/\.css$/.test(module.request))}}),// 提取 webpack 运行时和 manifestnewwebpack.optimize.CommonsChunkPlugin({name:'manifest'}),// ...]}
About
包教会的 vue 服务端渲染课程
Topics
Resources
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
Packages0
Uh oh!
There was an error while loading.Please reload this page.


