11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Vite 2 + TypeScript で @/ のようなパスエイリアスを使いたい

Last updated at Posted at 2021-01-27

注意: vite 2 はまだ beta版なので,公式ページ にて最新の情報をチェックしてください.
記事作成時点での最新バージョンは 2.0.0-beta.50 です.
記事更新時点での最新バージョンは 2.1.3 です.

概要

  1. Vite 入門
  2. Vite 2 + TypeScriptimport '@/hoge' のようなパスエイリアスを使いたい

Vite とは

Vue.js 作者の Evan You が夜中に思いついたアイデアをうっかり朝までに完成させてしまったフロントエンドビルドツール1

ホットリロード(HMR)がめちゃくちゃ速いことで有名で,ついでにビルドも esbuild 並に高速23(というかビルドは内部で esbuild rollup を使っているのでそれはそう)

他にも,Lazy Components のコード分割にデフォルトで対応していたり,vue-cli に代わって「Vue ならとりあえずこれ」感が出てきています.
それだけでなく,React もこれでいいかもしれません.

Vite を使う以前は vue-cli に不満などありませんでしたが,一度 Vite の HMR を体感してしまった今となっては,webpack には戻れないと感じています.

公式サイト:https://vitejs.dev

Vite init

まずプロジェクトテンプレート4 のインストールです

npm init @vitejs/app --template vue-ts  your-project-name

# Or

yarn create @vitejs/app --template vue-ts your-project-name

VSCode の設定

拡張機能を入れます

(2021年3月29日 編集) VueDX が使われなくなり(ac04ebe)型チェックには代わりに vue-tsc を用いるようになっていました(b3b3c01
またそれに伴い,vue-tsc がデフォルトの TypeScript server になっている VSCode 拡張 Volar が Vetur と並んで推奨されるようになりました(79dd32c

Volar は Vetur より軽快な感じがしますが,vue-tsc の型チェックはおよそ 10秒ほどで特に vuedx-typecheck との差は感じませんでした.

.vscode/extensions.json
 {
   "recommendations": [
-    "octref.vetur",
-    "znck.vue-language-features"
+    "johnsoncodehk.volar"
   ],
+  "unwantedRecommendations": [
+    "octref.vetur",
+    "znck.vue-language-features"
+  ]  
 }

TypeScript の設定

tsconfig.json を少しだけ書き換えます.

特に esModuleInterop は設定推奨です.React を使うとき特に便利です.
(参考:https://www.typescriptlang.org/ja/tsconfig#esModuleInterop

tsconfig.json
 {
   "compilerOptions": {
     "target": "esnext",
     "module": "esnext",
     "moduleResolution": "node",
+    "esModuleInterop": true,
+    "resolveJsonModule": true,
+    "newLine": "lf",
     "strict": true,
     "jsx": "preserve",
     "sourceMap": true,
     "lib": ["esnext", "dom"],
     "types": ["vite/client"],
-    "plugins": [{ "name": "@vuedx/typescript-plugin-vue" }]
   },
   "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
+  "exclude": ["node_modules"]
 }

パスエイリアスの設定

本題.

@/ から始まるパスを ./src/ のエイリアスとして設定する

つまり
import HelloWorld from '../../components/HelloWorld.vue'
// って書くより
import HelloWorld from '@/components/HelloWorld.vue'
// って書きたい!

まず TypeScript の方にエイリアスを設定します.
(参考:https://www.typescriptlang.org/ja/tsconfig#paths

これで,*.vue(や *.tsx)ファイルではエイリアスが効くようになります.

tsconfig.json
 {
   "compilerOptions": {
-    "root": true,
+    "baseUrl": "./",
+    "paths": {
+      "@/*": ["src/*"],
+      // 追加するならこんな感じ。@ はじまりでなくても良い
+      // "c/*": ["src/components/*"]
+    },
     "target": "esnext",
     "module": "esnext",

次に Vite の方に設定します.
(参考:https://vitejs.dev/config/#alias

これで src/main.ts などでもエイリアスが効くようになります (*' '*)

vite.config.ts
 import { defineConfig } from 'vite'
 import vue from '@vitejs/plugin-vue'
 
 export default defineConfig({
+  alias: [
+    {
+      find: '@/',
+      replacement: `./src/`
+    },
+    // {
+    //   find: 'c/',
+    //   replacement: `./src/components/`
+    // }
+  ],
   plugins: [vue()]
 })

おまけ(ESLint ルールで矯正する)

せっかく @/* で書けるようになったのに,それに気づかずに相対パスで書いてしまう人もいるかもしれません.ESLint ルールでパスエイリアスを使うように強制(矯正)してしまいましょう.

まずは ESLint のインストールです.
以下のコマンドで設定まで含めてインタラクティブにやってくれます.

まずはeslintをインストール
npm i -D eslint
# Or
# yarn add -D eslint
npx eslint --init
# Or
# yarn eslint --init

そして,無限ループ等が起こらないように ignorePatterns を設定します.
(参考:nuxt-ts のビルドが終わらない or 重い - Qiita @u-sho

.eslintrc.json
 {
+  "ignorePatterns": [
+    ".git",
+    "node_modules",
+    "dist",
+    "package-lock.json",
+    "yarn.lock.json"
+  ],
+
   "root": "true",
   "parser": "vue-eslint-parser",

続いてルールの設定です.
(参考:https://eslint.org/docs/rules/no-restricted-imports

.eslintrc.json
   "extends": [
     "eslint:recommended",
     "plugin:vue/vue3-recommended",
     "@vue/typescript"
   ],
   "rules": {
+    "no-restricted-imports": [
+      "error",
+      {
+        "patterns": [
+          "../*",
+          "./assets/*",
+          "./components/*",
+          // "@/components/*",
+          "./pages/*"
+        ]
+      }
+    ],

これで

import HelloWorld from '../../components/HelloWorld.vue'

はエラーを吐くようになりました.

まとめ

以下をよく読みましょう.

  1. Vue に特化しているが,React や Svelte などでも使える(そして速い)

  2. esbuild は webpack の 100倍とか 200倍速いと言われている.実測は 数10倍程度であることが知られているが,まあ速い

  3. 型チェック機能がないので,それを含めると vue-cli と同じくらい.手元の環境だと,vuedx-typecheck が 10秒,ビルドが 3秒程度だった.vue-cli だと 12秒程度.

  4. この記事では Vue を使いますが、React / preact や Svelte のテンプレートもあります.

11
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?