kurodakazumichi / issues

0 stars 0 forks source link

【Node.js】基本とプログラミング #36

Open kurodakazumichi opened 6 years ago

kurodakazumichi commented 6 years ago

公式サイト

Node.js 日本語 Node.js 英語

Node.jsとは

サーバーサイドのJavasScript実行環境

Node.jsという名前から、新しいJavaScriptのライブラリかな?と思った。 サーバーサイドで動作するという文言もよくわからない原因の1つだった。

俺的に解釈では 「JavaScirptがブラウザ以外でも実行できるようになるプラットフォーム」

jQueryみたいな便利なライブラリではなく、実行環境。 最初から実行環境と書いてあったけどね。。。

ようはPHP、Ruby、Pythonやらとおんなじ インストールすればそのマシン上でJavaScriptが実行できるんだZE! というだけの話でした。

Google V8 JavaScriptエンジンを使用していて高速。

ということらしいですね。

対応OS

Linux、MacOS、WIndowsOS、それぞれに対応してる。 実運用ではLinuxに入れる事が多いらしい。 まぁそれはWEBで使われる事が多いからじゃかろうか

npm(Node Package Manager)

Node.js上で動くパッケージ(便利なライブラリたち)を管理するツール。 コマンドラインで動作するコマンドでよく使う。

ざっくりとした歴史

イベントループ方式

よく使われているApacheはリクエストが来るたびにスレッドを新しく作る。 →リクエストが大量にくるとスレッドが大量に作られる。 →もうこれ以上スレッドが作れないよという状況が発生する →こうなると新しいリクエストを処理できない →C10K問題

これに対してNode.jsはイベントループ方式をとっている。 →シングルスレッドで動作している。 →クエストはキューに積まれていく →詰まれたリクエストは次々に処理されていく →リクエストが増えてもスレッドは作られないのでC10K問題も解消 →シングルスレッドなのでブロッキング処理は書いちゃだめ。

kurodakazumichi commented 6 years ago

勝手にストーリー

細かいところは勝手に脚色。

始まりの日

2009年のある日のこと

ライアン・ダール「JavaScript便利だなぁ、普通にブラウザ以外でも動かしたいなぁ」

JavaScriptがブラウザでしか実行できないことがもったいない そう思ったダール氏はパソコン上でJavaScriptを動かせるという 夢のプラットフォーム「Node.js」の開発に着手する。

そしてがんばる事1年、2011年8月のこと

ダール「できたぞ!なずけてNode.js バージョン0.1.14じゃ!」 この日、Node.jsが公開された。

歩み寄る協力者

Node.jsが公開され幾ばくかの時が流れ、2012年のある日の事

Joyent社「なんか面白そうな事やってるやんけ、支援したろ」 ダール「まじっすか!じゃぁわいもJoyentさんのところに入社します」

2012年1月、孤独の開発時代は終わりをつげた。 スケルター「これからはワイが開発リーダーや!よろしくなダール殿」

2014年、スケルターがリーダーになってから2年後の事である。

フォンテーヌ「こんどはワイがリーダー!スケルター、よくやったな」 またしてもリーダーが変更されることになった。

新団体 Node Forward

それからまもなくのこと

Node.js Core の開発が停滞しはじめる。

Node.js推進一派「おいおい、開発が停滞しているぞ」 Node.js推進一派「え、そんな、いやよ。。。」 Node.js推進一派「このままじゃNode.jsが廃れてしまうぞ」 Node.js推進一派「僕たちがなんとかしないと!」 Node.js推進一派「Node.jsを守るため!新団体を立ち上げるぞ!!」 Node.js推進一派「うぉおおおおおおおお!!」

そうして新団体「Node Forward」が設立された。

Node Forwardが設立されてまもない、2015年 1月のこと Node Forward「Node.jsのfork版、io.js 1.0をリリースする!」

Joyent社の開発停滞から約1年、新団体Node Forwardは Node.jsの後継となるio.jsを世に発表したのだ。

