Nuxt.jsの基本と最初のセットアップ「プロジェクトの作成と起動をするまでの流れ」

最近Nuxt.jsをガッツリ触ることが多くなってきたので、理解を深めるためにもまとめていきます。
Nuxt.jsとは
Nuxt.jsが生まれた経緯
もともとNuxt.jsは、Reactのフレームワークとして開発されたNext.jsにインスパイアされて開発されました。
NuxtとNextで名前が1文字違いとややこしいのですが、Vue.jsとReactで別のものなので検索結果でたまに紛れて出てきたときに惑わされないように注意しましょう。
最初はVue.jsのサーバーサイドレンダリングを支援する目的で開発されていましたが、いまでは機能が追加されていき、かなり高機能になっています。
Vue CLIとの使い分け
Vue.js公式の開発ツールであるVue CLIでも、Vue.jsの開発環境は簡単に構築できます。
GUIによって環境構築もできますし、必要な機能を選択しインストール。
 高度なことを行わずにとりあえず触ってみたいという方は、Vue CLIから初めてみてもよさそうです。
SSR(サーバーサイドレンダリング)
Vue CLIでは「SPA」と呼ばれるブラウザ上でJavaScriptの処理を用いてページを描画する方式を取っています。
 そのためもとのHTMLは空で、その状態からどんどん書き込みを行っていきます。
人の目から見るとブラウザ側で描画しようが、サーバー側で描画しようが違いがあまり分かりませんが、HTMLしか理解できないクローラーなどは、JavaScriptの処理ができないため真っ白なページだと判定してしまいます。
せっかく作ったページも、クローラーに判定されなければ検索エンジンを利用して見つけてもらえません。
しかし、Nuxt.jsではSSR(Server Side Rendering)という機能を使って、サーバー側がでJavaScriptのレンダリングを行って、その結果をブラウザに渡します(設定でSPAを作ることも可能です)。
PHPやPythonなどのサーバーサイドプログラムの役割をJavaScriptが行っているようなイメージです。
 そのため、返ってくるデータには通常のウェブサイトと同様のHTMLが記述されていて、クローラーも理解できます。
さらに最初のアクセス時はサーバーサイドで処理をしますが、その後のページ遷移はクライアント側でデータの取得をしてやり取りをするなど、SPAのメリットの描画スピードの速さも受けられます(設定で完全なSPAにもできます)。
Nuxt.jsのインストール
前提として、下記インストールされている必要があります。
- Node.js(npm 5.2.0以上)
 - Yarn(yarnを使いたい場合)
 
プロジェクトの作成
Nuxt.jsを始めるときは、create nuxt-appを使用します。
npx create-nuxt-app プロジェクト名Yarnを使用する場合は下記のコマンドでOKです。
yarn create nuxt-app プロジェクト名npxの場合はcreate-nuxt-appとハイフンが続いていますが、yarnの場合はcreate nuxt-appという風に「create」と「nuxt-app」の間がハイフンではなくスペースなので注意が必要です。
実行すると必要なパッケージをインストールするか聞かれるので、enterを押して進みます。

その後にいくつか質問されるので、順に答えていきます。
プロジェクト名

? Project name (プロジェクト名)最初にプロジェクト名を聞かれます。
 create nuxt-appコマンドのパラメータとして渡した値が表示されるので、基本はこのままenterを押して先に進みます。
TypeScriptを使うかどうか

? Programming languageJavaScriptを使うか、TypeScriptを使うか選択します。
 矢印キーで選択してenterを押せば先に進みます。
パッケージマネージャーの選択

? Choose a package manager (Use arrow keys)
> npm
yarnnpmを使うか、yarnを使うかパッケージマネージャーの選択をします。
この選択によって、Nuxt起動のために表示されたりREADME.mdに書かれるコマンドが変わったり、yarnの場合はyarnlockファイルが生成されたりします。
複数人のプロジェクトで、全員がyarnを使うと明確に決めていない場合はnpmの方がすぐスタートしてもらえますし、最近はnpmでもいいのかなと思い始めています。
個人で使う場合はyarnにしています。
UIフレームワークの選択

