新規作成したQwikプロジェクトの設定を整理してみた

新規作成したQwikプロジェクトの設定を整理してみた

2026.01.05

こんにちは。クラウド事業本部の桑野です。
前回の記事でQwikプロジェクトの新規作成について動作確認をしました。
今回は新しいプロジェクトを始める際に、リンターやフォーマッターなどの開発環境の設定周りを見ていきつつ、ほんの少しだけカスタマイズしてみたという話を共有します。

https://dev.classmethod.jp/articles/qwik-create-project/

前提

前回の記事同様、下記の条件で検証しています。

  • OS:macOS Sequoia バージョン 15.6.1
  • チップ:Apple M4
  • Docker Client:28.4.0
  • Docker Server:28.3.3
  • Colima:0.8.4
  • docker compose:2.39.3

Colimaを使ったDocker環境の構築手順については以下の記事をご参照ください。
「手順」と「実践編」の1の手順を実施し、docker環境とdocker composeが使えるようになっていれば準備OKです。

https://dev.classmethod.jp/articles/colima-docker-terraform/

事前準備

1. コンテナへのアクセス

リポジトリルートで以下のコマンドを実行します。

docker compose up -d

コンテナが起動したら、frontendというコンテナにアクセスします。

2. 新規プロジェクトの作成

以下のコマンドを実行していきます。

cd /typescript
pnpm create qwik@latest

ウィザードに従って入力していきます。

Where would you like to create your new project? (Use '.' or './' for current directory)

Q. プロジェクトをどこに作成しますか?
A. /frontend/typescript/qwik-appに作成します(以下を入力する)

./qwik-app

Select a starter

Q. どの用途で始めますか?
A. 空のアプリで始めます(以下を選択する)

Empty App (Qwik City + Qwik)

Would you like to install pnpm dependencies?

Q. pnpmの依存関係をインストールしますか?
A. します(以下を選択する)

Yes

Initialize a new git repository?

Q. gitリポジトリを新しく作成しますか?
A. しません(以下を選択する)

No

Finishing the install. Wanna hear a joke?

Q. ジョークを聞きたいですか?
A. どちらでも良いです(Yes or No好きな方を選んでください)

コマンドの詳細については本記事の上部に配置している、前回の記事をご参照ください。

セットアップ

package.jsonを確認すると、ESLint(リンター)とPrettier(フォーマッター)がすでに含まれている状態でした。

{
  ...
  "devDependencies": {
    "@builder.io/qwik": "^1.17.2",
    "@builder.io/qwik-city": "^1.17.2",
    "@eslint/js": "latest",
    "@types/node": "20.19.0",
    "eslint": "9.32.0",
    "eslint-plugin-qwik": "^1.17.2",
    "globals": "16.4.0",
    "prettier": "3.6.2",
    "typescript": "5.4.5",
    "typescript-eslint": "8.38.0",
    "typescript-plugin-css-modules": "latest",
    "undici": "*",
    "vite": "7.1.11",
    "vite-tsconfig-paths": "^4.2.1"
  }
}

eslint.config.jsが用意されているため、リンターのルールには目を通しておいた方が良さそうです。
prettier.config.jsは用意されていないため、Prettierについてはデフォルト設定で十分ということかなと考えています。

さらに、プロジェクト内に.vscodeディレクトリも用意されており、VSCodeで開発をする際の便利な設定も標準で備えているようです。
元々コンテナワークスペースに私好みの設定を配置しているため、良い感じにマージしていこうと思います。

変更した内容は以下のリポジトリに載せてあります。

https://github.com/k-kuwan0/qwik-study/tree/v0.2.1

Prettierの設定を行う

Prettierはプロジェクト作成時には用意されていなかったため、デフォルト設定となります。
もしもカスタムしたい場合は、prettier.config.jsを作成します。

Prettierの設定内容については下記に載っています。
https://prettier.io/docs/options.html

元々私が使っていた設定ファイルを持ち込んでいました。
ちょうどこの機会に確認してみたところ、バージョンアップによってデフォルト設定になっていたものがあったため、カスタマイズの必要性がないものは削りました。
結果的に折り返し文字数のカスタム設定のみが残りました。

/**
 * @see https://prettier.io/docs/configuration
 * @type {import("prettier").Config}
 */
const config = {
  printWidth: 100,
};

export default config;

ちなみに、そのままファイルを作成するだけでは、ESLintに引っかかり、以下の警告が表示されます。

Parsing error: /frontend/typescript/qwik-app/prettier.config.js was not found by the project service. Consider either including it in the tsconfig.json or including it in allowDefaultProject.

