Visual Studio CodeでVue.jsアプリケーションの開発環境を構築する

# 概要

Visual Studio Code（以降VSCodeと表記）でVue.jsを利用したアプリケーションの開発環境を構築したときのメモです。
Node.jsやESLint、Vue.jsはすでにnpmでインストールしているという前提です。またgit操作にGit for Windowsを使用します。

なお、Vue.jsを含めフロントエンド開発について学習中の身のため間違っている点などがあると思いますが、そのときはご指摘いただければ大変助かります。

**環境**

* Windows 10 Professional
* VSCode 1.22.2
* Node.js 8.11.1
* Vue.js 2.5.16
    * vue-cli 2.9.3

**参考**

* [Microsoft/vscode-recipes - GitHub] (https://github.com/Microsoft/vscode-recipes)
* [Microsoft/vscode-tips-and-tricks - GitHub] (https://github.com/Microsoft/vscode-tips-and-tricks)

# VSCodeのインストールと設定

[microsoft.com - Visual Studio Code] (https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)より、インストーラーをダウンロードしてインストールします。

**VSCodeの画面構成**

![v11.png](https://qiita-image-store.s3.amazonaws.com/0/22772/b1a24a82-f4ee-deb6-5df7-1e3b1d42979e.png)

* アクティビティバー (黄)
    * エクスプローラー (<kbd>Ctrl + Shift + E</kbd>)
    * 検索 (<kbd>Ctrl + Shift + F</kbd>)
    * SCM (<kbd>Ctrl + Shift + G, G</kbd>)
    * デバッグ (<kbd>Ctrl + Shift + D</kbd>)
    * 拡張機能 (<kbd>Ctrl + Shift + X</kbd>)
* サイドバー (緑)
    * <kbd>Ctrl + B</kbd>で切り替え
* パネル? (青)
    * パネルという名称かは不確かです
    * <kbd>Ctrl + J</kbd>で切り替え
    * 出力 (<kbd>Ctrl + Shift + U</kbd>)
    * 問題 (<kbd>Ctrl + Shift + M</kbd>)
    * デバッグコンソール (<kbd>Ctrl + Shift + Y</kbd>)
    * ターミナル (<kbd>Ctrl + @</kbd>)

**エディタ**

エディタの右上に表示されているのはソースコード全体のミニマップです。
エディタで半角スペースやタブを表示（または非表示）するには、コマンドパレットを開き"white"と入力し、"空白文字の表示の切り替え"を選択します。

![v12.png](https://qiita-image-store.s3.amazonaws.com/0/22772/f0cabc5a-d17b-f15c-257c-b1cf04fb0480.png)

表示したときの状態です。・が半角スペース、→がタブを表しています。なお、文字コードや改行コードはステータスバーに表示されています。

![v13.png](https://qiita-image-store.s3.amazonaws.com/0/22772/6b90f3fd-ad50-dac6-ccea-3935f8cccd40.png)

## 拡張機能

デフォルトで多くの拡張機能がビルトインされていますが、追加でVue.jsアプリケーションの開発に便利な拡張機能を[マーケットプレイス] (https://marketplace.visualstudio.com/)よりインストールしました。

### ビルトインされている拡張機能

ビルトインされている拡張機能を確認するには、アクティビティバーの「拡張機能」を開き（<kbd>Ctrl + Shift + X</kbd>）検索フィールドに`@builtin`と入力して検索します。

![v1.png](https://qiita-image-store.s3.amazonaws.com/0/22772/0a9c204b-8a82-47e3-f042-2da797d948b1.png)

### 追加でインストールした拡張機能

![v17.png](https://qiita-image-store.s3.amazonaws.com/0/22772/94dadbac-001f-9495-23ae-3bbeefe9bf4c.png)

**[npm] (https://marketplace.visualstudio.com/items?itemName=eg2.vscode-npm-script)**

"Npm support for VSCode"という拡張機能がビルトインされていますが、これより高機能な拡張機能「npm」をインストールしました。
インストールするとコードパレットでnpm scriptsの実行やのpackage.jsonのバリデーションができるようになります。

**[Vetur] (
https://marketplace.visualstudio.com/items?itemName=octref.vetur)**

Vue.jsコードのシンタックスハイライトやコード補完、リント、フォーマットが使えるようになる「Vetur」をインストールしました。

**[ESLint] (https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)**

リンターに「ESLint」をインストールしました。
`vue init`コマンドでVue.jsのプロジェクトのひな型を作成するときにESLintを有効にすると、自動的に`.eslintrc.js`ファイルと`.eslintignore`ファイルが作成されます。

**[Prettier - Code formatter] (https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)**

Vue.jsのフォーマッター（Veturのフォーマットが依存している）に「Prettier」をインストールしました。

**[GitLens] (https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)**

"Git integration for Visual Studio Code"という拡張機能がビルトインされているので、デフォルトでも基本的なgitコマンドを実行できますが、「GitLens」をインストールするとcommit間の差分が簡単に確認できるようになるのでインストールしました。
もっとも学習中で一人でプロジェクトを扱う場合はあまり利用することはないかもしれません。

**[markdownlint] (https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint)**

デフォルトでmarkdownファイルのプレビューはできますが、「markdownlint」をインストールすると更にmarkdownファイルのバリデーションができるようなるのでインストールしました。

**[Bracket Pair Colorizer] (https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer)**

インストールすると対になるブラケットを色で識別できるようになります。
便利そうなのでインストールしましたが、残念ながら.vueファイルには対応していないようです。

**[Japanese Language Pack for Visual Studio Code] (https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)**

2018/05/11に追記。
VSCodeを起動すると次のようなダイアログに日本語言語パックをインストールするようにとメッセージが表示されたのでインストールしました。

![vs31.png](https://qiita-image-store.s3.amazonaws.com/0/22772/83bccca8-89db-7385-71ef-1a6ffc46611c.png)

**[Debugger for Chrome] (https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome)**

2018/05/11に追記。
VSCodeでVue.jsアプリケーションをデバッグできるようにするためにインストールしました。
デバッグの設定などは後述しています。


# Vue.jsを利用したデモアプリケーション

## ひな型を生成する

VSCode上からはひな型を生成できないようなので、vue-cliのvueコマンドで生成します。
まず、利用できるオフィシャルテンプレートを確認します。

```text
> vue list

  Available official templates:

  ★  browserify - A full-featured Browserify + vueify setup with hot-reload, linting & unit testing.
  ★  browserify-simple - A simple Browserify + vueify setup for quick prototyping.
  ★  pwa - PWA template for vue-cli based on the webpack template
  ★  simple - The simplest possible Vue setup in a single HTML file
  ★  webpack - A full-featured Webpack + vue-loader setup with hot reload, linting, testing & css extraction.
  ★  webpack-simple - A simple Webpack + vue-loader setup for quick prototyping.
```

vue initコマンドでテンプレートにwebpackを使用するひな型を生成しました。

```text
> vue init webpack exercise-vue

? Project name exercise-vue
? Project description A Vue.js project
? Author rubytomato <mail address>
? Vue build standalone
? Install vue-router? Yes
? Use ESLint to lint your code? Yes
? Pick an ESLint preset Standard
? Set up unit tests No
? Setup e2e tests with Nightwatch? No
? Should we run `npm install` for you after the project has been created? (recommended) npm

   vue-cli · Generated "exercise-vue".


// ...省略...


# Project initialization finished!
# ========================

To get started:

  cd exercise-vue
  npm run dev

Documentation can be found at https://vuejs-templates.github.io/webpack
```

### ESLintの使用

ひな型を作成する途中でESLintを使用するかどうかの選択肢があり、Yesにすると次にESLint presetの選択肢が出てきます。
選択できる項目(<kbd>↑</kbd>、<kbd>↓</kbd>でカーソル移動できます)は`Standard`、`Airbnb`、`none`の3つで、この記事では`Standard`を選択しています。

```text
? Use ESLint to lint your code? Yes
? Pick an ESLint preset
> Standard (https://github.com/standard/standard)
  Airbnb (https://github.com/airbnb/javascript)
  none (configure it yourself)
```

**Standard**

ここで選択するStandardとは、[JavaScript Standard Style] (https://standardjs.com/)のことで名前にStandardと付いているのでJavaScript(ECMAScript)の標準ルールだと思うかもしれませんが、いくつもあるJavaScriptのスタイルガイドの1つです。

このスタイルの大きな特徴（ルール）には、インデントは2スペース、文字列をシングルクォートで囲む、セミコロンを使わない、関数名の後にスペースを入れる等があります。詳しくは上記のリンク先のページで確認できます。

**.eslintrc.js**

下記はひな型を生成した直後の.eslintrc.jsの内容です。
ESLintには[Shareable Configs] (https://eslint.org/docs/developer-guide/shareable-configs) (共有設定)という機能があり、npmモジュールとして公開されているESLintの設定をextendsで適用させることができます。

この.eslintrc.jsで利用している共有設定は次の2つで、1つ目はVue.jsの設定、2つ目はひな型作成時に選択したStandardスタイルガイドの設定です。

* 'plugin:vue/essential'
    * npm: [vuejs/eslint-plugin-vue] (https://github.com/vuejs/eslint-plugin-vue)
* 'standard'
    * npm: [standard/eslint-config-standard] (https://github.com/standard/eslint-config-standard)

```js:.eslintrc.js
// https://eslint.org/docs/user-guide/configuring

module.exports = {
  root: true,
  parserOptions: {
    parser: 'babel-eslint'
  },
  env: {
    browser: true,
  },
  extends: [
    // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
    // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
    'plugin:vue/essential', 
    // https://github.com/standard/standard/blob/master/docs/RULES-en.md
    'standard'
  ],
  // required to lint *.vue files
  plugins: [
    'vue'
  ],
  // add your custom rules here
  rules: {
    // allow async-await
    'generator-star-spacing': 'off',
    // allow debugger during development
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
  }
}
```

またrulesで、extendsで適用する共有設定の上書きや新しいルールの追加を行うことができます。
この.eslintrc.jsの例ではstandardのデフォルトルールの上書きを行っています。

```js:default_rule
{
  "generator-star-spacing": [
    "error",
    {
      "before": true,
      "after": true
    }
  ],
  "no-debugger": "error",
}
```

## VSCodeでプロジェクトを開く

生成したひな型のプロジェクトを開きます。
メニューバーの「ファイル(F)」→「フォルダーを開く(F)...」でプロジェクトのフォルダを選択します。

**直後の状態**

![v2.png](https://qiita-image-store.s3.amazonaws.com/0/22772/50641d51-4a28-a943-55c7-cce0bef5f540.png)

### ワークスペースの設定 (settings.json)

ユーザー設定で変更するとすべてのプロジェクトで有効になってしまうため、ワークスペースの設定で変更を行いました。
ユーザー設定を開き（<kbd>Ctrl + ,</kbd>）、ワークスペースの設定に切り替えてから下記の設定を変更しました。

![v3c.png](https://qiita-image-store.s3.amazonaws.com/0/22772/83f58da5-46bd-a0f8-7475-e6653f251a33.png)

**デフォルトの改行コード**

```text:変更前
"files.eol": "\r\n",
```

* デフォルトの改行コードをCRLF(\r\n)からLF(\n)に変更

```text:変更後
"files.eol": "\n",
```

**prettierとESLintの統合**

まずprettierとprettier-eslintをインストールします。

```text
> npm install prettier prettier-eslint --save-dev
```

```text:変更前
"prettier.eslintIntegration": false,
```

* prettierとESLintの統合を有効にする

```text:変更後
"prettier.eslintIntegration": true,
```

**Vue.js用のフォーマッター**

```text:変更前
"prettier.semi": true,
"prettier.singleQuote": false,
"vetur.format.defaultFormatter.js": "prettier",
"javascript.format.insertSpaceBeforeFunctionParenthesis": false,
"typescript.format.insertSpaceBeforeFunctionParenthesis": false,
```

この設定はprettierのフォーマットをstandardスタイルガイドに合わせるための設定です。
ただし、functionの括弧(Parenthesis)の前にスペースを挿入という部分はprettierで設定できないようなので、フォーマッターを"prettier"から"vs-code-typescript"に変えています。

* 行末のセミコロンを不要
* シングルクォートを使用
* functionの括弧(Parenthesis)の前にスペースを挿入

```text:変更後
"prettier.semi": false,
"prettier.singleQuote": true,
// フォーマッターをvscode-typescriptに変更
"vetur.format.defaultFormatter.js": "vscode-typescript",
// この設定はprettierではなくtypescriptのものです
"javascript.format.insertSpaceBeforeFunctionParenthesis": true,
"typescript.format.insertSpaceBeforeFunctionParenthesis": true,
```

**Veturのリント、エラーチェックを有効にする**

```text:変更前
"eslint.validate": [
  "javascript",
  "javascriptreact"
]
```

* vueファイルにリント、エラーチェックを行う

```text:変更後
"eslint.validate": [
  "javascript",
  "javascriptreact",
  {
    "language": "vue",
    "autoFix": true
  }
]
```

**保存時にフォーマットする**

~~保存時以外にもペースト時、タイプ時にもフォーマットできますが、今回は保存時だけにしました。~~

```text:変更前
"editor.formatOnPaste": false,
"editor.formatOnSave": false,
"editor.formatOnType": false,
```

**<font color="red">(2018/04/25) 下記に訂正しました。</font>**

formatOnSaveだとうまくフォーマットできなかったのでautoFixOnSaveに訂正しました。

```text:変更前
"eslint.autoFixOnSave": false,
```

* ファイル保存時にフォーマットする

```text:変更後
"eslint.autoFixOnSave": true,
```

### git

この操作はgitクライアント(Git for Windows)で行いました。
ターミナルを開き（<kbd>Ctrl + @</kbd>）以下のgitコマンドでプロジェクトをgitリポジトリ化しました。

```text
> git init
> git add .
> git commit -m "first commit"
> git remote add origin git@github.com:rubytomato/exercise-vue.git
> git push -u origin master
```

#### ソース管理

ソース管理では、変更のあるファイル一覧が表示されるほか、ステージング(git add)、リバート(git revert)、コミット(git commit)、およびファイルをクリックすると差分を確認することができます。

![v18.png](https://qiita-image-store.s3.amazonaws.com/0/22772/febc02a8-b09f-6646-40b4-f4fbeac76c77.png)

さらにファイルを右クリックしてコンテキストメニューからヒストリの表示、スタッシュ、コンペアなどが可能です。

![v19.png](https://qiita-image-store.s3.amazonaws.com/0/22772/d403d213-a5f4-f2b3-f88c-a4165735cf8f.png)

#### インラインdiff

コードを修正すると、行番号の隣に色が付きます。

![d1.png](https://qiita-image-store.s3.amazonaws.com/0/22772/7bcfa429-c292-6bc5-69d3-cf8332f7155f.png)

色をクリックすると、その範囲のdiffを表示してくれます。

![d2.png](https://qiita-image-store.s3.amazonaws.com/0/22772/68d124f3-82f6-bf6b-02fa-e93bcf0f0518.png)

#### コミットメッセージのテンプレート

gitコマンドでコミットメッセージのテンプレートを設定すると、その内容がVSCodeにも反映されます。

```text
> git config --global commit.template ~/.gitmessage.txt
```

テンプレートが登録されているかは.gitconfigファイルを確認するか以下のコマンドで確認できます。

```text
> git config --get commit.template
```

テンプレートを登録していると、下図のようにVSCodeのコミットメッセージ欄に反映されます。

![v20.png](https://qiita-image-store.s3.amazonaws.com/0/22772/e7dcbc07-6f8c-dd6c-199e-8906498d8383.png)

#### GitLens

GitLensをインストールしているので、エクスプローラーのサイドバーに「GITLENS」というメニューが追加されています。

* 2018/05のバージョンアップで、GITLENSの表示位置がエクスプローラーからソース管理へ移動しています。

![v10.png](https://qiita-image-store.s3.amazonaws.com/0/22772/39a4fa4d-d5e0-a2ac-245e-b7ad512f8b3f.png)

また、エディタ上ではカレント行上に直前のコミット情報が（薄い色で）表示され

![v8.png](https://qiita-image-store.s3.amazonaws.com/0/22772/a90d844e-6fa5-51e6-f20c-a658dcdbf9c1.png)

カーソルを合わせるとポップアップメニューが表示されます。
アイコンの"Open Changes"をクリックするとVSCode上でdiffを表示、"Open in Remote"をクリックするとGithub上でdiffを表示します。

![v9.png](https://qiita-image-store.s3.amazonaws.com/0/22772/e5be93e7-72fc-83b7-ade3-4a63c95adfb1.png)

この表示が煩わしい場合は、ユーザー設定で無効にすることができます。

* 2018/05のバージョンアップでカレント行上の情報表示とポップアップ表示の挙動が変わっています。
    * カレント行上の情報表示は、コマンドパレット(<kbd>Ctrl + Shift + P</kbd>)の"GitLens: Toggle Line Blame Annotations"で切り替えられます。
    * ポップアップ表示は、コマンドパレット(<kbd>Ctrl + Shift + P</kbd>)の"GitLnes: Switch Mode"で切り替えられます。
        * Zen Mode : 非表示
        * Preview Mode : 表示

### ビルドの実行

ビルドの仕方を確認しました。
コマンドパレットを開いて（<kbd>Ctrl + Shift + P</kbd>）"npm"と入力し候補から"npm: Run Script"を選択

![v4.png](https://qiita-image-store.s3.amazonaws.com/0/22772/45d56b61-1002-a8c9-20e0-0cb370a9090b.png)

さらに"biuld"を選択します。

![v5.png](https://qiita-image-store.s3.amazonaws.com/0/22772/0fd050ff-c89b-120d-3cea-56fdf8be2929.png)

### webpack-dev-serverの起動

コマンドパレットを開いて（<kbd>Ctrl + Shift + P</kbd>）"npm"と入力し候補から"npm: Start"を選択

![v6.png](https://qiita-image-store.s3.amazonaws.com/0/22772/9f50de0e-6e50-dd69-4cf1-f88dfc129444.png)

ターミナルが開き、webpack-dev-serverが起動します。

![v7b.png](https://qiita-image-store.s3.amazonaws.com/0/22772/e4aef230-d975-b30e-bf2b-0003dae06496.png)

webpack-dev-serverを起動した状態でソースコードを変更すると、ファイルを保存したタイミングで変更を反映してくれます。
また、ソースコードにエラーがあった場合はその原因がコンソールに出力されます。

![v14.png](https://qiita-image-store.s3.amazonaws.com/0/22772/96203f36-0efb-96d7-5617-14ee24d3ff8e.png)

### [eslint-plugin-vue] (https://github.com/vuejs/eslint-plugin-vue)

Vue.jsのオフィシャルなESLintプラグインです。
プロジェクトのひな型を作成する際にESLintを有効にすると、eslint-plugin-vueモジュールもインストールされ、`.eslintrc`ファイルのextentdにこのプラグインの共有設定`plugin:vue/essential`が適用されます。
コメント行にもあるようによりルールの厳しい`plugin:vue/strongly-recommended`や`plugin:vue/recommended`もあります。

```text
extends: [
  // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
  // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
  'plugin:vue/essential',
]
```

このモジュールがインストールされているとVue.jsに関するコーディングエラー(ESLintのルール違反)を教えてくれます。
たとえば、以下のような`v-for`を記述すると、`vue/require-v-for-key`ルールに違反していること及び`v-bind:key`が必要であることがわかります。
ちなみに、`vue/require-v-for-key`ルールは`.eslintrc`ファイルのextendsに指定した`plugin:vue/essential`共有設定に含まれているルールです。

![v15.png](https://qiita-image-store.s3.amazonaws.com/0/22772/cd180e9e-f8c6-1a7d-85fe-29479a09e753.png)

修正後は下図のようになります。

![v16.png](https://qiita-image-store.s3.amazonaws.com/0/22772/22dc77cd-d29a-582e-efb9-8ed10f1cb82e.png)

#### ルールの上書きまたは追加

`.eslintrc`ファイルのextendsに指定した共有設定は複数のルールの集合です。共有設定にどのようなルールが含まれているかは[vuejs/eslint-plugin-vue] (https://github.com/vuejs/eslint-plugin-vue)で確認できます。
既定のルールの設定を上書きしたり、新しいルールを追加するには`.eslintrc`ファイルのrulesに記述します。

以下の設定は`vue/html-self-closing`ルールを追加している例です。

```text
rules: {
  'vue/html-self-closing': [
    'error',
    {
      html: {
        void: 'never',
        normal: 'always',
        component: 'always'
      },
      svg: 'always',
      math: 'always'
    }
  ]
}
```

このルールを適用すると、以下の記述はエラーになります。
なお、void要素とは\<br\>,\<hr\>,\<img\>,\<input\>などの終了タグが不要なタグのことです。

```html
<br/>                        <!-- void要素の自己終了タグはエラー -->
<div></div>                  <!-- 空の要素はエラー -->
<MyComponent></MyComponent>  <!-- 空のコンポーネントはエラー -->
```

エラーを修正するには以下のように記述します。

```html
<br>
<div/>
<MyComponent/>
```

#### Vue.jsの[スタイルガイド] (https://jp.vuejs.org/v2/style-guide/)

Vue.jsにはVue.js固有のコーディングに対する公式のスタイルガイドがあります。

> もしあなたがプロジェクトにおいて Vue を使用する場合は、エラーや有益でない議論、アンチパターンを避けるための参考となります。

上記の`vue/html-self-closing`ルールは、スタイルガイドの[自己終了形式のコンポーネント] (https://jp.vuejs.org/v2/style-guide/#%E8%87%AA%E5%B7%B1%E7%B5%82%E4%BA%86%E5%BD%A2%E5%BC%8F%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88-%E5%BC%B7%E3%81%8F%E6%8E%A8%E5%A5%A8)に対するルールと言えます。

> 自己終了形式のコンポーネントは、単に中身を持たないというだけでなく、中身を持たないことを意図したものだということをはっきりと表現します。

## VSCodeでVue.jsアプリケーションをデバッグする

デバッグ方法にはいくつか種類があるようですが、[Microsoft/vscode-recipes - GitHub] (https://github.com/Microsoft/vscode-recipes)のDebugging Vue.js appsを参考にしました。
デバッグには[Debugger for Chrome] (https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome)が必要になるので事前にインストールしておきます。

### webpackの設定を変更

config/index.jsのdevとbuildのdevtoolプロパティを下記ように変更します。

```js
'use strict'
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.

const path = require('path')

module.exports = {
  dev: {

    // ...省略...

    /**
     * Source Maps
     */

    // https://webpack.js.org/configuration/devtool/#development
    // devtool: 'cheap-module-eval-source-map',
    //  ↓ change to
    devtool: 'source-map',

    // ...省略...

  },

  build: {

    // ...省略...

    /**
     * Source Maps
     */

    productionSourceMap: true,
    // https://webpack.js.org/configuration/devtool/#production
    // devtool: '#source-map',
    //  ↓ change to
    devtool: 'source-map',

    // ...省略...

  }
}
```

### デバッグの設定 (launch.json)

アクティビティバーのデバッグをクリックし、デバッグビューの上部にあるメニューから「構成を追加...」を選択します。

![d0.png](https://qiita-image-store.s3.amazonaws.com/0/22772/d0869b3e-6412-1af1-d913-46eca9bd5093.png)

launch.jsonファイルが開くので、下図のように"Chrome Launch"を選択して構成を追加します。

![d1.png](https://qiita-image-store.s3.amazonaws.com/0/22772/abbf91c7-d191-82e8-615a-0e084c4eaead.png)

launch.jsonを下記のように編集します。

```js:launch.json
{
  // IntelliSense を使用して利用可能な属性を学べます。
  // 既存の属性の説明をホバーして表示します。
  // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome",
      "url": "http://localhost:8080",
      "webRoot": "${workspaceFolder}/src",
      "breakOnLoad": true,
        "sourceMapPathOverrides": {
          "webpack:///src/*": "${webRoot}/*"
        }
    }
  ]
}
```

### デバッグの開始

ソースファイルを開き任意のコードにブレークポイントを設定します。（この例ではHelloWorld.vueの98行目のコードに設定しました。）

![d2.png](https://qiita-image-store.s3.amazonaws.com/0/22772/3ce86ad2-d2da-c15f-f82d-3893b7bd94ae.png)

ターミナルからアプリケーションを起動します。

```
> npm start
```

アプリケーションが起動したらデバッグビューで"Launch Chrome"(launch.jsonのnameに付けた名前です)を選択した状態で「デバッグの開始」ボタンをクリックします。

![d3.png](https://qiita-image-store.s3.amazonaws.com/0/22772/39440580-5570-b336-51d4-abed86e9696c.png)

chromeが起動しブレークポイントで処理が停止します。画面上部に表示されるダイアログで、続行(F5)、ステップオーバー(F10)、ステップイン(F11)、ステップアウト(F12)、再起動(Ctrl + Shift + F5)、停止(Shift + F5)などの操作が行えます。

![d4.png](https://qiita-image-store.s3.amazonaws.com/0/22772/1668cf4d-d41e-ed81-ce92-f30ab01cb22e.png)


# まとめ

以上で必要最低限の開発環境が整えられたと思いますが、この環境で開発を進めていくと足りない点がでてくるかなと思っています。
また、勉強をはじめたばかりなのでまだまだ分からない点が多く、とくにESLintとprettierの役割の違いなどはよく理解できていません。

# 補足

## ESLintとPrettierの併用について

これらを併用する場合、コードフォーマットにPrettierを使用し、コードチェックにESLintを使用するというように使い分けをするようです。併用方法は大きく分けると次の2通りがあります。

### ESLintからPrettierを呼び出す方法

以下のESLintプラグインを利用します。

* [prettier/eslint-plugin-prettier] (https://github.com/prettier/eslint-plugin-prettier)
* [prettier/eslint-config-prettier] (https://github.com/prettier/eslint-config-prettier)

### Prettier、ESLintの順で実行する方法

この記事ではVSCodeの[prettier-vscode] (https://github.com/prettier/prettier-vscode)プラグインを利用しているのでこちらの方法を利用しています。

* [prettier/prettier-eslint] (https://github.com/prettier/prettier-eslint)

## リント、フォーマットが効かない現象

この環境でvueファイル（単一ファイルコンポーネント）の開発を行っていた時に、あるvueファイルだけリント、フォーマットが効かない現象が起きました。
具体的にはscript部分のコードがインデントされない、文字列をダブルクォーテーションで囲んでもエラーにならないという現象です。

調べたところ（確証はないのですが）template部分でhtmlタグの書き方にリントエラーとなる箇所があると、script部分のリント、フォーマットが行われないようです。

html部分のリントエラーは開発サーバーを動かしていると、下記のようにコンソールにエラーが出力されるので気づきやすいのですが、今回は新規のコンポーネントでアプリケーションに組み込んでいなかったため気づきにくかったです。

```text
 ERROR  Failed to compile with 1 errors                                                                                                                           

 error  in ./src/components/MemoForm.vue

(Emitted value instead of an instance of Error)
  Error compiling template:

 // ...省略...

  - tag <textarea> has no matching end tag.
  - tag <div> has no matching end tag.
  - tag <div> has no matching end tag.
```

## ちょっと便利なTips

### htmlのコード補完 (Emmet)

`div.row`と入力して<kdb>ENTER</kbd>を押すと`<div class="row"></div>`に補完してくれます。
また、.(ドット)を#にして`div#app`と入力すると`<div id="app"></div>`にしてくれます。

このような記法は[Emmet] (https://emmet.io/)というツールの機能で、VSCodeはデフォルトでEmmetの機能が使えます。([Emmet in Visual Studio Code] (https://code.visualstudio.com/docs/editor/emmet))

![xxx223.gif](https://qiita-image-store.s3.amazonaws.com/0/22772/59996d4e-98fb-efd8-e6bc-6bfae3e1da73.gif)

その他に、`ul>li`のように\>で親子関係、`*3`のように*{数値}で要素数を指定

![xxx22342e.gif](https://qiita-image-store.s3.amazonaws.com/0/22772/be9b8e7a-f967-208f-03ce-d66bd569b89c.gif)

`h1+p`のように\+で複数のタグを指定

![xxx22342f.gif](https://qiita-image-store.s3.amazonaws.com/0/22772/01279673-5931-0738-f65d-6721538d145a.gif)

などの補完ができます。

### 表示言語の変更

VSCodeのメニューやメッセージはデフォルトで日本語化されていますが、英語などの別の言語に変更するにはコマンドパレット(<kbd>Ctrl + Shift + P</kbd>)を開き、`Configure Language`を選択します。

エディタでlocale.jsonファイルのlocaleを変更して再起動します。

## 便利な拡張機能、テーマ

あとから追加でインストールした拡張機能、テーマです。

### [Version Lens] (https://marketplace.visualstudio.com/items?itemName=pflannery.vscode-versionlens)

依存モジュールのバージョン情報が簡単に確認できます。

拡張機能の適用前

![version_lens0.png](https://qiita-image-store.s3.amazonaws.com/0/22772/e03f402f-aedb-9581-b3a7-afe9d6efcd94.png)

適用すると下のSSのようにバージョン情報が表示され、バージョンをクリックするとそのバージョンでpackage.jsonを更新します。

![version_lens1.png](https://qiita-image-store.s3.amazonaws.com/0/22772/a66b4299-0b30-bbb4-d0c8-4143918f947f.png)

### Markdown Preview Mermaid Support

[Markdown Preview Mermaid Support] (https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid)は、[mermaid] (https://mermaidjs.github.io/)記法で書かれたダイアグラムをMarkdownのプレビューで表示できる拡張機能です。

下図は[mermaid] (https://mermaidjs.github.io/)で紹介されているサンプルをこの拡張機能でプレビューしたものです。

![vs34.png](https://qiita-image-store.s3.amazonaws.com/0/22772/d30d38c4-9cf8-b5ee-02a1-4d2edeb42246.png)

### Numbered Bookmarks

ソースコードにブックマークを付けることができる拡張機能です。
ブックマークするとショートカットキーでその位置へジャンプすることができます。

ブックマークは1ファイル毎にショートカットキー<kbd>Ctrl + Shift + 1</kbd>から<kbd>Ctrl + Shift + 9</kbd>で9箇所まで付けることができます。
ブックマーク位置へのジャンプは<kbd>Ctrl + 1</kbd>から<kbd>Ctrl + 9</kbd>です。

![vb0.png](https://qiita-image-store.s3.amazonaws.com/0/22772/f0b468b3-fd19-55c2-4c70-74f7c44d5f85.png)

ソースファイル間でジャンプする場合はコマンドパレット<kbd>Ctrl + Shift + P</kbd>で"num"と入力し、サジェストから"Numberd Bookmarks: List from All Files"を選択し、ジャンプしたいブックマークを選びます。
左端の数値が行番号で、違うファイルのブックマークは下にファイル名が表示されます。

![vb1.png](https://qiita-image-store.s3.amazonaws.com/0/22772/661c0f6f-02b3-d890-a2f1-7bfa888037ca.png)

### Cobalt2 Theme Official

[Cobalt2 Theme Official] (https://marketplace.visualstudio.com/items?itemName=wesbos.theme-cobalt2)というカラーテーマがあったので使ってみました。上のSSがCobalt2というカラーテーマのもので、下のSSがデフォルトのDark+のものです。
Dark+より若干明るい感じで視認性が良かったです。

**Cobalt2**

![vs_cobalt2.png](https://qiita-image-store.s3.amazonaws.com/0/22772/a0afccb0-b252-e777-2634-4d16d9b47238.png)

**Dark+ (default)**

![vs_darkp.png](https://qiita-image-store.s3.amazonaws.com/0/22772/4166f10b-f7ca-913b-9ddf-9aa6e2b1a247.png)