? UI framework (Use arrow keys)
> None
   Ant Design Vue
   BalmUI
   Bootstrap Vue
   Buefy
   Chakra UI
   Element
   Oruga
   Primevue
   Tachyons
   Tailwind CSS
   Windi CSS
   Vant
   View UI
   Vietify.jsUIフレームワークを使用する場合は、ここで選択します。
 選択肢に関してはNuxtのバージョンによってどんどん追加されていっているようです。
使用モジュールの選択

? Nuxt.js modules (Press <space> to select, <a> to toggle all, <i> to invert selection)
> Axios - Promise based HTTP client
   Progressive Web App (PWA)
   Content - Git-based headless CMSAxiosはAPI通信を簡単にしてくれるモジュールです。
 過去に記事にしたこともありますが、ここでインストールできるのは通常のAxiosではなく、Nuxt.jsに合わせた専用のAxiosモジュールがインストールされます。
APIを利用する場合はとりあえずインストールしておいた方が良いです。
Progressive Web AppはPWAに対応したサイトを作るためのモジュールがインストールされます。
ContentはGitベースのHeadless CMSを作るためのモジュールがインストールされます。
 Markdownファイルなどを置いて、それをベースにブログ記事が生成されたりします。
カーソルを矢印キーで移動してspaceを押せば、それぞれインストールしたいモジュール選択できます。
 すべて選択したらenterで次に進みます。
Lintツールを選択

? Linting tools (Press <space> to select, <a> to toggle all, <i> to invert selection)
> ESLint
   Prettier
   Lint staged files
   StyleLint
   CommitlintESLintやPrettierなどのというコーディングのスタイルを統一するためのリントツールを使用するかどうか選択します。
これも複数選択可能で、カーソルを矢印キーで移動してspaceを押せば、それぞれインストールできます。
テストツールの選択

? Testing framework (Use arrow keys)
> None
   Jest
   AVA
   WebdriverIO
   Nightwatchコードを書いたあとのテストツールを選択します。
レンダリング方法を選択

? Choose rendering mode (Use arrow keys)
> Universal (SSR / SSG)
   Single Page Appユニバーサルアプリケーション(SSR)とするか、シングルページアプリケーション(SPA)で作成するか選択します。
デプロイ先の選択

? Deployment target (Use arrow keys)
> Server (Node.js hosting)
   Static (Static/Jamstack hosting)APIだけで完結しないような場合に「Server」を選択して、コンテンツは開発環境でビルドしたHTMLファイルを設置してAPI経由で表示させる場合は「Static」を選択します。
開発ツールの選択