これについてはESLintの設定で除外をする必要があります。
次の項目で解説していきます。

ESLintの設定を見てみる

まず、定義内容は以下のとおりです。

import js from "@eslint/js";
import globals from "globals";
import tseslint from "typescript-eslint";
import { globalIgnores } from "eslint/config";
import { qwikEslint9Plugin } from "eslint-plugin-qwik";

const ignores = [
  ...
]

export default tseslint.config(
  globalIgnores(ignores),
  js.configs.recommended,
  tseslint.configs.recommended,
  qwikEslint9Plugin.configs.recommended,
  {
    languageOptions: {
      globals: {
        ...globals.browser,
        ...globals.node,
        ...globals.es2021,
        ...globals.serviceworker,
      },
      parserOptions: {
        projectService: true,
        tsconfigRootDir: import.meta.dirname,
      },
    },
  },
  {
    rules: {
      "@typescript-eslint/no-explicit-any": "off",
    },
  },
);

設定内容としては以下を実現しています

  • グローバル除外の設定
  • 推奨設定の読み込み
    • JavaScript推奨ルール
    • TypeScript推奨ルール
    • Qwik推奨ルール
  • 言語オプションの設定
    • 4環境のサポート
      • browser(window, documentオブジェクトなど)
      • node(process, __dirnameなど)
      • es2021(Promise, async/awaitなど)
      • serviceworker(ServiceWorker APIなど)
    • パーサーオプションの設定
      • TypeScriptの型情報を使ったLintの有効化
      • tsconfig.jsonが存在するディレクトリの指定(同じディレクトリを指す)
  • カスタムルール設定
    • anyの使用を許可

Prettierとの競合は確認していないため、このまま開発していくのであれば、eslint-config-prettierライブラリのインストールは不要と考えています。

追加設定として、先ほどのPrettierの警告を解消する必要があります。
ignore変数に代入するArrayに"prettier.config.js"を追加します。

const ignores = [
  "**/*.log",
  "**/.DS_Store",
  "**/*.",
  ".vscode/settings.json",
  "**/.history",
  "**/.yarn",
  "**/bazel-*",
  "**/bazel-bin",
  "**/bazel-out",
  "**/bazel-qwik",
  "**/bazel-testlogs",
  "**/dist",
  "**/dist-dev",
  "**/lib",
  "**/lib-types",
  "**/etc",
  "**/external",
  "**/node_modules",
  "**/temp",
  "**/tsc-out",
  "**/tsdoc-metadata.json",
  "**/target",
  "**/output",
  "**/rollup.config.js",
  "**/build",
  "**/.cache",
  "**/.vscode",
  "**/.rollup.cache",
  "**/dist",
  "**/tsconfig.tsbuildinfo",
  "**/vite.config.ts",
  "**/*.spec.tsx",
  "**/*.spec.ts",
  "**/.netlify",
  "**/pnpm-lock.yaml",
  "**/package-lock.json",
  "**/yarn.lock",
  "**/server",
  "eslint.config.js",
  "prettier.config.js", // ← 追加
];

VSCodeの設定を見てみる

settings.json

VSCodeの設定を記述するファイルです。
ワークスペース設定を行うために定義します。
新規作成したプロジェクトに含まれる定義は以下の通りです。

{
  "material-icon-theme.activeIconPack": "qwik",
  "emmet.includeLanguages": {
    "typescriptreact": "html"
  },
  "emmet.preferences": {
    // to ensure closing tags are used (e.g. <img/> not just <img> like in HTML)
    // https://github.com/microsoft/vscode/commit/083bf9020407ea5a91199eb1f0b373859df8d600#diff-88456bc9b7caa2f8126aea0107b4671db0f094961aaf39a7c689f890e23aaaba
    "output.selfClosingStyle": "xhtml"
  }
}
  1. "material-icon-theme.activeIconPack": "qwik"

VSCode拡張機能であるMaterial Icon ThemeをQwik向けにカスタマイズします。
.tsxファイルがReactのロゴからQwikのロゴに変化します。

せっかくなので、今回はこの設定も含めましょう。
拡張機能が有効化されていないと無効になる設定ですので、devcontainerの定義にも追加しておきます。
customizations.vscode.extensions"PKief.material-icon-theme"を追記します。

  1. "emmet.includeLanguages": { "typescriptreact": "html" }

EmmetというHTMLやCSSを省略記法で入力することができるプラグインの設定です。
QwikではTSXファイルでコーディングしていくことになりますので、TSXファイルでもEmmetを有効にしておくと開発体験が良くなるということだと考えています。

