blog

Vue SSRの基本的な使い方の概要

上記のレンダリングされたhtmlは 上記のレンダリングされたhtmlはdivになり、htmlファイルに挿入しないと正しく表示されません。 上記の方法は面倒なので、用意されているテンプレート関数を利用...

Oct 26, 2020 · 3 min. read
シェア

まず、SSRを扱えるようにするために、VueのSSRライブラリをインストールする必要があります。

npm install vue vue-server-renderer --save

次にノード・プログラムでは

// ステップ1:Vueインスタンスを作成する
const Vue = require('vue')
const app = new Vue({
 template: `<div>Hello World</div>`
})
// ステップ2:レンダラーを作成する
const renderer = require('vue-server-renderer').createRenderer()
// ステップ3:VueインスタンスをHTMLにレンダリングする
renderer.renderToString(app, (err, html) => {
 if (err) throw err
 console.log(html)
 // => <div data-server-rendered="true">Hello World</div>
})
//  .5.0+,コールバック関数が渡されなければ、Promiseが返される:
renderer.renderToString(app).then(html => {
 console.log(html)
}).catch(err => {
 console.error(err)
})

その重要なステップは以下の通りです。

上記のステップから、いくつかの重要なAPIを導き出すことができます。

createRenderer renderToString.

上記のレンダリングされたhtmlはdivになり、正しくhtmlファイルに挿入する必要があります。

 renderer.renderToString(app, (err, html) => { // html vueインスタンス用のhtmlデータを生成する。<div id='app'> </div>
 // htmlに挿入して返さないと正しくない。
 if (err) {
 res.status(500).end('Internal Server Error')
 return
 }
 res.end(`
 <!DOCTYPE html>
 <html lang="en">
 <head><title>Hello</title></head>
 <body>${html}</body>
 </html>
 `)
 })
})

上記の方法は面倒なので、createRendererが提供するテンプレート関数を使うことができます。

当初、レンダラーはパラメータを渡さずに createRenderer() で作成していました。現在は、オブジェクトのパラメータを渡すことができます。

const renderer = createRenderer({
 template: require('fs').readFileSync('./index.template.html', 'utf-8') // { template: '...' } を要約すると、テンプレート関数
})
renderer.renderToString(app, (err, html) => {
 console.log(html) // html は、注入されたアプリケーションのコンテンツを含む完全なページになる。
})

テンプレートフォルダの中身を見てみましょう。

<html>
 <head>
 <!-- 二重中括弧を使ったHTMLエスケープ補間>
 <title>{{ title }}</title>
 <!-- 三重括弧を使ったHTMLのアンエスケープ補間>
 {{{ meta }}}
 </head>
 <body>
 <!--vue-ssr-outlet--> ((このコメントを省略しないように注意してほしい。)
 </body>
</html>

補間は、renderingToString の際にコンテキストを渡すことで行うことができます。

const context = {
 title: 'hello',
 meta: `
 <meta ...>
 <meta ...>
 `
}
renderer.renderToString(app, context, (err, html) => {
 // ページのタイトルは "Hello "になる
 // meta タグも
})

APIを要約すると

1. const renderer = require('vue-server-renderer').createRenderer({ template: '...' })
2. renderer.renderToString(app, context, (err, html) => {
 ...
 })
Read next

メッセージのHTTPプロトコルに(オン) - 取得とポスト

例としてHTTP1.1、いくつかのリクエストメソッドの簡単な紹介\nGET リソースの取得\n GETメソッドは、URIで認識されたリソースへのアクセスを要求し、指定されたページに関する情報を要求し、エンティティのボディを返すために使用されます。要求されたリソースがテキスト型であれば、リソースはそのまま返されます。

Oct 26, 2020 · 2 min read