Node.js & NPM
●Node.js全般 ※ハンズオンNode.js より抜粋
◆特徴
– イベントループによる平行処理
Node.jsの第一の特徴としてあげられるのは、並行処理をマルチスレッドではなくイベントループによって実現するというものです。イベントループは単一のスレッド(シングルスレッド)で動作するため、マルチスレッドのようなリクエスト数の増大に伴う問題が起きづらくなっています。
イベントループは実行すべきタスクをキューに積み、これを1つづつ取り出してシングルスレッドで実行していきます。逐次処理のようですが、これで並行処理を実現できるのは、ここでのタスクが一連の処理をI/Oの発生するタイミングを境に分割した物だからです。プログラムはI/O実行時にその完了後のタスクを指定し、実際にI/Oが完了すると指定されたタスクがキューに追加されます。
– スモールコアとnpm
– モジュールシステム
⇒CommonJSモジュール
⇒ESモジュール
– ECMAScript標準とWeb標準
⇒ES2015(ES6)
◆非同期プログラム
コールバック:コールバックを利用する非同期プログラミングは、Javascriptにおける非同期プログラミングの実装パターンとして最も基本的なものです。このパターンでは、非同期に処理を行う関数に引数として渡したコールバックが処理完了時に実行されます。Node.jsのコアのAPIでも、コールバックを利用した非同期APIが数多く提供されています。
- try…catch
- コールバックヘル
⇒Promise
Promiseインスタンスの状態
- pending
- fullfilled
- rejected
※fullfilled、recectedになったPromiseインスタンスの状態はそれ以降変化せず、これらの状態をsettledと総称する。
⇒ジェネレータ
- イテレータとイテラブル
- next(), throw()
◆EventEmitterとストリーム
●node、npm本体のインストール・アップデート
– nodeはホームページから最新版をダウンロードしてインストールする。Node.jsがインストールされている場所は、通常C:\Program Files\nodejs。
– nodeのバージョンを確認するにはnode -v。node.js自身のバージョン管理に関してはこちらにまとめて記載。
– npm本体は以下にてアップデートが可能。
⇒$ npm update -g npm
– 全てのnpm Globalパッケージを最新化するには以下(参考)。
⇒$ npm update -g
●package.json
– npm initにてpackage.jsonが作られ、ここでパッケージ管理がなされる。Pythonのようにvenv等しなくても簡単にパッケージ管理ができるので楽。
⇒参考:http://phiary.me/node-js-package-manager-npm-usage/。
⇒package.jsonの中身についてはこのページがわかりやすい。
– –saveもしくは–save-dev(=-D)で、package.json の dependencies, もしくは devDependencies に バージョン付きで依存関係のあるパッケージが登録される(npm v4 以下では dependencies として追加するときに–saveを指定しないとpackage.jsonに反映されない)。
– npm listで該当プロジェクトでインストールされているパッケージ一覧を表示。-gをつけるとグローバルでインストールされている一覧が表示される。
– ^(キャレット)~(チルダ)の意味
⇒https://github.com/npm/node-semver#tilde-ranges-123-12-1
– postinstall ⇒参考
– 単にnpm updateをしてもpackage.jsonで制限されて本当の最新パッケージは出来ない。従ってアプリで使用しているパッケージを最新版にするには、package.json自体を書き換える必要があり、それにはnpm-check-updates が便利。
$ npm install -g npm-check-updates
$ ncu
$ ncu -u
$ npm install
●node_module
– npm installにてnode_moduleというフォルダが作られ、そこにパッケージがインストールされる。
⇒ -g は、パッケージを $NODE_HOME/lib/node_modules/ にインストールするオプション。http://qiita.com/suzuki-sapporo/items/1748dcaacfe244010980。グローバルインストール(-gオプション)したモジュールが格納される場所の確認方法※:npm root -g
以下コマンドにより、.bashrcにNODE_PATH設定をするようにする。
>echo export NODE_PATH=npm root -g>>.bashrc
また、以下コマンドでライブラリ(グローバルなnode_module)にリンクを張り、ライブラリが見つからない事象を回避できる→参考
npm link A(ライブラリ名)。
-gでインストールしたパッケージをアンインストールするには、npm uninstall -g XXX (npm rm -g XXX)→参考
●Node.jsが入っている場所を知るには?
→which node
●パス探索ルールについて
http://qiita.com/hosomichi/items/149b28c89a012ead26aa によると、下記のとおり。
①カレントディレクトリのnode_modulesディレクトリから名前の合致するモジュールを探す
②カレントディレクトリにnode_modulesが存在しなければ、親ディレクトリをたどってnode_modulesディレクトリを探し、あれば、そこから名前の合致するモジュールを探す
③環境変数NODE_PATHで指定されたディレクトリから名前の合致するモジュールを探す
④$HOME/.node_modulesディレクトリから名前の合致するモジュールを探す
⑤$HOME/.node_librariesディレクトリから名前の合致するモジュールを探す
⑥/usr/local/libディレクトリから名前の合致するモジュールを探す
●モックアップサーバ(バックエンド)について
Angular(xx.component.ts -> xx.service.ts) -※> Node.js & Express(server.js) ->Cloud(mongodb)となっている際に、修正したコードをHerokuへ都度アップすることなくローカルで確認したい時(※のAPI(http)も動かす)には、以下の3つの方法がある。
①terminalより先にjson-serverを起動したうえで、angularを起動させる。
②assetsフォルダ配下にjsonファイルを作成しxx.service.tsにて読み込ませる方法もある。
③node server.jsを起動した上で、ng serveにてフロントエンドを起動。
①②はローカルにjsonファイルを作成してデバックする方法(②はIDを指定しての読み込みやdelete/putが出来ないことから①のjson-serverが便利)。従って実際のCloudからDBを引っ張ってくることは出来ない。
一方で③でやればnode server.jsにてCloudのDBアクセスが可能であるためこれが一番お勧め。実際の起動方法は、npm run XXXにて実行(詳細は下記「プロキシ設定が必要」による)
⇒json-serverの使い方(①の場合)
– https://www.webprofessional.jp/mock-rest-apis-using-json-server/を参考に設定。プロジェクトフォルダ直下にjsonファイル(=DB、下記の場合contactdata2.json)を作成し、json-serverを起動する。
(例)json-server –watch contactdata2.json –routes routes.json
–watchをつけると、jsonファイルが更新可能になる。
– json-serverの動作確認は、別terminalよりcurlを起動し実施(例:curl “http://localhost:3000/api/contacts/1″)
上記のように※で/apiなど更に1階層かましている場合は、routes.jsonを使う必要がある。https://www.npmjs.com/package/json-server#custom-routes-example
– Json-serverの注意事項として、jsonファイルの”id”は他変数だとNG(例えば_idだと、上記のcontacts/1は動作しない)なので要注意。”Id values are not mutable ”とのこと。
⇒プロキシ設定が必要(①③)
– フロントエンド(ブラウザ~Angular)はlocalhost:4200、
バックエンドは上記のようにjson-server若しくはnode server.jsにてlocalhost:3000
など、双方別ポートで動作させる必要がある。
– そこで、proxy.conf.jsonファイルを作成のうえ、package.jsonて”scripts”の”start”にて
”start”: “ng serve –proxy-config proxy.conf.json”
のようにスクリプトを記載の上、angular起動はng server –openではなくnpm run start(若しくはnpm start※)にて起動させることで、フロント⇒バックへの通信はポート3000へフォワードされる。https://qiita.com/ksh-fthr/items/a462a96de7080092b73c
– 更にnpmよりnpm-run-allをインストールしておくと、powershellを2つ開かなくても出来る。https://qiita.com/minase_tetsuya/items/986feac7150ed74e13d8
具体的には、package.jsonのscriptsのstartのところに
”start”: “run-p debug1 debug2”
として、debug1及びdebug2のスクリプトを書いておけば、npm startだけで全てを実行してくれる。
※start/stop/restartといった予約されたスクリプト名を使うとrunが省略できる。→https://maku77.github.io/nodejs/npm/npm-run.html
●API
– https://nodejs.org/api/fs.html
– https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback
●サンプルコード(example.js)
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
⇒上記をAWSで動かす場合は、
AWSのセキュリティグループのインバウンドルールに8124ポートを追加しhttp://ec2-xx-xx-xx-xx.us-west-2.compute.amazonaws.com:8124/をアクセスすると、”Hello World”が表示される。
●その他
・npm config ⇒参考
・環境変数の確認:
node
>process.env
にて、環境変数が確認できる。
⇒PORTを変更するには? Linuxの場合、export PORT=XXXX:参考
・環境変数の設定
この記事を参考にプロジェクトフォルダに.envファイルを保管し、dotenvをnpmより–saveオプションでローカルインストール後、server.jsを一部変更してdotenvを読み込ませることで、直接mongodbのURLをプログラム中に埋め込まなくても、データを読み込ませることができた。
⇒process.envに書くという方法もあるようだが、ローカルに設定したいのでこれは止める。
但し、このコードでherokuにアップすると、dotenvがネック?でエラとなり上手くいかず。(herokuを使用するときは、素直に環境変数設定したほうがいいと思われる)
Express
●expressを動かすには
express test←アプリ名
cd test
npm install
npm start
http://localhost:3000/ にアクセスし、”Welcome to Express”が表示れればOK
●関連パッケージ
・body-parser:expressでpostで値を受け取るときに必要なミドルウェア。https://gist.github.com/yamachanyama/029ng build
http-server -p 8080 -c-1 dist/
07e4ef71b19ec358ec9349be2af7c
https://nodejs.keicode.com/nodejs/body-parser-json.php
その他npmパッケージ
●http-server ⇒関連記事
ビルドした後に動かすには以下を実施。
ng build
http-server -p 8080 -c-1 dist/
コメントを残す