? Development tools (Press <space> to select, <a> to toggle all, <i> to invert selection)
> jsconfig.json (Recommended for VS Code if you're not using typescript)
   Semantic Pull Request
   Dependabot (For auto-updating dependencies, GitHub only)開発ツールを選択します。
「jsconfig.json」はVisual Studio Codeの設定ファイルを作成してくれて、コンパイルの設定なども入っています。
「Semantic Pull Requests」はコミットメッセージやプルリクエストのタイトルの付け方をチェックしてくれるツールです。
「Dependabot」はGitHubのボットで、リポジトリ内を監視して脆弱性が検知されたときなど必要に応じてアラートの通知を出してくれます(GitHub以外では使用できません)。
継続的インテグレーションの選択

? Continuous integration (Use arrow keys)
> None
   GitHub Actions (GitHub only)
   Travis CI
   Circle CI「CI」と略されることの多い「継続的インテグレーション(Continuous Integration)」は、コードを更新して指定したブランチにプッシュすると、自動でビルド → テストをして、設定すればサーバーへのアップまでしてくれます。
バージョン管理(Git)を使うかどうかの選択

? Version control system (Use arrow keys)
> Git
   NoneGitを使用するかどうか選択します。
 選択すると自動で「.git」フォルダなどGitに必要なフォルダやファイルが生成されます。
セットアップの完了

「Successfully created project ○○」と表示されれば、無事セットアップ完了です。
Nuxt.jsの起動
プロジェクト作成の最後のメッセージに起動コマンドが書かれています。
 内容は「プロジェクト名」ディレクトリに移動して、npmの場合はnpm run devでNuxt起動。yarnの場合は「yarn run dev」で起動です。
下記がnpmの場合です。
$ cd プロジェクト名
$ npm run devそして下記がyarnの場合です。
$ cd プロジェクト名
$ yarn run devNuxtが起動したら「localhost:3000」にアクセスして、ページが表示されていれば無事プロジェクトの作成と起動成功です(Nuxt.jsのバージョンや選択したUIフレームワークなどによって、表示はかなり大きく変わります)。

ディレクトリ構造
最後にNuxt.jsのディレクトリ構造についてざっくり触れておきます(セットアップ時に選択した設定によっては生成されていないフォルダもあります)。
- asset:SassやLessなどのコンパイルされていないアセットや、Webpackでインクルードする画像を入れる
 - components:名前の通りコンポーネントを入れる
 - layout:レイアウトを入れる(pageから指定することで、レイアウトを反映できる)
 - middleware:ページやレイアウトのレンダリング前に実行するミドルウェアを入れる
 - pages:この中にページを入れる(このファイルがそのままサイトの構造になる)
 - plugins:JavaScriptプラグインファイルを入れる
 - static:静的ファイルやWebpackでインクルードしない画像を入れる
 - store:Vuexのストアファイルを入れる(index.jsを追加すると自動でVuexのオプションが有効化される)
 
Vue CLIと比べると違う部分が多いですが、そこまで大きく悩むことはなさそうです。


 ウェブサイトをダークモードに対応するときに気をつけること 
 iOS Safariでinputタグにフォーカスを合わせると、自動で画面が拡大してしまう原因と解決方法 
 SourceTreeを開くと「’git status’ failed with code 69:’」というポップアップが出てくる場合の解決方法 
 Google Maps APIをローカル開発環境で使用するときの制限設定方法 
 サーバーのアップロードファイルの最大容量の確認と変更方法 
 Visual Studio Codeの基本|概要やインストールから日本語化など最低限の設定方法 
 WordPressでbloginfo()の一部パラメーターの廃止・非推奨に注意! 
 Nuxt.jsでコンポーネントを作成してコードの共通化を行う|Nuxt.jsの基本 
 WordPressのContact Form 7で送信時に回転アイコンが出たまま止まってしまうときのチェックリスト 
 WordPressの常時SSL化で、下層ページのhttpからhttpsへのリダイレクトがうまくいかない場合に確認すること 
 iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない 
 Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法 
 iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法 
 iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法 
 Keynoteで有効にしているはずのフォントが表示されない現象 
 MacのKeynoteにハイライトされた状態でコードを貼り付ける方法 
 AirPodsで片耳を外しても再生が止まらないようにする方法 
 iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ 
 DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること 
 Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する 
 1つのノートアプリにすべて集約するのをやめた理由|2025年時点のノートアプリの使い分け 
 Notionログイン時の「マジックリンク」「ログインコード」をやめて普通のパスワードを使う 
 AlfredでNotion内の検索ができるようになるワークフロー「Notion Search」 
 Gitで1行しか変更していないはずのに全行変更した判定になってしまう 
 Macでアプリごとに音量を調節できるアプリ「Background Music」 
 Macのターミナルでパスワード付きのZIPファイルを作成する方法 
 MacBook Proでディスプレイのサイズ調整をして作業スペースを広げる 
 SteerMouseの「自動移動」機能で保存ダイアログが表示されたら自動でデフォルトボタンへカーソルを移動させる 
 iPhoneでタッチが一切効かなくなった場合に強制再起動する方法