Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: migration from v2 guide #474

Merged
merged 5 commits into from
Jun 18, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .vitepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ export default defineConfig({
link: '/guide/comparisons'
},
{
text: 'v1 からの移行',
text: 'v2 からの移行',
link: '/guide/migration'
}
]
Expand Down
174 changes: 77 additions & 97 deletions guide/migration.md
Original file line number Diff line number Diff line change
@@ -1,133 +1,113 @@
# v1 からの移行
# v2 からの移行

## 設定オプションの変更
## Node サポート

- 以下のオプションは削除されましたので、[プラグイン](./api-plugin)で実装してください:
EOL となった Node v12 はサポートされなくなりました。今後は Node 14.6+ が必要です。

- `resolvers`
- `transforms`
- `indexHtmlTransforms`
## モダンブラウザ基準の変更

- `jsx` と `enableEsbuild` は削除されました。代わりに新しい [`esbuild`](/config/#esbuild) オプションを使ってください。
本番バンドルではモダンな JavaScript のサポートを前提としています。Vite はデフォルトでは [native ES Modules](https://caniuse.com/es6-module) および [native ESM dynamic import](https://caniuse.com/es6-module-dynamic-import) および [`import.meta`](https://caniuse.com/mdn-javascript_statements_import_meta) をサポートするブラウザを対象としています:

- [CSS 関連のオプション](/config/#css-modules)は `css` の下に移動しました。
- Chrome >=87
- Firefox >=78
- Safari >=13
- Edge >=88

- すべての[ビルドオプション](/config/#ビルドオプション)は `build` の下に移動しました
ごく少数のユーザーは、自動的にレガシーチャンクとそれに対応する ES 言語機能 Polyfill を生成する [@vitejs/plugin-legacy](https://github.com/vitejs/vite/tree/main/packages/plugin-legacy) を使う必要が出てくるでしょう

- `rollupInputOptions` と `rollupOutputOptions` は [`build.rollupOptions`](/config/#build-rollupoptions) に置き換えられました。
- `esbuildTarget` は [`build.target`](/config/#build-target) になりました。
- `emitManifest` は [`build.manifest`](/config/#build-manifest) になりました。
- 以下のビルドオプションは、プラグインフックや他のオプションで実現できるため、削除されました:
- `entry`
- `rollupDedupe`
- `emitAssets`
- `emitIndex`
- `shouldPreload`
- `configureBuild`
## 設定オプションの変更

- すべての[サーバオプション](/config/#サーバオプション)は、`server` の下に移動しました。
- v2 にて非推奨となっていた以下のオプションは削除されました:

- `alias` ([`resolve.alias`](../config/shared-options.md#resolvealias) に置き換え)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このあたりのリンクですが、vitejs/vite@5791f5d (#451) に依存していたため、今のところはそのままにしてあります

- `dedupe` ([`resolve.dedupe`](../config/shared-options.md#resolvededupe) に置き換え)
- `build.base` ([`base`](../config/shared-options.md#base) に置き換え)
- `build.brotliSize` ([`build.reportCompressedSize`](../config/build-options.md#build-reportcompressedsize) に置き換え)
- `build.cleanCssOptions` (Vite は、現在では esbuild を CSS のミニファイに利用します)
- `build.polyfillDynamicImport` (dynamic import をサポートしていないブラウザのためには [`@vitejs/plugin-legacy`](https://github.com/vitejs/vite/tree/main/packages/plugin-legacy) を利用してください)
- `optimizeDeps.keepNames` ([`optimizeDeps.esbuildOptions.keepNames`](../config/dep-optimization-options.md#optimizedepsesbuildoptions) に置き換え)

- `hostname` は [`server.host`](/config/#server-host) になりました。
- `httpsOptions` は削除されました。[`server.https`](/config/#server-https) はオプションオブジェクトを直接受け取ることができます。
- `chokidarWatchOptions` は [`server.watch`](/config/#server-watch) になりました。
## 開発サーバでの変更

- [`assetsInclude`](/config/#assetsinclude) が、関数ではなく、`string | RegExp | (string | RegExp)[]` を想定するようになりました
Vite の開発サーバのデフォルトポートが 5173 に変更されました。[`server.port`](../config/server-options.md#server-port) を利用することで 3000 に変更できます

- すべての Vue 固有のオプションは削除され、代わりに Vue プラグインにオプションを渡します
Vite は、CJS のみ提供されている依存関係を ESM に変換するため、また、ブラウザがリクエストする必要のあるモジュールの数を減らすため、依存関係を esbuild で最適化します。v3 では、依存関係を発見しバッチ処理する戦略が変更されました。Vite はコールドスタート時に依存関係のリストを取得するために、ユーザのコードを esbuild で事前スキャンしていました。その代わりに、すべてのインポートされたユーザのモジュールが読み込まれるまで、最初の依存関係の最適化の実行を遅延するようになりました

## Alias の動作変更
v2 の戦略に戻すには、[`optimizeDeps.devScan`](../config/dep-optimization-options.md#optimizedepsdevscan) が利用できます。

[`alias`](/config/#resolve-alias) が `@rollup/plugin-alias` に渡されるようになり、開始/終了のスラッシュが不要になりました。この動作は直接置換するようになったので、1.0 スタイルのディレクトリエイリアスキーから終了のスラッシュを削除する必要があります:
## ビルドでの変更

```diff
- alias: { '/@foo/': path.resolve(__dirname, 'some-special-dir') }
+ alias: { '/@foo': path.resolve(__dirname, 'some-special-dir') }
```
v3 では、Vite はデフォルトで esbuild を利用して依存関係を最適化します。これにより、v2 に存在していた開発環境と本番環境との最も大きな違いを取り除けます。esbuild が CJS のみ提供されている依存関係を ESM に変換するため、[`@rollupjs/plugin-commonjs`](https://github.com/rollup/plugins/tree/master/packages/commonjs) は使われなくなりました。

また、`[{ find: RegExp, replacement: string }]` というオプション形式を使えば、より精密な制御が可能です
v2 の戦略に戻す必要がある場合は、[`optimizeDeps.disabled: 'build'`](../config/dep-optimization-options.md#optimizedepsdisabled) が利用できます

## Vue サポート
## SSRでの変更

Vite 2.0 のコアはフレームワークに依存しないようになりました。Vue のサポートは、[`@vitejs/plugin-vue`](https://github.com/vitejs/vite/tree/main/packages/plugin-vue) を通じて提供されるようになりました。これをインストールして、Vite の設定に追加してください:
Vite の v3 では、SSR のビルドにデフォルトで ESM を利用するようになりました。ESM を利用する際には、[SSRでのヒューリスティックな方法による外部化](../guide/ssr.md#ssr-externals)が不要になりました。デフォルトでは、すべての依存関係が外部化されます。[`ssr.noExternal`](../config/ssr-options.md#ssrnoexternal) を利用してどの依存関係を SSR バンドルに含めるかコントロールできます。

```js
import vue from '@vitejs/plugin-vue'
import { defineConfig } from 'vite'
SSR において ESM を利用することが不可能な場合、`ssr.format: 'cjs'` を設定することで CJS バンドルを生成できます。この場合では Vite の v2 と同じ外部化戦略が利用されます。

export default defineConfig({
plugins: [vue()]
})
```
## 全般的な変更

### カスタムブロックの変換

カスタムプラグインを使用すると、以下のように Vue のカスタムブロックを変換することができます:

```ts
// vite.config.js
import vue from '@vitejs/plugin-vue'
import { defineConfig } from 'vite'

const vueI18nPlugin = {
name: 'vue-i18n',
transform(code, id) {
if (!/vue&type=i18n/.test(id)) {
return
}
if (/\.ya?ml$/.test(id)) {
code = JSON.stringify(require('js-yaml').load(code.trim()))
}
return `export default Comp => {
Comp.i18n = ${code}
}`
}
}
- SSR とライブラリモードで、ファイル形式やパッケージの形式によって、出力した JS のエントリとチャンクの拡張子として有効なもの (`js`, `mjs`, or `cjs`) が選択されるようになりました。

export default defineConfig({
plugins: [vue(), vueI18nPlugin]
})
```
### `import.meta.glob`

## React サポート
- [`raw` での `import.meta.glob`](features.md#glob-import-as) は、記法が `{ assert: { type: 'raw' }}` から `{ as: 'raw' }` に変更されました
- `import.meta.glob` のキーは現在のモジュールから相対的になりました

React Fast Refresh のサポートは、[`@vitejs/plugin-react`](https://github.com/vitejs/vite/tree/main/packages/plugin-react) で提供されるようになりました。
```diff
// ファイル: /foo/index.js
const modules = import.meta.glob('../foo/*.js')

## HMR API の変更
// 変換後:
const modules = {
- '../foo/bar.js': () => {}
+ './bar.js': () => {}
}
```

`import.meta.hot.acceptDeps()` は非推奨となりました。[`import.meta.hot.accept()`](./api-hmr#hot-accept-deps-cb) は、単一または複数の依存関係を受け入れることができるようになりました。
- `import.meta.glob` でエイリアスを利用した際には、キーは常に絶対的です
- `import.meta.globEager` は非推奨になりました。`import.meta.glob('*', { eager: true })` を代わりに利用してください。

## マニフェストフォーマットの変更
### WebAssembly サポート

ビルドマニフェストが以下のフォーマットになりました:
`import init from 'example.wasm'` の記法は、[WebAssembly の ES モジュール統合の提案](https://github.com/WebAssembly/esm-integration) との将来的な衝突を避けるため、廃止されました。
以前の挙動に似た `?init` を利用できます。

```json
{
"index.js": {
"file": "assets/index.acaf2b48.js",
"imports": [...]
},
"index.css": {
"file": "assets/index.7b7dbd85.css"
}
"asset.png": {
"file": "assets/asset.0ab0f9cd.png"
}
}
```diff
-import init from 'example.wasm'
+import init from 'example.wasm?init'

-init().then((instance) => {
+init().then(({ exports }) => {
exports.test()
})
```

エントリ JS チャンクについては、インポートされたチャンクもリストアップされ、プリロードディレクティブのレンダリングに使用できます。
## 高度な機能

プラグイン・ツール製作者のみに影響のある変更がいくつかあります。

## プラグイン作成者向け
- [[#5868] refactor: remove deprecated api for 3.0](https://github.com/vitejs/vite/pull/5868)
- `printHttpServerUrls` は削除されました
- `server.app`、`server.transformWithEsbuild` は削除されました
- `import.meta.hot.acceptDeps` は削除されました
- [[#7995] chore: do not fixStacktrace](https://github.com/vitejs/vite/pull/7995)
- `ssrLoadModule` の `fixStacktrace` オプションのデフォルトは、`false` に変更されました
- [[#8178] feat!: migrate to ESM](https://github.com/vitejs/vite/pull/8178)
- `formatPostcssSourceMap` は非同期になりました
- `resolvePackageEntry`、`resolvePackageData` は CJS ビルドから利用できなくなりました (CJS で利用するためには dynamic import が必要です)

Vite 2 は、Rollup プラグインを拡張し完全に再設計されたプラグインインタフェイスとなっています。新しい[プラグイン開発ガイド](./api-plugin)をお読みください
また、少数のユーザーにしか影響のない破壊的変更があります

v1 プラグインを v2 に移行する際の一般的なポイントです:
- [[#5018] feat: enable `generatedCode: 'es2015'` for rollup build](https://github.com/vitejs/vite/pull/5018)
- ユーザのコードが ES5 のみしか含んでいない場合でも ES5 へのトランスパイルが必要になりました。
- [[#7877] fix: vite client types](https://github.com/vitejs/vite/pull/7877)
- `/// <reference lib="dom" />` が `vite/client.d.ts` から削除されました。`tsconfig` で `{ "lib": ["dom"] }` または `{ "lib": ["webworker"] }` が必須になりました。
- [[#8280] feat: non-blocking esbuild optimization at build time](https://github.com/vitejs/vite/pull/8280)
- `force` オプションが追加されたため、`server.force` が削除されました。

- `resolvers` -> [`resolveId`](https://rollupjs.org/guide/en/#resolveid) フックを使ってください。
- `transforms` -> [`transform`](https://rollupjs.org/guide/en/#transform) フックを使ってください。
- `indexHtmlTransforms` -> [`transformIndexHtml`](./api-plugin#transformindexhtml) フックを使ってください。
- 仮想ファイルの配信 -> [`resolveId`](https://rollupjs.org/guide/en/#resolveid) + [`load`](https://rollupjs.org/guide/en/#load) フックを使ってください。
- `alias`、`define`、その他の設定オプションの追加 -> [`config`](./api-plugin#config) フックを使用してください。
## v1 からの移行

ロジックのほとんどはミドルウェアではなくプラグインのフックを介して行われるべきなので、ミドルウェアの必要性は大幅に減少しています。内部のサーバアプリは、Koa から古き良き [connect](https://github.com/senchalabs/connect) のインスタンスに変わりました
先に Vite の v2 のドキュメントの [v1 からの移行](https://v2.vitejs.dev/guide/migration.html) を確認して、Vite v2 への移行に必要な変更を見てから、このページの変更の適用に移ってください
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

レビューありがとうございます!
失念していたのですが、こちらの https://v2.vitejs.dev/ の日本語版はどうなる予定でしょうか? (現在は英語版へのリンクになっています)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ありがとうございます
他の管理者の方に確認してみます!