Node.js環境の整備
Node.jsはChrome の V8 JavaScript エンジン で動作する JavaScript 環境です。
もう少し平たく言うと、Google Chromeで稼働しているJavaScriptエンジンと同じ環境をブラウザから離れて利用するための環境です。
ブラウザ・サーバーサイド
Node.jsはブラウザで動いているJavaScriptとは若干違いがあります。ブラウザで動くJavaScriptはECMAScriptに準拠するかたちで実装されていきます(ES6,ES2015等と略されます)が、Node.jsのJavaScriptはCommonJSという別の基準があります。CommonJSはよくサーバーサイドJavaScriptと呼ばれます。
なぜサーバーサイドというかというと、このNode.jsだけでWebサーバーを稼働させることができるからです。
どちらもJavaScriptなので共通する部分も多くありますが、大きな違いはサーバーサイドJavaScriptでは、セキュリティ面からブラウザでは実装されないローカルファイルの取り扱いなどができることです。また、モジュールの取り扱いでは。ブラウザ(ES)では「import」を使うのに対し、CommonJSでは「require」を使います。
そのようなCommonJS独自の規則で書かれたコードはブラウザで動かそうと思っても動きません。
AngularやReact、Vue.jsなどいくつかのWeb開発用のフレームワークはこのNode.js上で動いています。
インストール
WindowsからNode.jsをインストールにはNode.jsのページにいって、インストーラーをダウンロードして実行するだけです。「推奨版」と「最新版」がありますが、「推奨版」を選ぶといいと思います。Node.jsの「最新版」は次のバージョンという意味合いが強く、既存のコードが動くかチェックする場合によく用いられます。
インストール時にNode.jsの環境に必要な他のパッケージのインストールも確認されますので、同梱させてください。
NVM
Node.jsのアップグレードは変化が大きいことで有名です。前のバージョンで動いていたものが次のバージョンでは動かないということも珍しくないそうです。
そのため、Node.jsのバージョンを可変にできるツールがあります。それがNVM(Node Version Manager)です。
こちらを使ったNode.jsのインストール方法も紹介しておきます。
もしNVMのインストールの前にNode.jsをインストールしてあった場合は既存のNode.jsをアンインストールします。
NVMにもインストーラーがありますが、手動でインストールした方が融通が利くのでここではmanual installation guideに従ってインスト―ルします。
- ダウンロード
nvm-windows/releasesから、「nvm-noinstall.zip」をダウンロードして展開します。
- 配置
展開してできたフォルダを「nvm」として好きな場所に置きます。ここではc:¥nvmとしました。Program Files等の領域ではファイアウォールが働いたりするのでお勧めできません。さらにパスにスペースや日本語のない場所の方が安定すると思います。
- 環境変数の設定
フォルダを配置したら、環境変数を2つ設定します。ひとつは「NVM_HOME」で、これは先ほどフォルダを配置した場所にします。もうひとつは「NVM_SYMLINK」です。これは基本的にはどこでもいいですが、ここでは「配置したフォルダ¥SYMLINK」としました。同名のファイルやフォルダがあるとエラーになるので注意してください。後で自動で(シンボリック)リンクが作成されます。
さらにここで設定した、NVM_HOMEとNVM_SYMLINKを環境変数の「Path」に加えます。文字列ではなく中の値を加えたいので、それぞれ「%NVM_HOME%」と「%NVM_SYMLINK%」と記述します。Pathの値の反映にはPCの再起動が必要なようです。
環境変数やPathの詳しい設定の方法はリンク先の記事にて説明しています。
- settings.txtの作成
最後にsettings.txtを作成します。これは先ほど作成したnvmフォルダの中に作成します。書式のサンプルも公式ページにあります。
root:にNVM_HOMEに設定した値、path:にNVM_SYMLINKに設定した値を入れます。porxy:にはプロキシを使っていれば記述しなければ「none」とします。arcにはOSのアーキテクチャを設定します。
筆者の場合は次のようになりました。
setting.txt
root:c:¥nvm
path:c:¥nvm¥symlink
proxy:none
arch:64
手動インストール時のNVMのアップデートの際は、該当のフォルダ内(ここではc:¥nvm)を展開した内容と入れ替えればいいです。バージョン確認する場合はnvm versionとします。
NVMの使い方
NVMはコマンドプロンプト、またはWindows Power Shell(Windows Terminal)から利用します。デフォルトのそれらの文字コード(コードページ)はShift-JISです。筆者が今回試したバージョン1.1.8ではShift-JISだとヘルプは日本語で表示されますが、エラーメッセージが文字化けしていました。
その場合は文字コードをUTF-8にします。方法はiPentec様を参考にさせていただきました。
UTF-8からShift-JISに戻すにはchcp 932とするか、ウインドウを一度閉じて開きなおします。
パスを通した状態でnvmと実行すると使用例が表示されますので、確認のため実行してみてください。
問題なければ次のように進めます。
- nvm list available
実行すると次のように、利用可能なバージョンのリストが表示されます。通常はLTSの中で一番新しいものを採用します。
>nvm list available | CURRENT | LTS | OLD STABLE | OLD UNSTABLE | |--------------|--------------|--------------|--------------| | 17.2.0 | 16.13.1 | 0.12.18 | 0.11.16 | | 17.1.0 | 16.13.0 | 0.12.17 | 0.11.15 | | 17.0.1 | 14.18.2 | 0.12.16 | 0.11.14 | ...
- nvm install 16.13.1 64
Node.jsをダウンロードします。ここでは16.13.1を指定しました。
最近のPCのアーキテクチャはほぼ64bitだと思うので問題ないと思いますが、32bit版をダウンロードしたい場合や、明示的にアーキテクチャを指定したい場合バージョンの後に32や64というアーキテクチャの値をセットします。ただし、現在のバージョンにおいてLinux版には32bitアーキテクチャは存在しません。
- nvm use 16.13.1
現在のNode.jsの環境を16.13.1にします。
nvm useコマンドは管理者権限が必要です。権限がないと「exit status 1: You do not have sufficient privilege to perform this operation.」のエラーがでます。
- nvm list
新しいバージョンを選択した後にに不具合が判明した際、前のバージョンに戻すにはlistコマンドでインストールしてああるバージョンのリストを確認します。
> nvm list * 16.13.1 (Currently using 64-bit executable) 14.18.1 14.17.3
対象のバージョンがわかったらnvm useで前のバージョンを選択します。
- nvm uninstall
二世代前のバージョン等、不要なバージョンがあった場合はnvm uninstall バージョンでアンインストールできます。
NPM(Node Package Manager)
NPM(Node Package Manager)はNode.jsで使うパッケージのインストールやアップデートを管理するアプリで、Node.jsのインストールに含まれます。
外部のライブラリを使いたい時はNPMでそれらを管理する省力化できます。逆に、すべてのスクリプトを自分で書くような場合には使用する必要はありません。
通常、Node.jsとともにインストールされますが、アップデートする時は自身を指定してグローバル領域(-gオプション)にinstall指示を出します。
PS> npm -v 8.1.2 PS> npm install -g npm removed 180 packages, changed 4 packages, and audited 40 packages in 7s 1 moderate severity vulnerability To address all issues, run: npm audit fix Run `npm audit` for details. npm notice npm notice New minor version of npm available! 8.1.2 -< 8.2.0 npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.2.0 npm notice Run npm install -g npm@8.2.0 to update! npm notice
「To address all issues, run: npm audit fix」の部分ですが、「npm audit」はセキュリティの監査用のコマンドです。パッケージの中に脆弱性が存在すると表示してくれます。
PS> audit
found 0 vulnerabilities
表示された脆弱性の数が0なら問題ありません。
これを先のメッセージに示されているように、fixオプションを付けて実行すると次のようなメッセージに変わりました。
PS> npm audit fix up to date, audited 1 package in 262ms found 0 vulnerabilities
マニュアル(npm audit -h)には説明が載っていませんでしたが、おそらく脆弱性のあるパッケージを更新するのがfix(修正)オプションだと思います。
Node.jsプロジェクトの初期化
記述するプログラムコードはフォルダ単位で管理します。フォルダの中に自身の書いたコードと、npmがインストールする外部のライブラリが存在するようになります。
Node.jsのプロジェクトとしてフォルダを初期化するには、プロジェクト用のフォルダを作成し、そこで「npm init」を実行します。先にも書きましたが外部のライブラリに依存しないJavaScriptのコードを実行するだけの場合はこれらの作業は必要ありません。
いくつか質問されますが、packege nameだけパッケージ名(アプリの名称)を付けてあとはエンターキーでデフォルトを選択していくと、pakege.jsonというファイルが作成されます。
Node.jsは今後このファイルに、プロジェクトで利用されるパッケージの情報を保存していきます。
PS> mkdir c:¥node-project ... PS> cd c:¥node-project ... PS> npm init ... package name: (node-project) version: (1.0.0) description: entry point: (index.js) test command: git repository: keywords: author: license: (ISC)
NPMの使い方
NPMの主な使い方は次の通りです。
- インストール
npm install パッケージ名
- パッケージ検索
npm search キーワード
- アンインストール
npm uninstall パッケージ名
- アップデート
npm update パッケージ名
ちなみに、npm(Ver8.2.0)のすべてのコマンドは次の通りです。これらのコマンドのあと-hオプションを付けて実行すると簡易ヘルプが表示されます。
コードの実行
Node.jsでJavaScriptのコードを実行したい場合は「node sample.js」とします。
引数はprocess.argvとして、コード内で抽出できます。この時、第1引数には実行したnode.jsのパス、第2引数にはスクリプトへのパスとなり、実際にパラメータとして与えた文字列は第3引数から始まります。
sample.js
console.log("引数の数:"+process.argv.length);
console.log("引数1:"+process.argv[0]);
console.log("引数2:"+process.argv[1]);
console.log("引数3:"+process.argv[2]);
上記のスクリプトに「param」という引数を付けて実行すると次のようになります。
PS> node sample.js param 引数の数:3 引数1:c:nvm¥symlink¥node.exe 引数2:c:¥node-project¥sample.js 引数3:param
package.json
前述のnpm initを実行すると、プロジェクトの情報がpackage.jsonファイルとして生成されます。プロジェクト名(name)やライセンス(license)、バージョン(version)、エントリーポイント(main)などのの基本情報の他、外部ライブラリの依存関係も記述されます(dependencies)。
dependenciesは開発環境に必要な依存と本番環境に必要な依存に別れて記述されています。たとえば非同期ライブラリであるrxjsは本番環境で必要なのでdependenciesにあり、TypeScriptはなどは環境ではJavaScriptに変換されるため不要なので、devDependenciesというまた別のエントリーに記述があります。
これらの詳細は公式のnpm:「package.json」に記載されていますが、このファイルを用いることで別環境でのセットアップや複数人数での開発時に利用するライブラリをそろえることができます。
package.jsonにはライブラリバージョンアップをどこまで許容するかも記されています。
次の例はchart.jsライブラリはマイナーバージョンが一致する場合のみ許容する(3.5.1は許容するが3.6.0は許容しない)、htmlparser2はメジャーバージョンが一致する場合のみ(7.2.1や7.3.0は許容するが、8.0.0は許容しない)許容するという設定になっています。他には不等号を使って範囲を指定している場合もあります。バージョンのほかに範囲を示すものがなければ、パッチ(リビジョン)まで固定という意味になります。ただし、メジャーバージョンが0の場合は例外的に挙動が変わります。バージョン0にはセマンティック バージョニング2.0において開発版という意味があるためだと思われます。下記のaxiosは0.25.0が存在していても明示しない限りアップデートされません。
"dependencies": {
"axios": "^0.24.0",
"chart.js": "~3.5.0",
"htmlparser2": "^7.2.0",
}
npm install の後に指定されたパッケージがpackage.json内に存在した時、これらのアップデートの許容ルールが適用されます。存在しない場合は指定したライブラリの最新バージョンが入り新たにpackage.jsonに記述されます。
このルールはパッケージをアップデートさせるnpm udateにも適用されます。この仕組みだだけ、一番最初に指定された範囲を超えたバージョンアップの確認ができないので、それを確認するコマンドが用意されています。それがnpm outdatedです。
npm outdated
Package Current Wanted Latest Location Depended by
axios 0.24.0 0.24.0 0.25.0 node_modules/axios dirname
chart.js 3.5.0 3.7.0 3.7.0 node_modules/chart.js dirname
また単に現在インストールされているパッケージとそのバージョンを確認したいだけの場合は、npm listとするとでてきます。
この状態でchart.jsのバージョンを3.7.0に上げたい時は、package.jsonを手動で書き直してもいいですが、バージョンを指定してinstallコマンドを実行します。これを利用してバージョンを下げることもできます。
npm install chart.js@3.7.0
npm installコマンドでパッケージを指定しなかった場合、このpackage.jsonに基づいてすべてのライブラリをインストールします。
package-lock.json
ライブラリのインストールやアップデートを行うとpackage.jsonファイルは書き換わっていきますが、それに呼応してpackage-lock.jsonというファイルも書き換わっていきます。
このファイルを覗くとpackage.jsonとおおよそ同じ内容が書いてありますが、それとちがってインストール済みのライブラリのバージョンとそのハッシュ値(integrity)などが含まれています。
...
"dependencies": {
"chart.js": "~3.5.0",
...
"node_modules/chart.js": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.5.1.tgz",
"integrity": "sha512-m5kzt72I1WQ9LILwQC4syla/LD/N413RYv2Dx2nnTkRS9iv/ey1xLTt0DnPc/eWV4zI+BgEgDYBIzbQhZHc/PQ=="
},
...
"chart.js": "~3.5.0"の部分はpackage.jsonに記述がありますが、"version": "3.5.1"の部分はありません。
"~3.5.0"という表記で環境が整えられていますが、実際の環境は、3.5.1がインストールされているのがpackage-lock.jsonを見ることでわかります。
また、このファイルを使うことで、構築した環境をライブラリだけでなくそのバージョンまで揃えてインストールすることができます。
その際用いられるコマンドは「npm ci」です。このコマンドを使うと、node_modulesフォルダは一旦削除されます。
利用パッケージの更新
前述の通り、利用するパッケージの互換性の問題で複数人数での開発に支障がでないように、package.jsonやpacckage-lock.jsonが存在しますが、これは依存パッケージをすべてアップデートしたいという際はこの機能が邪魔なこともあります。
そのようなときは、npm-check-updatesを使うと便利です。これは、依存しているライブラリのアップデート状況を確認して package.json ファイルを書き換えてくれるものです。
グローバル環境にインストール後 ncu とコマンドを打つとアップデートの確認ができ ncu -u とすることで package.json ファイルを更新します。更新後は通常のように npm install とすればすべてのライブラリのアップデートが可能です。
余談ですが、バージョンアップした npm 環境で ECONNREFUSED エラーに遭遇しました。これはデフォルトでのレポジトリへのアクセスがIPv6になったのが原因のようです。環境変数 NODE_OPTIONS に--dns-result-order=ipv4firstを指定することで回避ができるようです。
Node.jsはCommonJSの環境ですが、WebのJavaScript開発にも利用できます。またnpmにホストされている多くのパッケージがWebでの利用にも対応しています。複数のモジュールをバンドルするwebpackを使ってWeb用のJavaScriptを開発するための環境づくりの記事を別に設けましたので、よろしければご覧になってください。