Node.jsを学ぶ-The definitive Node.js handbook-1

Tatsuya Asami
9 min readNov 24, 2018

--

【所要時間】

1時間24分(2018年11月24日)

【概要】

【要約・学んだこと】

  • 最近(2018年9月)書かれた記事で、記述方もES6なのでこの記事で学ぶことにした。

Node.jsはサーバー上で動作するJSのruntime環境のこと。

It’s fast

強みの一つは速度である。Node.js上で動くJSコードは、CやJavaのおよそ2倍速で動き、ノンブロッキングパラダイムのおかげでPythonやRubyのようなインタプリタ型言語より速い。

インタプリタ型とは作成したら即座に実行できる反面、変換してから実行をするため、処理速度はコンパイラ型言語よりも低下する。

It’s simple

Node.jsは単純明快。

It’s JavaScript

JavaScriptで書ける。(私の場合JavaScriptをすでに使用しているので、学習コストが下がるであろうという判断でNode.jsを学ぶことに決めた)

It runs on V8

Google V8 JavaScriptエンジンで動作しており、高速化されたChrome JavaScriptランタイムを活用できる。

It’s an asynchronous platform

伝統的なプログラム言語(C, Java, Python, PHP)は非同期処理のために”opt in”を明記する必要がある。JSONを読むリクエストを実行するなら、レスポンスが準備できるまで特定のスレッドの実行がブロックされる。

JSでは非同期処理とノンブロッキングコードがシングルスレッド、コールバックファンクション、イベントドライブンプログラミングを使うことで非常に簡単に使うことができる。他のプログラムが終了するのを待たずに、処理を続けながら呼び出されるコールバック関数を渡すことができる。これはブラウザからもらった発想だ。

そのため、バグの原因となりがちなスレッドの並行性を管理の負担を導入せずに、単一サーバーで何千もの同時接続が処理できる。

Node.jsがスレッドをブロックする代わりにI/O操作を実行する必要がある場合、データベースやファイルシステムにアクセスするのは、待機中のCPUサイクルを消費する代わりに、応答が返ってきた時に操作を再開する。

It has a huge number of libraries

500,000にもおよぶオープソースパッケージがある。

A sample Node.js application

