|
| 1 | +# 基本的な使い方 |
| 2 | + |
| 3 | +## インストール |
| 4 | + |
| 5 | +```bash |
| 6 | +npm install vue vue-server-renderer --save |
| 7 | +``` |
| 8 | + |
| 9 | +このガイドでは NPM を使って説明していきますが [Yarn](https://yarnpkg.com/en/) でも大丈夫です。 |
| 10 | + |
| 11 | +#### 注意 |
| 12 | + |
| 13 | +- Node.jsのバージョンは6以上を使用することを推奨します |
| 14 | +- `vue-server-renderer` と `vue` のバージョンは一致している必要があります |
| 15 | +- `vue-server-renderer` はNode.jsのネイティブモジュールに依存しているため、Node.jsでのみ使用できます。 私たちは、将来的に他のJavaScriptランタイムで実行できるよりシンプルなビルドを提供するかもしれません。 |
| 16 | + |
| 17 | +## Vue インスタンスをレンダリング |
| 18 | + |
| 19 | +```js |
| 20 | +// ステップ 1: Vue インスタンスを作成 |
| 21 | +const Vue = require('vue') |
| 22 | +const app = new Vue({ |
| 23 | + template: `<div>Hello World</div>` |
| 24 | +}) |
| 25 | +// ステップ 2: レンダラを作成 |
| 26 | +const renderer = require('vue-server-renderer').createRenderer() |
| 27 | +// ステップ 3: Vue インスタンスをHTMLに描画 |
| 28 | +renderer.renderToString(app, (err, html) => { |
| 29 | + if (err) throw err |
| 30 | + console.log(html) |
| 31 | + // => <div data-server-rendered="true">hello world</div> |
| 32 | +}) |
| 33 | +``` |
| 34 | + |
| 35 | +## サーバと連携する |
| 36 | + |
| 37 | +Node.js で作られたサーバで使う場合はとても簡単です。例えば [Express](https://expressjs.com/): |
| 38 | + |
| 39 | +```bash |
| 40 | +npm install express --save |
| 41 | +``` |
| 42 | + |
| 43 | +--- |
| 44 | + |
| 45 | +```js |
| 46 | +const Vue = require('vue') |
| 47 | +const server = require('express')() |
| 48 | +const renderer = require('vue-server-renderer').createRenderer() |
| 49 | +server.get('*', (req, res) => { |
| 50 | + const app = new Vue({ |
| 51 | + data: { |
| 52 | + url: req.url |
| 53 | + }, |
| 54 | + template: `<div>The visited URL is: {{ url }}</div>` |
| 55 | + }) |
| 56 | + renderer.renderToString(app, (err, html) => { |
| 57 | + if (err) { |
| 58 | + res.status(500).end('Internal Server Error') |
| 59 | + return |
| 60 | + } |
| 61 | + res.end(` |
| 62 | + <!DOCTYPE html> |
| 63 | + <html lang="en"> |
| 64 | + <head><title>Hello</title></head> |
| 65 | + <body>${html}</body> |
| 66 | + </html> |
| 67 | + `) |
| 68 | + }) |
| 69 | +}) |
| 70 | +server.listen(8080) |
| 71 | +``` |
| 72 | + |
| 73 | +## ページテンプレートを使用する |
| 74 | + |
| 75 | +Vueアプリを描画する際、レンダラはアプリのマークアップのみを生成します。この例では、出力を余計なHTMLページシェルでラップする必要がありました。 |
| 76 | + |
| 77 | +これをシンプル化するために、レンダラの作成時にページテンプレートを直接提供することができます。ほとんどの場合、ページテンプレートを単独のファイルに記述します。 例 `index.template.html`: |
| 78 | + |
| 79 | +```html |
| 80 | +<!DOCTYPE html> |
| 81 | +<html lang="en"> |
| 82 | + <head><title>Hello</title></head> |
| 83 | + <body> |
| 84 | + <!--vue-ssr-outlet--> |
| 85 | + </body> |
| 86 | +</html> |
| 87 | +``` |
| 88 | + |
| 89 | +`<!--vue-ssr-outlet-->` コメントに注目してみてください。 -- これはあなたのアプリケーションのマークアップが注入される場所です。 |
| 90 | + |
| 91 | +ファイルを読み込みVueレンダラに渡すことができます。 |
| 92 | + |
| 93 | +```js |
| 94 | +const renderer = createRenderer({ |
| 95 | + template: require('fs').readFileSync('./index.template.html', 'utf-8') |
| 96 | +}) |
| 97 | +renderer.renderToString(app, (err, html) => { |
| 98 | + console.log(html) // will be the full page with app content injected. |
| 99 | +}) |
| 100 | +``` |
| 101 | + |
| 102 | +### テンプレート展開 |
| 103 | + |
| 104 | +テンプレートはシンプルな展開にも対応しています。 次のようなテンプレートであれば: |
| 105 | + |
| 106 | +```html |
| 107 | +<html> |
| 108 | + <head> |
| 109 | + <title>{{ title }}</title> |
| 110 | + {{{ meta }}} |
| 111 | + </head> |
| 112 | + <body> |
| 113 | + <!--vue-ssr-outlet--> |
| 114 | + </body> |
| 115 | +</html> |
| 116 | +``` |
| 117 | + |
| 118 | +`renderToString` の第2引数として "描画コンテキストオブジェクト"(render context object) を渡すことで展開データを提供することができます |
| 119 | + |
| 120 | +```js |
| 121 | +const context = { |
| 122 | + title: 'hello', |
| 123 | + meta: ` |
| 124 | + <meta ...> |
| 125 | + <meta ...> |
| 126 | + ` |
| 127 | +} |
| 128 | +renderer.renderToString(app, context, (err, html) => { |
| 129 | + // ページタイトルは "hello" になり、 |
| 130 | + // メタタグが注入されます。 |
| 131 | +}) |
| 132 | +``` |
| 133 | + |
| 134 | +`context` オブジェクトもVueアプリインスタンスと共有することができ、コンポーネントがテンプレート展開のためにデータを動的に追加することができます。 |
| 135 | + |
| 136 | +さらに、テンプレートは次のような高度な機能をサポートしています: |
| 137 | + |
| 138 | +- `*.vue` コンポーネントを使用する際の、重要なCSSの自動注入 |
| 139 | +- `clientManifest` を使用する際の、アセットリンクとリソースヒントの自動注入 |
| 140 | +- クライアントサイドハイドレーションのためにVuexの状態を埋め込む際にXSS防止の自動注入 |
| 141 | + |
| 142 | +関連する概念については、後でこのガイドで紹介します。 |
0 commit comments