SSR服务器端渲染技术(一)

先引包

var http =require('http');
var Vue = require('vue')
var serverRender = require('vue-server-renderer')

//步骤1 创建vue实例

var app = new Vue({
    template:`<div>
        <my-component/>
    </div>`,
    components:{
        myComponent:{
            template:'<div>vvvvvvvvvvvvvvv</div>'
        }
    }
})

//步骤2 创建renderer实例

var renderer = serverRender.createRenderer()

//步骤3 将vue实例转化为 html字符串

renderer.renderToString(app,function(err,html){
    console.log(html)
})

此时输出的结果为(这里只是展示可以转字符串)

Administrator@PC-Liyueran MINGW64 /e/www/WWWWWW/ssrDemo
$ node demo.js
<div data-server-rendered="true"><div>vvvvvvvvvvvvvvv</div></div>

//步骤4 将VUE实例的字符串输出到服务器

//步骤4  将VUE实例的字符串输出到服务器
http.createServer((req,res)=>{  
    //步骤3  将vue实例转化为 html字符串
    renderer.renderToString(app,function(err,html){
        console.log(html)
        res.end(`<!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <meta http-equiv="X-UA-Compatible" content="ie=edge">
            <title>Document</title>
        </head>
        <body>
            ${html}
            <div>wowoow</div>
        </body>
        </html>`)
    })   
}).listen(3000);

完整例子代码如下:

var http =require('http');
var Vue = require('vue')
var serverRender = require('vue-server-renderer')

//步骤1 创建vue实例
var app = new Vue({
    template:`<div>
        <my-component/>
    </div>`,
    components:{
        myComponent:{
            template:'<div>vue实例</div>'
        }
    }
})
//步骤2 创建renderer实例
var renderer = serverRender.createRenderer()


//步骤4  将VUE实例的字符串输出到服务器
http.createServer((req,res)=>{  
    //步骤3  将vue实例转化为 html字符串
    renderer.renderToString(app,function(err,html){
        console.log(html)
        res.end(`<!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <meta http-equiv="X-UA-Compatible" content="ie=edge">
            <title>Document</title>
        </head>
        <body>
            ${html}
            <div>wowoow</div>
        </body>
        </html>`)
    })   
}).listen(3000);

这样把字符串都放在node里面不是很好,所以把template 写出去。

-------------------------------------------------------------------------------------------------------------

createrender 里面  可以 通过FS模块读取template 模版,那么我们可以新建一个html来存放之前的template,

//步骤2 创建renderer实例
var renderer = serverRender.createRenderer({
    template:require('fs').readFileSync('./index.template.html','utf-8')
})


//步骤4  将VUE实例的字符串输出到服务器
http.createServer((req,res)=>{  
    //步骤3  将vue实例转化为 html字符串
    renderer.renderToString(app,function(err,html){
        console.log(html)
        res.end(html)
    })   
}).listen(3000);

template 代码如下   需要注意的是要添加一个  <!--vue-ssr-outlet-->    这个是表示vue实例里面的东西可以插入到这个地方

<!--vue-ssr-outlet-->中间不要写空格 ,否则报错

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <!--vue-ssr-outlet-->
</body>
</html>

----------------------------------------------------------------------------------------------------------------------

renderer.renderToString 中 第2个参数  可以在模版里面init 进去你要添加的标签如下

init进入了script标签

//步骤4  将VUE实例的字符串输出到服务器
http.createServer((req,res)=>{  
    //步骤3  将vue实例转化为 html字符串
    renderer.renderToString(app,{
        init:`<script> console.log('aaaa') </script>`
    },function(err,html){
        console.log(html)
        res.end(html)
    })   
}).listen(3000);

在template模版中加了{{}}和{{{}}}  2个括号和3个括号 

其中2个括号就会转译成字符串     3个括号直接执行。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    {{init}}
    {{{init}}}
    <!--vue-ssr-outlet-->
</body>
</html>

完整代码  那个index.template.html 模版我就不复制了,如上

var http =require('http');
var Vue = require('vue')
var serverRender = require('vue-server-renderer')

//步骤1 创建vue实例
var app = new Vue({
    template:`<div>
        <my-component/>
    </div>`,
    components:{
        myComponent:{
            template:'<div>vue实例</div>'
        }
    }
})
//步骤2 创建renderer实例
var renderer = serverRender.createRenderer({
    template:require('fs').readFileSync('./index.template.html','utf-8')
})


//步骤4  将VUE实例的字符串输出到服务器
http.createServer((req,res)=>{  
    //步骤3  将vue实例转化为 html字符串
    renderer.renderToString(app,{
        init:`<script> console.log('aaaa') </script>`
    },function(err,html){
        console.log(html)
        res.end(html)
    })   
}).listen(3000);

猜你喜欢

转载自blog.csdn.net/weixin_41436338/article/details/81529631