参考
https://zenn.dev/miz_dev/articles/6cac5f2e32398d

  1. "emmet.preferences": { "output.selfClosingStyle": "xhtml" }

Emmetで入力したタグを必ず閉じるように設定します。
JSXでは input や br など、ペアを必要としないタグも含めて閉じられなければならないというルールが存在します。
こちらはEmmetを利用するのであれば、必ず設定しておきましょう。

参考
https://ja.react.dev/learn/writing-markup-with-jsx#2-close-all-the-tags

extensions.json

プロジェクトで推奨する拡張機能を定義しています。
前提として、今回はDev Containerを開発に使用するため、extensions.jsonの内容で必要なものは.devcontainerのvscode設定に移植するのが良さそうです。

以下の拡張機能が推奨されています。

  • dbaeumer.vscode-eslint
  • unifiedjs.vscode-mdx

ESLint拡張機能はプロジェクト内のLinterとしてESLintを採用するのであれば外せないものとなります。こちらは元々Dev Containerでインストールするように設定してあるため、不要となりそうです。

MDXはMarkdownコンテンツにJSXを組み込むことができる技術スタックです。
これにより、プロジェクト内で実装したコンポーネントのデモをドキュメントに組み込んだりするといったことが実現できます。
プロジェクト内でMDXを採用する場合はこちらの拡張機能を有効化するとよいでしょう。

参考
https://mdxjs.com/docs/what-is-mdx/

launch.json

プロジェクトのVSCodeデバッグ構成を定義しています。

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Launch Chrome",
      "request": "launch",
      "type": "chrome",
      "url": "http://localhost:5173",
      "webRoot": "${workspaceFolder}"
    },
    {
      "type": "node",
      "name": "dev.debug",
      "request": "launch",
      "skipFiles": ["<node_internals>/**"],
      "cwd": "${workspaceFolder}",
      "program": "${workspaceFolder}/node_modules/vite/bin/vite.js",
      "args": ["--mode", "ssr", "--force"]
    }
  ]
}

構成は2つあります。
基本的に両方とも必要になるため、こちらはそのままワークスペースに移行します。

  1. Launch Chrome

Chromeのブラウザを起動してフロントエンド部分をデバッグします。
あらかじめ、pnpm devvite --mode ssrを実行しておく必要があります。

  1. dev.debug

ViteのSSR開発サーバーをデバッグモードで起動します。
バックエンド部分をデバッグする際に使用します。

現在の構成では/frontend/typescript/qwik-appに対してデバッグを行うため、各種パスの修正が必要となります。

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Launch Chrome",
      "request": "launch",
      "type": "chrome",
      "url": "http://localhost:5173",
      "webRoot": "${workspaceFolder}/typescript/qwik-app" // パスを修正
    },
    {
      "type": "node",
      "name": "dev.debug",
      "request": "launch",
      "skipFiles": ["<node_internals>/**"],
      "cwd": "${workspaceFolder}/typescript/qwik-app", // パスを修正
      "program": "${workspaceFolder}/typescript/qwik-app/node_modules/vite/bin/vite.js", // パスを修正
      "args": ["--mode", "ssr", "--force"]
    }
  ]
}

スニペット

VSCodeでは.code-snippetsというファイルで、事前に定義した定型記述を簡単に呼び出すことができます。
私はあまりスニペットを活用することがないのですが、今回はそのままワークスペースの設定に移動して使えるようにしました。

  • qwik-city.code-snippets
  • qwik.code-snippets

呼び出し方としては各種スニペットのprefixを入力すればサジェストで表示されますので、それを選択すればOKです。

スクリーンショット 2026-01-05 14.12.27

どのスニペットもQwikのqから始まるようにプレフィックスを定義しているため、もし仮にReactやSvelteなど、他のフレームワーク用のスニペットを用意したとしてもrsといったプレフィックスから始めるような命名ルールで運用すれば混同しないようにできるのではないかと感じました。

まとめ

いかがだったでしょうか?
新規に立ち上げたQwikプロジェクトではESLintやPrettierの設定が用意されているため、そこまで頭を悩ませる必要がないという部分が親切だなと感じました。開発していく中でプロジェクトに取り入れたいルールが出てきた際に適宜組み込んで行くと良いと考えています。
次回以降は実際にQwikのソースコードを触りつつ、新しく発見したことなどをお伝えしていければなと思っています!
最後までご覧いただきありがとうございました。

この記事をシェアする

FacebookHatena blogX

関連記事