Viteスキャフォールド: JS と TS

次のコマンドを実行する: npm create vite@latest 。次のオプションを選ぶ。

  1. Vanilla, JavaScript
  2. Vanilla, TypeScript

PowerShellのデフォルトだと、画面の文字が一部読めない。wt とか cmd.exe がいいかも。JavaScript と TypeScript の場合で比較してみる。

package.json
{
  "name": "vite-project-vanilla-js",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "devDependencies": {
    "vite": "^3.2.0"
  }
}
{
  "name": "vite-project-vanilla-ts",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "preview": "vite preview"
  },
  "devDependencies": {
    "typescript": "^4.6.4",
    "vite": "^3.2.0"
  }
}

違いは:

  1. TypeScriptプロジェクトの開発ツールに typescript (そりゃそうだ)
  2. npm run の build コマンドに "tsc &&" が先行する。つまり、ビルド時に tsc コンパイルを走らせる。
  3. その他は特に変わりない。
ディレクトリ構造
|   .gitignore
|   package.json
|   index.html
|   counter.js *
|   main.js *
|   style.css *
|   javascript.svg *
|
\---public
        vite.svg
|   .gitignore
|   package.json
|   index.html
|   tsconfig.json
|
+---public
|       vite.svg
|
\---src
        counter.ts
        main.ts
        style.css
        typescript.svg
        vite-env.d.ts

違いは:

  1. JavaScriptプロジェクトディレクトリ直下に平板に置かれていたソースファイル(アスタリスク付き)が、TypeScriptプロジェクトでは src に移っている。
  2. index.html はどちらもディレクトリ直下。
tsconfig.json

TypeScriptプロジェクトでは、tsconfig.json も生成される。

{
  "compilerOptions": {
    "target": "ESNext",
    "useDefineForClassFields": true,
    "module": "ESNext",
    "lib": ["ESNext", "DOM"],
    "moduleResolution": "Node",
    "strict": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "esModuleInterop": true,
    "noEmit": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true,
    "skipLibCheck": true
  },
  "include": ["src"]
}
  • "noEmit": true なのでトランスパイル結果は出力されない。tsc はチェック用で、変換自体は vite(から呼ばれる esbuild in Go-lang)がするのだろう。
  • "lib": ["ESNext", "DOM"] があるので、ライブラリのインストールが必要になるかも知れない。npm insall やれば済んでしまうだろうが。
  • "include": ["src"] で src/ サブディレクトリを見る設定になっている。
JavaScriptプロジェクトについて
  1. "type" : "module" 指定があるので、すべてのjsファイルはモジュールファイルとみなされる。
  2. サブディレクトリは不要で、すべてのファイルをフラットに置いても問題ない。
  3. バンドラーの出力は ./dist/ の下に置かれる。
  4. 必要なツールはviteのみである。(素晴らしい!)
  5. viteをグローバルインストールしていても問題ない。ローカル(プロジェクト内)の node_module/ は空でもよい。
  6. が、グローバルインストールで問題が生じる可能性は残るので、ローカルインストールのほうが安全だろう。ローカルインストールは、以下のスキャフォールド終了時メッセージに従う。
Done. Now run:

  cd vite-project-XXX
  npm install
  npm run dev

NPMスクリプトコマンド:

  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  1. vite をグローバルインストールしてあれば、npm run を省略できる。
  2. vite で開発サーバーが上がる。
  3. vite build でバンドラー/ビルダーが動く。
  4. vite preview でプレビューサーバーが上がる。
TypeScriptプロジェクトについて

グローバルインストールの vite, tsc だと次のエラーが出た。

vite-project-vanilla-ts > tsc
src/main.ts:2:28 - error TS2307: Cannot find module './typescript.svg' or its corresponding type declarations.

2 import typescriptLogo from './typescript.svg'
                             ~~~~~~~~~~~~~~~~~~

viteに付属の型定義ファイルnode_modules/vite/client.d.ts を src/ にコピーすると、tsc は問題なく通るようになた。

これ以上は未調査、後日。