Because We Love Happy Coding

フリーライターからエンジニアへ。発信力だけあり余ってる感じ

Node.jsについてわかったことまとめ

Node.jsについてわかったこと

仕事でがっつりNode.jsと取り組んだ結果、わかったことまとめ。

https://nodejs.org/en/nodejs.org

Node.jsって何?

よく「サーバーサイドJavaScript」と呼ばれるけど、実際どういうことかわかりづらい。

通常ブラウザ上で実行されるJavaScriptを、サーバー(あるいはPC)上で実行できるようにする環境。ブラウザの代わりにJavaScriptを動かす、というイメージ。

2018-03-21(水)時点では8.10.0安定版と9.8.0最新版がnodejs.orgのトップページからダウンロードできる。

特徴として

  • シングルスレッド処理なので、一カ所で処理がもたつくと他の処理が進まない。
  • 基本非同期処理なので、重めの処理が開始されるとそれが完了する前に次に着手してしまう。promiseを上手に使う必要がある。
  • 軽い処理をガンガン回すのに向いている言語仕様。htmlのリクエスト/レスポンス処理など。

便利な点

Node.js独自のAPI

Node.js独自のAPIが用意されていて、いろんなことができる。

  • Process,ChildProcess
  • Stream // データを切れ目なく処理する

モジュール、パッケージマネージャー

いくつかのモジュールに分かれており、必要に応じて読み込むことで、ブラウザ上のJavaScriptにはない機能を導入できる。標準でインストールされるモジュールもあるし、それ以外のモジュールはnpmというパッケージマネージャーで簡単にインストール、管理できる。

など。

ES6対応

Node.jsのバージョンにもよるが、ES6のような最新のJavaScriptに対応している。ブラウザでは未対応のJavaScriptが持つ機能をフルに使ってコーディングできる。便利。やっとアロー記法慣れた。async / awaitまだよくわからん。

stream

データを切れ目なく扱う方法。Node.jsで特徴的なので使いこなせると便利らしい。

切れ目がないので、行単位だったり、画像1枚単位だったりで切り出すためにはいったん出力をため込んで解析する必要がある。

ReadableStream(延々データを出力し続けるストリーム)とWritableStream(延々データを呑み込んで処理し続けるストリーム)がある。stdinはWritable、stdoutはReadableのストリーム。

StreamにはhighWaterMark(以前はBufferSize)という値があり、この値を超えた状態からこの値以下に下がった時にdrainイベントが発生する、みたい。

この辺の挙動がどうもまだよくわからない。highWaterMarkを大きくすればその値までため込んでくれるのかと思ったけど、なんかうまく使いこなせなかった。

stdin / stdout

標準出力。Streamの一種として扱われる。highWaterMarkが低く(0?)設定されているらしく、他の言語にあるような「ため込んでおいてflush」という使い方は基本しないみたい。

Buffer

Bufferはメモリ上に直接確保されるので、最初にサイズが固定され、その後変更することはできない。

Instances of the Buffer class are similar to arrays of integers but correspond to fixed-sized, raw memory allocations outside the V8 heap. The size of the Buffer is established when it is created and cannot be resized.
--via Buffer | Node.js v9.8.0 Documentation

そのため、String型のような自由な操作ができなくなっている、とのこと。

stackoverflow.com

でもこの投稿者が考えたfunction read(x)は、まさに私が必要としていたもので、しかも使えそうな予感はある。

参考URL

Node.js の Stream API で「データの流れ」を扱う方法 - Block Rockin’ Codes Node.jsの標準入力と - Qiita Node.jsで捕捉されなかったPromise内の例外をスタックトレースで表示する - Qiita node.jsで標準出力に改行なしで出力する - Qiita Node.jsで画像アップロードを受けつけるサーバー - Qiita プログラマーズ雑記帳 - シグナルイベント) Communicating between NodeJS processes – Norbert de Langen – Medium Node.jsのconsole.logとprocess.stdout.writeの違い - Tatsuya Oiwa Node.jsのFile Systemで画像を扱うときの出力方法 - Atsushi Mori's blog SCAITY(スケイティー) OSDN Magazine Node.js Performance 改善ガイド - from scratch node.jsとネイティブアプリで通信を行う方法について - Google グループ Node.jsで子プロセスを起動し、非同期的に実行する - 情報アイランド POSTD Node.jsで子プロセスの標準入出力を処理する - 情報アイランド Second child process doesn't receive data when using the stdout of first child process as stdin of second · Issue #9413 · nodejs/node ffmpeg - Buffer a stream piped to res in node.js/express - Stack Overflow node.js - Stdout flush for NodeJS? - Stack Overflow process - Communicating between two different processes in Node.js - Stack Overflow node stdout.pipe - Google 検索 pipe() node.js - Google 検索 node.js 画像をbufferに出力 - Google 検索 Node.js マルチスレッド pipe - Google 検索