Skip to content

Commit 6dc3006

Browse files
Masaya Nasukazupon
Masaya Nasu
authored andcommitted
translated the "source code structure" into Japanese. (#26)
* Translate structure.md via GitLocalize * Translate structure.md via GitLocalize * Translate structure.md via GitLocalize
1 parent a226a91 commit 6dc3006

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed

Diff for: ja/structure.md

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# ソースコードの構造
2+
3+
## ステートフルなシングルトンは避ける
4+
5+
クライアントのみのコードを書くとき、私たちはコードが毎回新しいコンテキストで評価されるという事実に慣れています。しかし、 Node.js サーバーは長時間実行されるプロセスです。私たちのコードがプロセスに要求されるとき、それは一度評価されメモリにとどまります。つまりシングルトンのオブジェクトを作成したとき、それは全ての受信リクエスト間でシェアされると言うことです。
6+
7+
基本的な例としては、私たちは **リクエストごとに新しいルート Vue インスタンスを作成します**。それは各ユーザがそれぞれのブラウザでアプリケーションの新しいインスタンスを使用することに似ています。もし私たちが複数のリクエストをまたいでインスタンスを共有すると、それは容易にクロスリクエスト状態の汚染につながるでしょう。
8+
9+
そのため、直接アプリケーションのインスタンスを作成するのではなく、各リクエストで繰り返し実行される新しいアプリケーションのインスタンスを作成するファクトリ関数を公開する必要があります:
10+
11+
```js
12+
// app.js
13+
const Vue = require('vue')
14+
module.exports = function createApp (context) {
15+
return new Vue({
16+
data: {
17+
url: context.url
18+
},
19+
template: `<div>The visited URL is: {{ url }}</div>`
20+
})
21+
}
22+
```
23+
24+
そして私たちのサーバーコードはこうなります:
25+
26+
```js
27+
// server.js
28+
const createApp = require('./app')
29+
server.get('*', (req, res) => {
30+
const context = { url: req.url }
31+
const app = createApp(context)
32+
renderer.renderToString(app, (err, html) => {
33+
// エラーをハンドリングします
34+
res.end(html)
35+
})
36+
})
37+
```
38+
39+
同じルールがルータ、ストア、イベントバスのインスタンスに適用されます。モジュールから直接エクスポートしアプリケーションにインポートするのでは無く、 `createApp` で新しいインスタンスを作成し、ルート Vue インスタンスから注入する必要があります。
40+
41+
> `{ runInNewContext: true }` でバンドルレンダラを使用するとき、その制約を取り除くことが可能です。しかし各リクエストに対して新しい VM コンテキストを作成する必要があるため、いくらか重大なパフォーマンスコストがかかります。
42+
43+
## ビルドステップの紹介
44+
45+
これまでは、同じ Vue アプリケーションをクライアントへ配信する方法を論じてはいませんでした。これを行うには、webpack を使用して Vue アプリケーションをバンドルする必要があります。実際、webpack を使用して Vue アプリケーションをサーバーにバンドルしたいと思っているのはおそらく次の理由によるものです。
46+
47+
- 典型的な Vue アプリケーションは webpack と `vue-loader` によってビルドされ、 `file-loader` 経由でのファイルのインポートや`css-loader` 経由でCSSをインポートなどの多くの webpack 固有の機能は Node.jsで直接動作しません。
48+
- Node.jsの最新バージョンはES2015の機能を完全にサポートしていますが、古いブラウザに対応するためにクライアントサイドのコードをトランスパイルする必要があります。これはビルドステップにも再び関係します。
49+
50+
従って基本的な考え方は webpack を使用してクライアントとサーバー両方をバンドルすることです。サーバーバンドルはサーバーによって SSR のために要求され、クライアントバンドルは静的なマークアップのためにブラウザに送信されます。
51+
52+
![architecture](https://cloud.githubusercontent.com/assets/499550/17607895/786a415a-5fee-11e6-9c11-45a2cfdf085c.png)
53+
54+
セットアップの詳細については次のセクションで議論されます。今のところ、ビルドのセットアップが分かっていると仮定すると、webpack を有効にして Vue アプリケーションコードを書くことが可能になっています。
55+
56+
## Webpackによるコード構造
57+
58+
webpack を使用してサーバーとクライアントのアプリケーションを処理しているので、ソースコードの大部分はユニバーサルに書かれており、すべての webpack の機能にアクセスできます。 同時に、ユニバーサルなコードを書くときに留意すべき[いくつかあります。](./universal.md)
59+
60+
シンプルなプロジェクトは以下のようになります:
61+
62+
```bash
63+
src
64+
├── components
65+
│   ├── Foo.vue
66+
│   ├── Bar.vue
67+
│   └── Baz.vue
68+
├── App.vue
69+
├── app.js # 共通のエントリ
70+
├── entry-client.js # ブラウザでのみ実行されます
71+
└── entry-server.js # サーバでのみ実行されます
72+
```
73+
74+
### `app.js`
75+
76+
`app.js` はアプリケーションのユニバーサルエントリーです。クライアントアプリケーションでは、このファイルにルート Vue インスタンスを作成し、DOM に直接マウントします。しかし、SSRの場合は責務はクライアント専用のエントリファイルに映されます。`app.js` はシンプルに `createApp` 関数をエクスポートします:
77+
78+
```js
79+
import Vue from 'vue'
80+
import App from './App.vue'
81+
// 新しいアプリケーション・ルータ・ストアを作成するためのファクトリ関数をエクスポートします
82+
// インスタンス
83+
export function createApp () {
84+
const app = new Vue({
85+
// ルートインスタンスは単にAppコンポーネントをレンダリングします
86+
render: h => h(App)
87+
})
88+
return { app }
89+
}
90+
```
91+
92+
### `entry-client.js`:
93+
94+
クライアントエントリは単にアプリケーションを作成しそれをDOMにマウントします:
95+
96+
```js
97+
import { createApp } from './app'
98+
// クライアント固有の初期化ロジック
99+
const { app } = createApp()
100+
// これは App.vue テンプレートのルート要素が id="app" だからです。
101+
app.$mount('#app')
102+
```
103+
104+
### `entry-server.js`:
105+
106+
サーバーエントリはレンダリングごとに繰り返し呼び出すことができる関数をデフォルトでエクスポートします。現時点では、アプリケーションインスタンスを作成して返す以外のことはほとんど行いませんが、後でサーバーサイドのルートマッチングとデータプリフェッチロジックを実行します。
107+
108+
```js
109+
import { createApp } from './app'
110+
export default context => {
111+
const { app } = createApp()
112+
return app
113+
}
114+
```

0 commit comments

Comments
 (0)