const http = require('http')const hostname = '127.0.0.1'
const port = 3000
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`)
})

server.jsとして上記のスニペットを保存し、node server.jsをターミナルで実行すると

上記のようにHello Worldが表示される。

このコードは最初にhttp moduleを組み込む。

Node.jsはネットワークのfirst-classサポートを含む素晴らしいstandard libraryがある。

httpのcreateServer()メソッドは、新しいHTTPを作り、それを返す。

このサーバーは指定されたポートとホスト名をリッスンするようにセットされる。サーバーが準備できると、コールバック関数が呼ばれ、この場合ではサーバーが実行中であることを知らせてくれる。

新しいリクエストを受け取るたびに、リクエストイベントが呼ばれ、2つのオブジェクトを提供する。request(http.IncomingMessageobject)とresponse(http.ServerResponseobject)だ。

これら2つのオブジェクトはHTTPコールを扱う上で不可欠である。

requestはリクエスト詳細を提供する。この例では使われていないが、リクエストヘッダーやリクエストデータにアクセスできる。

responseは呼ばれたデータを返す。この例では

res.statusCode = 200

となる。

statusCodeプロパティを200にセットし、responseが成功したことを示す。

res.setHeader('Content-Type', 'text/plain')

Content-Typeヘッダーをセットする。

res.end('Hello World\n')

responseを終了し、end()の引数としてコンテンツを加える。

Node.js frameworks and tools

Express
最もシンプルでパワフルなウェブサーバー。最小限のアプローチをし、サーバーのコアの機能にフォーカスを当てていないことが成功のキーとなる。

Meteor
フルスタックフレームワーク。JSを使ってアプリを構築し、クライアントとサーバー上でコードを共有する同型的なアプローチができる。

Koa
Expressと同じチームに作られた。より単純で小さい。既存のコミュニティを混乱させずに、互換性のない変更が必要だったので生まれた。

Next.js
Reactのサーバーサイド。

Micro
非同期HTTPマイクロサービスを作るためのとても軽いサーバー。

Socket.io
ネットワークアプリを構築するためのリアルタイムコミュニケーションエンジン。

A brief history of Node.js

Node.jsは2009年に生まれた。2018年はNode10、ES modulesmjs の実験的なサポートが始まった。

Differences between Node.js and the Browser

ブラウザとNode.jsでのJSの違いについて。

どちらもJSをプログラミング言語として使う。

ブラウザ上でアプリを構築するのと、Node.jsアプリケーションを構築するのは完全に異なる。

ブラウザ上では多くの時間をDOMやその他CookiesなどのWebプラットフォームAPIとの相互作用を行う。ブラウザに提供されるdocument, window、その他オブジェクトを持たない。

また、ブラウザ上では、ファイルシステムがアクセスする機能のようなモジュールを通してAPIを提供するわけではない。

もう一つの大きな違いは、Node.jsは自分で環境をコントロールする。自分がオープンソースアプリを構築しない限り、誰もデプロイできない。訪問者が使うブラウザを選ぶことができないブラウザ環境と比べて、これは便利である。

つまりES6,7,8,9全てのNode versionで書くことができる。JSは流行り廃りが速いが、ブラウザはそうでもない。Babelでコード変換をする必要もない。

さらなる違いは、Node.jsは CommonJS module systemを使う。ブラウザではESモジュール標準が実装され始めている。

実際には当面Node.jsでrequire()を使用し、ブラウザでインポートすることを意味する。

The V8 JavaScript Engine

V8はGoogle ChromeのJSエンジンである。クロムでブラウジングしている時に使う。

V8はJSの実行にランタイム環境を提供する。DOM, ブラウザに提供されるその他Web Plagform APIだ。

いい点としては、JSエンジンはホストされたブラウザによって独立している。この特徴はNode.js.V8が2009年にNode.jsによってエンジンが選ばれる理由となった。V8はJSで書かれるサーバーサイドコードとして力を持つようになった。

Node.jsエコシステムは巨大で、そのおかげでV8もまたElectronのようなプロジェクトでデスクトップアプリを強化している。

Other JS engines

これらは全てJSで使用される標準のECMAScriptとも呼ばれるECMA ES-262を実装している。

The quest for performance

V8はC++で書かれ、継続的に改善されている。Mac, Windows, Linuxなど他のシステムでも使われる。

V8について詳しくは V8 official siteを参照。

V8は他のJSエンジン周りと同様にいつも進化し、WebやNode.jsエコシステムの高速化を試みている。

ウェブ上ではここ数年パフォーマンスの競争が行われているおかげで、毎年のようにマシンが高速化、最適化されている。

Compilation

JSは一般的にインタプリタ型言語と考えられるが、最近のJSエンジンはただのインタプレタするのではなく、コンパイルもする。

JSは、実行速度を上げるためのV8のJIT(just in time)コンピレーショによって、内部でコンパイルされる。

我々のアプリは、フォーム検証や単純なスクリプトだけではなく、ブラウザ内部で数時間実行することが可能である。

この新しい世界では、JSをコンパイルすることは理にかなっている。なぜならJSの準備に少し時間がかかるが、一度それが終われば、純粋にインタプレタされるコードよりもあるかにパフォーマンスが高いからだ。

【わからなかったこと】

  • 特になし(全体的にはっきりとはわかっていない。)

【感想】

  • 概念を改めておさらい出来た。仕組みを理解するのはいつも難しく、疲れる。ここから先にはコードがたくさん出てくるので、基本的な使い方が学べそうだ。

--

--

Tatsuya Asami
Tatsuya Asami

Written by Tatsuya Asami

Front end engineer. React, TypeScript, Three.js

No responses yet