返り咲く

2015年2月 io.jsがリリースされた1ヵ月後の事だ。

Joyent社「Node.js Foundationを設立するよ」

Joyent社はNode.js開発停滞を見直すためにLinux Foundation以下にNode.js 財団の設立を発表したのだ。

Node Forward「な、なにぃー!?」 Node Forward「俺たちのio.jsはどうなるんだ?」 Node Forward「わからん、わからんけどとりあえず作ろう」

2015年5月 Node Forwardはio.js 2.0をリリースする。

選択

Node Forward「うーん、Node.jsが復活するなら俺たちもそっちいく?」 Node Forward「だよなぁ、ダブルスタンダードでやってくのも非効率だしなぁ」 Node Forward「io.js 2.0出しちゃったけど、俺たちもNode.js Foundationと統合するか」

Node ForwardはNode.js Foundationとの統合を選択した。

Node Forward「今作ってるio.js 3.0はどうする?」 Node Forward「とりあえず作っとこう」

Node.js Foundation設立

2015年7月 Joyent社「Node.js Foundationを設立しました!」

Node Forward「ついに設立されたか」 Node Forward「あぁ、設立されたな」

Node Forward「io.js 3.0もうできそうだけどどうする?」 Node Forward「とりあえず出しとこ」

2015年8月 io.js 3.0がリリースされた。

統合の時

2015年9月 Node.js Foundationが設立されて2ヵ月 io.js 3.0がリリースされてまだ1ヵ月

Node.jsとio.jsの統合版 Node.js 4.0がリリースされる。

Node.js Foundation「よし、これからは力を合わせてやっていこう」 Node Forward「おk、よろしく頼むわ」

こうして一時期はNode.jsとio.jsと枝分かれした両社だが 巡り巡ってまた1つにまとまることになったのだ。

雨降って地固まるというやつじゃな。

その後

それからは順調にバージョンアップを重ねていく。

2015年10月 Node.js 5.0をリリース 2016年4月 Node.js 6.0をリリース 2016年7月 韓国 Samsung社がJoyent社を買収。

ん?

2016年10月 Node.js 7.0 をリリース。 2017年5月 Node.js 8.0 をリリース。 2017年10月 Node.js 9.0 をリリース。

そして現在に至る。

途中Joyent社が買収されたが、Node.jsの開発はNode.js Foundationが主導となっている。 Joyent社は財団の一部だが、この買収はNode.jsの歴史にさほど影響はないだろう。

kurodakazumichi commented 6 years ago

基本のHello World

sample.js

console.log("Hello world");

コマンド

node sample.js

Hello world

node 実行したいjsとすれば実行される。

インタラクティブに実行

node
> プログラムが打ち込める状態になる
console.log("Hello World");
.exit
> 元の状態に戻る。

Hello World undefined

nodeコマンドを使えばコマンドプロンプト上でリアルタイムに実行できる。

kurodakazumichi commented 6 years ago

WEBサーバーを立ち上げる

sample2.js

var http = require('http');
var server = http.createServer(function(req, res){
  res.write("Hello World!\n");
  res.end();
}).listen(8080);

コマンド

node sample2.js

これでhttp://127.0.0.1:8080にアクセスすればHello Worldが表示される。

すげぇ。。Node.jsすごいな。

kurodakazumichi commented 6 years ago

ブロッキングとノンブロッキング

Node.jsはシングルスレッドなのでブロッキングな処理を書くと全てのリクエストに影響する。 つまりどういうことか

1秒後に処理を実効する場合

ブロッキングな処理

// blocking
var start = new Date().getTime();
while (new Date().getTime() < start + 1000);
console.log("world");

whileループが終わらず次の処理へ進めない=ブロッキング

ノンブロッキングな処理

// non blocking
setTimeout(function(){
  console.log("world");
}, 1000);

Timerを使えば処理は止めずに同じ事ができる=ノンブロッキング

Node.jsではノンブロッキングな処理を意識する必要がある。