|
| 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 | +// Step 1: Create a Vue instance |
| 21 | +const Vue = require('vue') |
| 22 | +const app = new Vue({ |
| 23 | + template: `<div data-segment-id="430704">Hello World </div>` |
| 24 | +}) |
| 25 | +// Step 2: Create a renderer |
| 26 | +const renderer = require('vue-server-renderer').createRenderer() |
| 27 | +// Step 3: Render the Vue instance to HTML |
| 28 | +renderer.renderToString(app, (err, html) => { |
| 29 | + if (err) throw err |
| 30 | + console.log(html) |
| 31 | + // => <div data-server-rendered="true" data-segment-id="481338">Hello World </div> |
| 32 | +}) |
| 33 | +``` |
| 34 | + |
| 35 | +## 서버와 통합하는 방법 |
| 36 | + |
| 37 | +[Express](https://expressjs.com/)와 같이 Node.js 서버에서 사용하면 매우 간단합니다. |
| 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 data-segment-id="430706">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 | + |
| 63 | + |
| 64 | + <title data-segment-id="430707">Hello</title> |
| 65 | + ${html} |
| 66 | + |
| 67 | + `) |
| 68 | + }) |
| 69 | +}) |
| 70 | +server.listen(8080) |
| 71 | +``` |
| 72 | + |
| 73 | +## 페이지 템플릿 이용하기 |
| 74 | + |
| 75 | +Vue 앱을 렌더링할 때 렌더러는 앱의 마크업만 생성합니다. 이 예제에서 추가 HTML 페이지 쉘로 출력을 레핑해야합니다. |
| 76 | + |
| 77 | +이를 간단히 하기 위해 렌더러를 만들 때 페이지 템플릿을 직접 제공할 수 있습니다. 대부분의 경우 페이지 템플릿을 자체 파일에 저장합니다. (예: `index.template.html`) |
| 78 | + |
| 79 | +```html |
| 80 | + |
| 81 | + |
| 82 | + <title data-segment-id="430708">Hello</title> |
| 83 | + |
| 84 | + <!--vue-ssr-outlet--> |
| 85 | + |
| 86 | + |
| 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 | + |
| 108 | + |
| 109 | + <!-- use double mustache for HTML-escaped interpolation --> |
| 110 | + <title data-segment-id="430709">{{ title }}</title> |
| 111 | + <!-- use triple mustache for non-HTML-escaped interpolation --> |
| 112 | + {{{ meta }}} |
| 113 | + |
| 114 | + |
| 115 | + <!--vue-ssr-outlet--> |
| 116 | + |
| 117 | + |
| 118 | +``` |
| 119 | + |
| 120 | +`renderToString`의 두번째 전달인자로 "render context object" 를 전달하여 인터폴레이션 데이터를 제공할 수 있습니다. |
| 121 | + |
| 122 | +```js |
| 123 | +const context = { |
| 124 | + title: 'hello', |
| 125 | + meta: ` |
| 126 | + <meta ...> |
| 127 | + <meta ...> |
| 128 | + ` |
| 129 | +} |
| 130 | +renderer.renderToString(app, context, (err, html) => { |
| 131 | + // page title will be "Hello" |
| 132 | + // with meta tags injected |
| 133 | +}) |
| 134 | +``` |
| 135 | + |
| 136 | +`컨텍스트`객체는 Vue 앱 인스턴스와 공유할 수 있으므로 컴포넌트가 템플릿 인터폴레이션을 위해 데이터를 동적으로 등록할 수 있습니다. |
| 137 | + |
| 138 | +또한 템플릿은 다음과 같은 몇 가지 고급 기능을 지원합니다. |
| 139 | + |
| 140 | +- `*.vue` 컴포넌트를 사용할 때 CSS를 자동으로 주입합니다. |
| 141 | +- `clientManifest`를 사용할 때 에셋 링크 및 리소스에 관련한 힌트를 자동으로 주입합니다. |
| 142 | +- 클라이언트 측 하이드레이션을 위한 Vuex 스테이트 포함시 자동 주입 및 XSS를 예방을 지원합니다. |
| 143 | + |
| 144 | +나중에 이 가이드에서 관련 개념을 소개할 때 자세히 다룰 것 입니다. |
0 commit comments