Visual Studio Code で Nuxt.js を使った Docker コンテナ内での開発

# はじめに

以前、[環境を汚さず（選ばず）Nuxtプロジェクトを作成しGitHub Pagesで公開するまでの一部始終](https://qiita.com/nakazawaken1/items/675b7e16b793330db410) という記事を書きました。
その後、より簡単にNuxtの開発環境を作れないかと何回かやっているうちに、
Visual Studio Code をうまく使えばよりシンプルにできることがわかってきたので、再度まとめました。
Nuxtのバージョンが上がってプロジェクト作成時の設定が若干変わっています。

----

# 事前準備

Docker, Visual Studio Codeをインストールしておきます。

これからインストールする方は以下を参考にしてください。

[Windows 10 Home に Docker for Desktop をインストールする手順](https://qiita.com/nakazawaken1/items/2646e0dac287952c3fd3)

[Visual Studio Code のインストール手順(Windows)](https://qiita.com/nakazawaken1/items/a9aab1b7e8075b3c5867)

※今回は Windows 10 Home 環境で作業していますが、Docker, Visual Studio Code が入っていればどのOSでも同じようにできるはずです。

今回の Nuxt.js のバージョンは 2.13.3 です。

----

# Visual Studio Code の起動

Visual Studio Code を起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/dbca3626-24d6-ec52-b433-dba77df7fb58.png)

----

# プロジェクトフォルダの作成

メニュー File / Open Foder... を選択し、プロジェクト用フォルダを作成して開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/369a9784-f8e0-d84f-2f4a-b9c357cdd436.png)

今回は C:\dev\nuxt_in_docker というフォルダを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/4bd2cb4c-5202-01da-c504-577710696f5a.png)

Welcome ページは不要ですので × ボタンで消します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/13165cf7-3bbc-be86-0df6-ef492e5603e9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/4f5d0a83-ed53-3594-fc7a-7a4a316d8e2e.png)

----

# Dockerファイルの作成

ファイル作成ボタン![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/8b5a5238-c7c6-a9be-004f-a278cd436c27.png)を押し、 Dockerfile を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/b8af527d-651c-7de5-173a-aca0ae61c1e7.png)

----

Dockerfile に以下の内容を入力して保存します。

```dockerfile:Dockerfile
FROM node:alpine
ENV CHOKIDAR_USEPOLLING=true NUXT_TELEMETRY_DISABLED=1
RUN apk update && apk add git
```

1行目では、apline OS上に node がインストールされた公式の Docker イメージを使うよう指定しています。
2行目では、Nuxt で開発する際の自動リロードと、統計情報参加の応答を環境変数で指定しています。
3行目では、Docker コンテナ内で Git を使えるようインストールしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/69d9ed67-5092-673f-5783-2ce3385bd86f.png)

----

# Remote Development 拡張機能をインストール

Extensions ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/566e3376-73f1-be33-c5ba-5cd957de5814.png)に切り替えて、Remote Development を検索してインストールします。

（インストール済みなら何もしなくてOKです。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/531f43c5-4866-5f08-1d39-503829e05948.png)

----

# コンテナ開発モードに切り替える

左下の Open a remote window ボタンを![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/58f1e8fb-9483-f823-56f5-bb20bd0df7d1.png)押して Remote-Containers: Reopen in Container を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/1e6fc341-376e-b10b-56b0-7be9ac7ce7e3.png)

つづけて、From 'Dockerfile' を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/3b90e675-2ef3-ac1d-c0cf-43a572fe5fc4.png)

しばらく待つと左下の表示が ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/5007067f-a6f7-a999-863f-6d91790312ad.png) に変わります。
これで、Docker コンテナ内で開発する準備が整いました。

# Vue開発用拡張機能をインストール

devcontainer.json が表示されるので、extentions に Vuter を追加し上書き保存します。
（表示されない場合は、 .devcontainer フォルダ内の devcontainer.json を開いてください。）

※Vuter は vue ファイルや js ファイル、スタイルシートのコードハイライトや、自動補完、構文チェックを行ってくれる拡張機能です。

```json:devcontainer.json(変更前)
	"extensions": []
```

