仕事で新しくWebシステムを作成することになりました。規模もそこまで大きくないので、Python+Flaskで作成で良いだろうと思っていたところ、若手からNode.jsで書かせろ!とのこと。私もエンジニアとして老害化が進んで来ているのでは?と悲しい気持ちになりました。
Node.jsを改めて勉強しよう
実は過去何度かNode.jsには挑戦しています。JavaScriptは言語として好きですし、Webエンジニアを自称する身としてもサーバサイドとフロントサイドを同じ言語で記述できることに魅力を感じています。しかしながら、Node.jsの非同期型のイベント駆動モデルを理解仕切ることができず毎回挫折しています。せっかくの機会です。老害化への恐怖をモチベーションにもう一度Node.jsに挑戦してみましょう。
まずは、開発環境を最近のメイン環境であるmacOS(High Sierra)上に構築しないといけません。Node.jsの公式サイトからmacOS向けのバイナリがダウンロード可能ですが、Node.jsについてもrubyenvやpyenvのようなバージョン管理の仕組みがあるはずです。探してみると、nvm、nodebrewが使えそうです。両方ともmacOS、Linux環境で使えるようです。評判の良さそうなnodebrewでNode.js環境を構築することにしました。
nodebrewをインストール
nodebrewの公式サイトの指示に沿って環境構築を行います。ターミナルからperlで書かれたインストールスクリプトを実行します。
$ curl -L git.io/nodebrew | perl - setup
私はログインシェルとして zsh を使っているので、 $HOME/.zshrc に次ぎの3行を追加します。
if [ -d "$HOME/.nodebrew/current/bin" ]; then export PATH=$HOME/.nodebrew/current/bin:${PATH} fi
編集した .zshrc を読み込んで 「nodebrew help」コマンドで nodebrew のヘルプが表示されれば nodebrew のインストールは完了です。
$ source ~/.zshrc $ nodebrew help nodebrew 1.0.0 Usage: nodebrew help Show this message nodebrew install <version> Download and install <version> (from binary) nodebrew compile <version> Download and install <version> (from source) nodebrew install-binary <version> Alias of `install` (For backword compatibility) nodebrew uninstall <version> Uninstall <version> nodebrew use <version> Use <version> nodebrew list List installed versions nodebrew ls Alias for `list` nodebrew ls-remote List remote versions nodebrew ls-all List remote and installed versions nodebrew alias <key> <value> Set alias nodebrew unalias <key> Remove alias nodebrew clean <version> | all Remove source file nodebrew selfupdate Update nodebrew nodebrew migrate-package <version> Install global NPM packages contained in <version> to current version nodebrew exec <version> -- <command> Execute <command> using specified <version> Example: # install nodebrew install v8.9.4 # use a specific version number nodebrew use v8.9.4
nodebrew で Node.js をインストール
nodebrew が使えるようになったので、実際に Node.js をインストールしていきます。
まずは、インストール可能な Node.js のバージョンを調べます。
$ nodebrew ls-remote v0.0.1 v0.0.2 v0.0.3 v0.0.4 v0.0.5 v0.0.6 v0.1.0 v0.1.1 v0.1.2 v0.1.3 v0.1.4 v0.1.5 v0.1.6 v0.1.7 v0.1.8 v0.1.9 v0.1.10 v0.1.11 v0.1.12 v0.1.13 v0.1.14 v0.1.15 ・・・ v10.0.0 v10.1.0 v10.2.0 v10.2.1 v10.3.0 v10.4.0 v10.4.1 v10.5.0 io@v1.0.0 io@v1.0.1 io@v1.0.2 io@v1.0.3 io@v1.0.4 io@v1.1.0 io@v1.2.0 io@v1.3.0 io@v1.4.1 io@v1.4.2 io@v1.4.3 io@v1.5.0 io@v1.5.1 io@v1.6.0 io@v1.6.1 io@v1.6.2 io@v1.6.3 io@v1.6.4 io@v1.7.1 io@v1.8.1 io@v1.8.2 io@v1.8.3 io@v1.8.4 io@v2.0.0 io@v2.0.1 io@v2.0.2 io@v2.1.0 io@v2.2.0 io@v2.2.1 io@v2.3.0 io@v2.3.1 io@v2.3.2 io@v2.3.3 io@v2.3.4 io@v2.4.0 io@v2.5.0 io@v3.0.0 io@v3.1.0 io@v3.2.0 io@v3.3.0 io@v3.3.1
リリースされた Node.js の各バージョンがインストール可能なことがわかります。安定板「stable」と最新版「latest」をインストールしておきます。
$ nodebrew install-binary stable Fetching: https://nodejs.org/dist/v10.5.0/node-v10.5.0-darwin-x64.tar.gz ######################################################################## 100.0% Installed successfully $ nodebrew install-binary latest v10.5.0 is already installed
2018年6月時点ではv10.5.0が最新版であり安定版のようです。一世代前の安定板についてインストールをしておきます。
$ nodebrew install-binary v8.11.3 Fetching: https://nodejs.org/dist/v8.11.3/node-v8.11.3-darwin-x64.tar.gz ######################################################################## 100.0% Installed successfully
普段は現時点での安定版を利用します。zsh を利用しているので $PATH のリロード(rehash)をしてNode.jsのバージョンを確認してみます。
$ nodebrew use stable use v10.5.0 $ nodebrew ls v8.11.3 v10.5.0 current: v10.5.0 $ rehash $ node -v v10.5.0 $ npm -v 6.1.0
v8.11.3に切り替えてみます。
$ ls -l ~/.nodebrew/current lrwxr-xr-x 1 moto staff 34 6 26 18:47 /Users/moto/.nodebrew/current@ -> /Users/moto/.nodebrew/node/v10.5.0 $ nodebrew use v8.11.3 use v8.11.3 $ nodebrew ls v8.11.3 v10.5.0 current: v8.11.3 $ ls -l ~/.nodebrew/current lrwxr-xr-x 1 moto staff 34 6 26 18:49 /Users/moto/.nodebrew/current@ -> /Users/moto/.nodebrew/node/v8.11.3 $ node -v v8.11.3 $ npm -v 5.6.0
なるほど。$HOME/node/current をシンボリックリンクで切り替えているだけなんですね。
nodebrew の問題
nodebrew は「nodebrew use
さらに、調べるとrbenvやpyenv、ndenvなどの「**env」をまとめたanyenvが存在することが分かりました。後ほどanyenvについても調べてみようと思います。