WindowsにNode.jsの開発環境を構築するにあたりMicrosoft公式のガイドラインをちゃんと読んでみた

さっくりWindowsにNode.jsの開発環境を構築してみたのですが、iconvをnpmでインストールしようとしたらエラーで怒られた。調べていると、[Microsoftの公式ガイドライン](https://github.com/Microsoft/nodejs-guidelines/blob/master/windows-environment.md#configuring-your-windows-development-environment)に辿り着いたので、
一度きちんと読んでみる。

# 目次 
1.コマンドラインコンソール、およびその他ツール
2.エディタ/IDE
3.MAX_PATHの説明と回避策
4.ネイティブアドオンモジュールのコンパイル
5.まとめ

# コマンドラインコンソール、およびその他ツール
ここでは、Node.jsで開発する際に使用することとなる「コマンドラインコンソール」と開発を便利にするためにMicrosoftがおすすめする各種ツールの紹介がされている。
## コマンドラインコンソール
いくつか開発時のコンソールツールとして紹介されている。ツール自体の説明は本流ではないため省きます。
### CMD
cmdもWindows10でいくつかの改良がなされているので、一度離れたユーザも含めて、Node.jsを利用するなら今一度チェックするとよいとの事。（まあ、宣伝でしょう）
### PowerShell
PowerShellは慣れるまでに少し時間がかかるが、習得する価値はありそうとの事。「ls」など、いくつかのエイリアスも用意されているため、bashに慣れ親しんだユーザであれば割りと馴染むでしょうとの事。（まあ、宣伝でしょう）
### Cygwin
bashに慣れている人やUnix/Linux環境上で動作するNodeアプリケーションを開発する場合はCygwinが便利でしょう。
### Git for Windows、GitHub Desktop
Gitを扱うためのコマンドやGUIツールだけでなく、MSYS/MinGWベースのシェルも提供しているので、Cygwinと同様にbashに慣れ親しんでいる人はコンソールとして利用することができるでしょう。
### その他のターミナルエミュレータ
cmderとかConEmuとか。
## 各種ツールの紹介
その他開発に便利なツールもいくつか紹介されています。
### Chocolatey
Windows版のapt-get。類似ツールはいくつかあるけど、Chocolateyが最も広く使われているとの事。
### Git
？？？
インストール時のchcolateyコマンドラインが書いてあるのみ。普通Git使うでしょ、って事か？
### nvm-windows
Node.jsは頻繁に新しいバージョンがローンチされるが、1環境で複数バージョンのNode.jsを管理するには、nvm-windowsをインストールしておくと良いでしょう。
### npm-windows-upgrade
npmはNode.jsとセットでインストールできるのだが、npmのバージョンアップをしようとした場合、いくつかのステップを踏む必要がある（要するに面倒）。それをよしなに上手いことやってくれるツール。Microsoft純正っぽい。
### Putty
sshクライアント。以上。
（いつ使うかは不明）
### WinSCP
(S)FTPクライアントツール。SCPもWebDAVも使えるよ。以上。
（むしろ(S)FTPがメインなんだ。確かにプロトコルのデフォルトはSFTPになってるな。）
### Fiddler
ブラウザ用のデバッグツールだけど、Node.jsからのサーバサイドリクエストのビューアとしても使えるとの事（Node.js「からの」って言うのがちょっと意味わからん）

# エディタ/IDE
エディタ、IDEとしては以下3つを取り上げていた。

- Visual Studio Code
- Node.js Tools for Visual Studio（Visual Studio）
- WebStorm

特筆することはなさそうなので、環境と好み応じて選べばよさそう。

# MAX_PATHの説明と回避策
MAX_PATHとは、WindowsのツールやAPIで設定されている、ファイルパス名の最大文字数のこと。260文字という最大文字数が存在する。（Eclipseをディレクトリ階層が深いところに解凍しようとするとうまくいかないアレのことか）
Node.jsでプロジェクトを作成したりする場合も、依存ライブラリ等はプロジェクトフォルダ以下に展開されて読み込まれるため、気をつける必要がある。

## 回避策
Node.jsで開発する上で、MAX_PATH問題に引っかからないように、以下のことを留意しておく必要がある。

- パスが短くなるようにする。（プロジェクト作成位置とか、なるべく階層の浅いところでやりましょう、ってことです。）
- `npm install -g rimraf` でMAX_PATHを上回るファイルを削除できる。
- `npm dedupe` で依存モジュールの重複を削除できる。（深い階層にあるモジュールがより浅い階層のものと重複している場合、深い階層のほうを削除してくれる。）
- `npm install -g flatten-packages` で全ての依存モジュールをTOP階層に集約してくれる。（ただし、同じモジュールのバージョン違いの場合などは注意が必要。）
- npmのバージョンを3以上にする。（node_moduleフォルダを限りなフラットにして階層を減らしてくれる）

どうやら、MAX_PATH問題は上限なくすようMicrosoftが頑張ってくれているみたいですが、ローンチはまだ先になりそうです。

# ネイティブアドオンモジュールのコンパイル
Node.jsではC++で記述されたプログラムをネイティブアドオンとして読み込んで実行することができる。自ら実装する場合もそうだが、依存モジュールが利用している場合もある。

## 環境設定
以下2通りの方法が提示されている。

- オプション１：npmでビルドツールを適用する
Microsoft純正？のwindows-build-toolsをnpmインストールすることで、必要なビルドツールを整えることができる。以下のコマンドを管理者権限で実行したPowerShellで実行する。
`npm install -g windows-build-tools`

- オプション２：手動で頑張る
上記ツールは使わず、手動で頑張ることも出来るとの事。
    1. Visual Studio Build Toolsインストールする（"Visual C++ build tools"ワークロードを適用）。または、Visual Studio 2017 Comunitをインストールする（ "Desktop development with C++"ワークロードを適用）。
    2. Python2.7をインストール。その後`npm config set python python2.7`を実行。※Python3系はサポートされてないので注意！
    3. `npm config set msvs_version 2017`を実行。（たぶん1でインストールしたVisualstudioの適用だと思う）


よっぽどの理由がなければビルドツール適用の方でやればいいと思われ。

## 設定の確認
きちんと設定されているか、以下のパッケージをnpmインストールしてみることで確認できるみたい。

 - bson
 - bufferutil
 - kerberos
 - node-sass
 - sqlite3
 - phantomjs
 - utf-8-validate

インストール時に発生するエラーとそれの対処方法は以下の通り。

| エラー内容 | 原因 | 対処方法 |
|:--|:--|:--|
|Python関連|Python2.7がインストールされてないか、見つからないため。| ・Python2.7をインストールし、PATHに追加。<br /> ・npmインストール実行時、引数として`--python=2.7`を与える。<br /> ・`npm config set`でPython2.7をデフォルトに設定する。|
|msbuild, Visual Studio, or VC compiler関連|VCコンパイラがインストールされていないか、正しく設定されていないため。|・VC++コンパイラをインストールする。<br />・npmインストール実行時、引数として`--msvs_version=2015`（またはその他のVSバージョン）を与える。<br /> ・`npm config set msvs_version 2015 -g`でVSバージョンをデフォルト設定する。|
|NaN/Node/v8/iojs関連のシンタックスエラー|パッケージとNode.jsのバージョンに互換性がないため。|・インストールするパッケージもしくはNode.jsを最新バージョンにして試す。<br />・Issueを漁ってみる。|
|その他シンタックスエラー|パッケージが各種コンパイラのバージョンと互換性がないため。|・インストールするパッケージもしくはNode.jsを最新バージョンにして試す。<br />・Issueを漁ってみる。|
|コマンドおよび*.hファイルの欠落|設定はおそらく正しいが、他の前提条件に漏れがあるため。|・パッケージのバージョンを最新にする。<br />・ドキュメントを参照し前提条件に漏れがないかを確認。PATHに追加されているかも確認。<br />・ヘッダファイルを探してみる。<br />・Issueを漁ってみる。|
|MSB4019 エラー|古いバージョンのVSやVCコンパイラが既にインストールされているため。|・環境変数VCTargetsPathを追加または変更し、C++ビルドツールのトップ階層を向くようにする。`C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140`のようなパスになるはず。<br />・Issueを漁ってみる。|
|__pfnDliNotifyHook2 redefinition エラー|npmのバージョンが古いため。|・`npm -g install npm@next`を実行。|

### まとめ
序盤はツールの紹介が多いですが、ここに記載のあるツールを選んでおくのがいいのでしょう。設定系は4のコンパイル設定ぐらいですが、今回iconvがインストールできなかったのもどうやらPythonがインストールされていなかったからのようで、こういうところをきちっとやっておかないといけないんだな、と感じた。
Node.jsの開発したいのに、PythonとかC++のコンパイラがないとダメって、普通に想像したら思いつかないし。