Vue
vue + koa2 + webpack4 实现服务端渲染
完整代码地址: https://github.com/dirkhe1051931999/vue-ssr-template demo 地址: https://github.com/dirkhe1051931999/common-demo/tree/master/vue-ssr-demo 服务端渲染、SPA、同构 服务端渲染:后端不仅仅进行数据的获取处理,而且也服务页面生成,最终传给客户端(浏览器)是…
完整代码地址: https://github.com/dirkhe1051931999/vue-ssr-template demo 地址: https://github.com/dirkhe1051931999/common-demo/tree/master/vue-ssr-demo 服务端渲染、SPA、同构 服务端渲染:后端不仅仅进行数据的获取处理,而且也服务页面生成,最终传给客户端(浏览器)是…
详细的网上说的很多,比如这篇https://zhuanlan.zhihu.com/p/33383814
createRenderer() 创建 render 实例renderToString(app)将 vue 实例转成 html 字符串 ,返回一个 promise,html 字符串带有 data-sercer-rendered,意思是服务端渲染的元素const Vue = require("vue");
// 创建渲染器
const renderer = require("vue-server-renderer").createRenderer();
const app = new Vue({
template: `<div>Hello World</div>`
});
// 输出:<div data-server-rendered="true">Hello World</div>
renderer
.renderToString(app)
.then(html => {
console.log(html);
})
.catch(err => {
console.log(err);
});
createRenderer()创建 render 实例renderToString(app) 将 vue 实例转成 html 字符串app.use(router.routes()).use(router.allowMethods())// server.js
const Vue = require("vue");
const Koa = require("koa");
const Router = require("koa-router");
const renderer = require("vue-server-renderer").createRenderer();
// 创建koa koa-router实列
const app = new Koa();
const router = new Router();
// 路由中间件
router.get("*", async (ctx, next) => {
// 创建vue实列
const app = new Vue({
data: {
url: ctx.url
},
template: `<div>访问的URL是:{{url}}</div>`
});
try {
// vue 实列转换成字符串
const html = await renderer.renderToString(app);
ctx.status = 200;
ctx.body = `
<!DOCTYPE html>
<html>
<head><title>vue服务器渲染组件</title></head>
<body>${html}</body>
</html>
`;
} catch (e) {
console.log(e);
ctx.status = 500;
ctx.body = "服务器错误";
}
});
// 加载路由组件
app.use(router.routes()).use(router.allowedMethods());
// 启动服务
app.listen(3001, () => {
console.log(`server started at localhost:3001`);
});
createRenderer({template:html})读取 index.template.html,作为模板,创建 render 实例,其中模板的中的双括号是占位符,三括号不会进行 html 转译renderToString(app,context) 将 vue 实例转成 html 字符串,context 就是要用占位符的上下文对象app.use(router.routes()).use(router.allowMethods())|---- ssr-demo1
| |--- src
| | |--- app.js
| | |--- index.template.html
| |--- .babelrc
| |--- .gitignore
| |--- server.js
| |--- package.json
createApp,创建一个 vue 实例,避免状态单例,成为引用对象,一处修改,其他引用也跟着改createRenderer({template:html})读取 index.template.html,作为模板,创建 render 实例,其中模板的中的双括号是占位符,三括号不会进行 html 转译renderToString(app,context) 将 vue 实例转成 html 字符串,context 就是要用占位符的上下文对象app.use(router.routes()).use(router.allowMethods())|----- ssr-demo2
| |--- build
| | |--- webpack.base.config.js # webpack 基本配置
| | |--- webpack.client.config.js # 客户端打包配置
| | |--- webpack.server.config.js # 服务器端打包配置
| |--- src
| | |--- assets
| | |--- views
| | | |--- home.vue
| | | |--- item.vue
| | |--- app.js # 创建每一个实列文件
| | |--- App.vue
| | |--- entry-client.js # 挂载客户端应用程序
| | |--- entry-server.js # 挂载服务器端应用程序
| | |--- index.template.html
| | |--- router.js # 所有的路由
| |--- .babelrc
| |--- .gitignore
| |--- server.js
| |--- package.json
createApp,创建一个 vue 实例,并且往 vue 实例中传入路由实例,避免状态单例,成为引用对象,一处修改,其他引用也跟着改router.onReady 时执行 app.\$mount()挂载 domrouter.push(context.url)设置 router 的位置,因为路由可能是异步路由,服务器需要再数据渲染完准备,所以返回一个 promise,并且的router.onReady中使用router.getMatchedComponents获取路由匹配的所有组件后再 resolve createApp 的 app,entry-client.js,设置了一些 rulesnpm run build:client生成vue-ssr-client-manifest.json作为客户端渲染的 json 插件entry-server.js,服务端也要编译 css,设置了一些 style 的 rules,最终执行npm run build:server生成vue-ssr-server-bundle.json作为服务端渲染的 json 插件createBundleRenderer读取 index.template.html,作为模板,传入 vue-ssr-server-bundle.json 和 vue-ssr-client-manifest.json`,创建 render 实例,其中模板的中的双括号是占位符,三括号不会进行 html 转译createRenderer() 和 createBundleRenderer(), 那么 createRenderer()是以 vue 组件为入口的,而 createBundleRenderer() 以打包后的 JS 文件或 json 文件为入口的
renderToString(context) 将 vue 实例转成 html 字符串,context 就是要用占位符的上下文对象,context 会作为打包的 entry-server.js 的 context 传入,context 带上 koa 的路由,然后传入 router 实例,作为客户端的路由app.use(router.routes()).use(router.allowMethods())window.__INITIAL_STATE__,提前注入 html 中window.__INITIAL_STATE__存在,需替换 store 的根状态,确保服务端渲染是的数据和客户端获取的数据一致暂无评论
确认操作
请再次确认编辑图片
待上传图片 (剩余 0 张)
项目详情
确认评论邮箱
邀请制评论