```json:devcontainer.json(変更後)
	"extensions": ["octref.vetur"]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/1e95f8a9-b55f-b3c5-44c2-23913ad1f5bd.png)

----

変更を反映させるために、左下の Open a remote window ボタンを![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/58f1e8fb-9483-f823-56f5-bb20bd0df7d1.png)押して Remote-Containers: Rebuild Container を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/4e7e5f87-7a11-9fdf-8343-22d82f05efaa.png)

----

拡張機能を見ると、vuter がインストールされているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/f2e9bb1f-86bc-e81f-3f0e-53d05ded29ce.png)

# Nuxtプロジェクト作成

メニュー Terminal / New Terminal を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/7052e34c-86cb-f10c-4725-42fea9e926a9.png)

Docker コンテナ内でターミナルを開いたことになるので、コマンドプロンプトではなくシェルになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/76f907e3-2965-3514-693a-26c0248bc2f5.png)

----

ターミナル内で、Nuxtプロジェクトを作成コマンドを実行します。

```sh:TERMINAL
yarn create nuxt-app
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/c9f514e6-1ab8-e156-dc41-60b1691afcdb.png)

※バージョンによっては実行するとディレクトリがからではないというエラーが出る場合があります。
その時は以下のようにプロジェクトフォルダ(名前は任意につけられます)を指定して作成してください。
そして、プロジェクト作成完了後 project フォルダ内の全ファイルを親フォルダに移動させ、空の project フォルダを削除します。

```sh:TERMINAL
yarn create nuxt-app project
```

実行途中で、プロジェクト作成時の各種設定を入力していきます。

----

```sh:プロジェクト名入力
? Project name: nuxt_in_docker
```

プロジェクト名を聞いてきますが、デフォルトでフォルダ名と同じに設定されていてそのままでいいので Enter を押します。

----

```sh:開発言語選択
? Programming language: JavaScript
```

JavaScript か TypeScript を選択できます。今回は JavaScript にしますので、そのまま Enter を押します。

----

```sh:パッケージ管理選択
? Package manager: Yarn
```

yarn か npm を選択できます。今回は yarn にしますので、そのまま Enter を押します。

----

```sh:UI フレームワーク選択
? UI framework: (Use arrow keys)
```

下記11種類から選択できますが、今回は使用しない（None）ので、そのまま Enter を押します。

1. Ant Design Vue 
1. Bootstrap Vue 
1. Buefy 
1. Bulma 
1. Element 
1. Framevuerk 
1. iView 
1. Tachyons 
1. Tailwind CSS 
1. Vuesax 
1. Vuetify.js

----

```sh:導入モジュール選択
? Nuxt.js modules: (Press <space> to select, <a> to toggle all, <i> to invert selection)
```

下記3つを選択できますが、後からでも追加できるので、そのまま Enter を押します。

1. ◯ Axios
1. ◯ Progressive Web App (PWA)
1. ◯ Content

----

```sh:構文チェックツール選択
? Linting tools: (Press <space> to select, <a> to toggle all, <i> to invert selection)
```

下記4つを選択できますが、Vuter である程度カバーできるので今回はそのまま Enter を押します。

1. ◯ ESLint
1. ◯ Prettier
1. ◯ Lint staged files
1. ◯ StyleLint

----

```sh:テストフレームワーク選択
? Testing framework: Jest
```

下記3つから選択できます。後からも追加できますが、設定が若干面倒ですので、今回は Jest を入れておきます。
↓キーで Jest を選択して Enter キーを押します。

1. Jest 
1. AVA 
1. WebdriverIO 

----

```sh:レンダリング方式
? Rendering mode: Universal (SSR / SSG)
```

Universal (SSR / SSG) か Single Page App (SPA) を選択できます。

今回は最終的に静的な html, js, css を生成するので、 Universal を選びます。そのまま Enter を押します。
※後から設定を変更することも可能です。 

----

```sh:デプロイ方式選択
? Deployment target: Static (Static/JAMStack hosting)
```

作成したものをどのようにに動作させるかを選択します。
Server (Node.js hosting) は、Node.js のサーバで動作させます。
Static (Static/JAMStack hosting) は、JAM(JavaScript, API, Markup)＝通常のWebサーバで動作させます。
今回は Static を選択し、Enter を押します。

----

```sh:開発ツール選択
? Development tools: jsconfig.json (Recommended for VS Code)
```

下記2つを選択できます。 Visual Studio Code 用におすすめされているので、
jsconfig.json を選択し、Enter キーを押します。 

1. ◯ jsconfig.json (Recommended for VS Code)
1. ◯ Semantic Pull Requests

----

作成完了になるまでしばらく待ちましょう。

```sh:作成完了
🎉  Successfully created project nuxt_in_docker

  To get started:

        yarn dev

  To build & start for production:

        yarn build
        yarn start

  To test:

        yarn test

Done in 186.42s.
```

----

# Git管理開始

gitを初期化し、ユーザ名とメールアドレスを登録します。
※ユーザ名、メールアドレスは自分のものに置き換えて入力してください。

