|
| 1 | +# 実運用への展開 |
| 2 | + |
| 3 | +::: info |
| 4 | +以下のヒントのほとんどは、 [Vue CLI](https://cli.vuejs.org) を使っている場合、デフォルトで有効になっています。このセクションは、カスタムビルドのセットアップを使っている場合にのみ関連します。 |
| 5 | +::: |
| 6 | + |
| 7 | +## プロダクションモードをオンにする |
| 8 | + |
| 9 | +開発中、 Vue は一般的なエラーや落とし穴に役立つたくさんの警告を提供しています。しかし、これらの警告文は実運用では役に立たず、アプリケーションのペイロードの大きさを肥大化させてしまいます。 さらに、これらの警告チェックの中には、 [プロダクションモード](https://cli.vuejs.org/guide/mode-and-env.html#modes) では避けることのできる小さなランタイムコストがあります。 |
| 10 | + |
| 11 | +### ビルドツールなし |
| 12 | + |
| 13 | +フルビルドを使う場合、つまりビルドツールを使わずに script タグで Vue を直接含める場合は、必ず 縮小バージョン (minified version:コードが小さくされたバージョン) を本番で使ってください。これは、 [インストールガイド](/guide/installation.html#cdn) に記載されています。 |
| 14 | + |
| 15 | +### ビルドツールあり |
| 16 | + |
| 17 | +Webpack や Browserify などのビルドツールを使う場合は、プロダクションモードは Vue のソースコード内の `process.env.NODE_ENV` で決定され、デフォルトでは開発モードになります。どちらのビルドツールも、 Vue のプロダクションモードを有効にするために、この変数を上書きする方法を提供しており、警告はビルド中に Minifier (圧縮・軽量化) によって取り除かれます。Vue CLI では事前設定されていますが、どのように行われているか知っておくことはよいでしょう: |
| 18 | + |
| 19 | +#### Webpack |
| 20 | + |
| 21 | +Webpack 4+ では、 `mode` オプションを使えます: |
| 22 | + |
| 23 | +```js |
| 24 | +module.exports = { |
| 25 | + mode: 'production' |
| 26 | +} |
| 27 | +``` |
| 28 | + |
| 29 | +#### Browserify |
| 30 | + |
| 31 | +- 実際の `NODE_ENV` 環境変数に `"production"` を設定して、バンドルコマンドを実行してください。これは `vueify` にホットリロードや開発関連のコードを含まないように指示します。 |
| 32 | + |
| 33 | +- バンドルにグローバルな [envify](https://github.com/hughsk/envify) の変換を適用します。これにより、 Minifier は環境変数の条件ブロックに含まれた Vue のソースコードのすべての警告を取り除くことができます。例えば: |
| 34 | + |
| 35 | + ```bash |
| 36 | + NODE_ENV=production browserify -g envify -e main.js | uglifyjs -c -m > build.js |
| 37 | + ``` |
| 38 | + |
| 39 | +- または、 [envify](https://github.com/hughsk/envify) を Gulp で使うと: |
| 40 | + |
| 41 | + ```js |
| 42 | + // envify のカスタムモジュールで環境変数を指定 |
| 43 | + const envify = require('envify/custom') |
| 44 | + |
| 45 | + browserify(browserifyOptions) |
| 46 | + .transform(vueify) |
| 47 | + .transform( |
| 48 | + // node_modules ファイルを処理するために必要 |
| 49 | + { global: true }, |
| 50 | + envify({ NODE_ENV: 'production' }) |
| 51 | + ) |
| 52 | + .bundle() |
| 53 | + ``` |
| 54 | + |
| 55 | +- または、 [envify](https://github.com/hughsk/envify) を Grunt と [grunt-browserify](https://github.com/jmreidy/grunt-browserify) で使うと: |
| 56 | + |
| 57 | + ```js |
| 58 | + // envify のカスタムモジュールで環境変数を指定 |
| 59 | + const envify = require('envify/custom') |
| 60 | + |
| 61 | + browserify: { |
| 62 | + dist: { |
| 63 | + options: { |
| 64 | + // grunt-browserify のデフォルトの順序からはずれる関数 |
| 65 | + configure: (b) => |
| 66 | + b |
| 67 | + .transform('vueify') |
| 68 | + .transform( |
| 69 | + // node_modules ファイルを処理するために必要 |
| 70 | + { global: true }, |
| 71 | + envify({ NODE_ENV: 'production' }) |
| 72 | + ) |
| 73 | + .bundle() |
| 74 | + } |
| 75 | + } |
| 76 | + } |
| 77 | + ``` |
| 78 | + |
| 79 | +#### Rollup |
| 80 | + |
| 81 | +[@rollup/plugin-replace](https://github.com/rollup/plugins/tree/master/packages/replace) を使ってください: |
| 82 | + |
| 83 | +```js |
| 84 | +const replace = require('@rollup/plugin-replace') |
| 85 | + |
| 86 | +rollup({ |
| 87 | + // ... |
| 88 | + plugins: [ |
| 89 | + replace({ |
| 90 | + 'process.env.NODE_ENV': JSON.stringify( 'production' ) |
| 91 | + }) |
| 92 | + ] |
| 93 | +}).then(...) |
| 94 | +``` |
| 95 | + |
| 96 | +## テンプレートのプリコンパイル |
| 97 | + |
| 98 | +DOM 内のテンプレートや、 JavaScript 内のテンプレートリテラルを使う場合、テンプレートからレンダリング関数へのコンパイルは実行時に行われます。ほとんどの場合、この方法で十分な速度が得られますが、アプリケーションがパフォーマンスを重視される場合は避けたほうがよいです。 |
| 99 | + |
| 100 | +テンプレートをプリコンパイルする最も簡単な方法は、 [単一ファイルコンポーネント](/guide/single-file-component.html) を使うことです。これは関連するビルドセットアップが自動的にプリコンパイルを行います。これにより、ビルドされたコードは生のテンプレート文字列ではなく、すでにコンパイルされたレンダリング関数が含まれることになります。 |
| 101 | + |
| 102 | +Webpack を使っていて、 JavaScript とテンプレートファイルを分離したい場合は、 [vue-template-loader](https://github.com/ktsn/vue-template-loader) を使うと、ビルドステップでテンプレートファイルを JavaScript のレンダリング関数に変換することもできます。 |
| 103 | + |
| 104 | +## コンポーネントの CSS を抽出 |
| 105 | + |
| 106 | +単一ファイルコンポーネントを使う場合、コンポーネント内の CSS は JavaScript を介して `<style>` タグとして動的に差し込まれます。これにはわずかなランタイムコストがかかります。また、サーバーサイドレンダリングを使っている場合は、「瞬間的にスタイルのないコンテンツ」を引き起こします。同じファイルにすべてのコンポーネントの CSS を抽出することで、このような問題を回避して、よりよい CSS の最小化やキャッシュ化をすることができます。 |
| 107 | + |
| 108 | +その方法については、各ビルドツールのドキュメントを参照してください: |
| 109 | + |
| 110 | +- [Webpack + vue-loader](https://vue-loader.vuejs.org/en/configurations/extract-css.html) (`vue-cli` の Webpack テンプレートには、これがあらかじめ設定されています) |
| 111 | +- [Browserify + vueify](https://github.com/vuejs/vueify#css-extraction) |
| 112 | +- [Rollup + rollup-plugin-vue](https://rollup-plugin-vue.vuejs.org/) |
| 113 | + |
| 114 | +## ランタイムエラーの追跡 |
| 115 | + |
| 116 | +コンポーネントのレンダリング中にランタイムエラーが発生した場合、グローバルの `app.config.errorHandler` に設定した関数があれば、それに渡されます。Vue の [公式インテグレーション](https://sentry.io/for/vue/) を提供している [Sentry](https://sentry.io) のようなエラー追跡サービスと一緒にこのフックを活用するのはよいアイデアかもしれません。 |
0 commit comments