```sh:TERMINAL
git init
git config user.name ユーザ名
git config user.email メールアドレス
```

----

# 初回コミット

Source Control ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/403cf742-b6ed-c260-f9a8-7ee6531d4166.png) に切り替えて、コミットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/65f77c33-3756-add3-660d-601820d701fb.png)
コミットコメント欄に first と入力し、コミットボタン![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/ae3858ac-ac49-a9d3-cb35-6ea91576f434.png)を押します。

ステージングに入れてないと確認が出ますが、全ファイルをコミットするのでYesを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/f68f1ab7-912f-c504-d8eb-3bdf11be5ced.png)

以下の表示が出る場合は、ユーザ名、メールアドレスが正しく登録されていませんので、再度登録コマンドを実行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/077f5640-219f-68d4-0a0a-05674b896707.png)

----

# 開発サーバを起動

開発サーバを起動します。

Exploer ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/58051194-abb6-fdce-5e62-5fd5787bfb30.png) に切り替え、下のほうにある NPM SCRIPTS を開き、dev の右側の三角ボタン![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/72733a79-e7eb-d0eb-4222-03fc180d8de7.png)を押します。

※NPM SCRIPTS が表示されない場合は、package.json ファイルを開いたり、Visual Studio Code を再起動させたりすると表示されます。

しばらく待つと、 Listening on: http://localhost:3000/ と表示されます。
これで開発サーバが起動しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/3a40d2a7-6183-4bf6-1a92-42967bc74e6a.png)

# ポート設定

ブラウザで表示できるようにするために、Docker 内のポートとローカルポートを接続します。

Remote Exploer ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/66baef0b-99df-346b-63d9-d9f9de07ac27.png) に切り替えます。

3000番ポートが表示されているので、右の追加ボタン![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/732b3bea-2989-e086-34b6-3aab5748b824.png)を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/8b5f7097-9c6f-2fef-db25-0b18ddd5089d.png)

以下の画面が出た場合は「アクセスを許可する」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/2b90212d-903f-8b77-8097-95a82e7d3b7e.png)

これで Docker 内の 3000 番ポートと、ローカルの 3000 番ポートが接続され、
ブラウザで動作確認ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/c319b085-ab4b-7b84-2cf3-b3af29596555.png)

----

# ブラウザで画面を確認

Open in Brower ボタン![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/5cb5cefd-c285-e919-17c1-ae6f4d1d8f41.png)を押します。

トップ画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/f3e8a00b-07a2-fc2a-209a-54328fae3f03.png)

----

# タイトルを変更

pages/index.vue を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/a09ceca4-b449-56dd-ee23-bd5597a9f9b7.png)

nuxt_in_docker の文字を Nuxtはじめました に書き換えて上書き保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/a257fca6-0fef-99bd-d643-8b1757b6f819.png)

保存するとブラウザの表示が自動的に切り替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/36f0aa1c-683f-0312-973c-c7d693a09ab4.png)

※変更されない場合は環境変数 CHOKIDAR_USEPOLLING=true がスペルミスなく設定されているか確認してください。
間違っている場合は Dockerfile を修正します。

----

# テストを実行

NPM SCRIPTS 内の test の右の三角ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/ffcc4497-c92d-e1e6-c614-71dd7ec2bbad.png)

しばらく待つとテスト結果とカバレッジが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/4ba2d9bf-b200-dc7d-fc33-8e6132e49f2f.png)

----

# テストを追加

index.vue のテストを追加してみます。

test/Logo.spec.js をCtrlドラッグでコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/956d1f61-adc6-dd75-4a96-cbc2775d1095.png)

ファイル名を index.spec.js に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/73d80a25-ae83-213b-1cfa-98cd262b43ea.png)

Logo の部分を index に書き換えて上書き保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/3ffaeb2e-48e8-4b96-0f08-6ecd496cba02.png)

再度テストを実行します。

すると以下のように Logo コンポーネントが正しく登録されていないと出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/47c041ff-9a02-a125-2c76-0fadf27e5c2f.png)

----

# 警告が出ないうように修正

警告を消すために、index.vue の　&lt;script&gt;タグ内を記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/c25c4ec7-0a2a-e12a-de99-39b54e2132dd.png)

```js:変更前
<script>
export default {}
</script>
```

```js:変更後
<script>
import Logo from "@/components/Logo.vue";
export default {
  components: {
    Logo
  }
};
</script>
```

再度テストを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/caae8678-0b78-9352-45b7-3495aa62a200.png)

警告が消えてきれいに実行できました。