Node.js が何なのか完全にはわかりません。私が主にWebベースのビジネスアプリケーション開発者であるためかもしれません。それは何ですか、そしてそれは何を使用していますか?
私の理解はこれまでのところです:
私の理解は正しいですか?もしそうであれば、イヴェントされたI/Oの利点は何でしょうか、それは同時並行性のためだけのものですか?また、Node.jsは、JavaScriptベース(V8ベース)のプログラミングモデルのようなフレームワークになることを目指していますか?
私は利点があると思います:
非常に速いVM上の動的言語(JavaScript)でのWeb開発(V8)。 Ruby、Python、Perlよりはるかに速いです。
単一のプロセスで最小限のオーバーヘッドで数千の同時接続を処理する機能。
JavaScriptはファーストクラスの関数オブジェクトとクロージャを持つイベントループに最適です。ユーザーが開始したイベントに応答するためにブラウザでそれを使用したことで、人々はすでにそれをこのように使用する方法を知っています。
プログラマであると主張していない人々でさえも、すでに多くの人々がJavaScriptを知っています。それは間違いなく最も人気のあるプログラミング言語です。
ブラウザだけでなくWebサーバーでもJavaScriptを使用すると、式の両側で同じように機能するJSONを介してデータ構造を通信できる2つのプログラミング環境間のインピーダンスの不一致が軽減されます。サーバーとクライアントなどの間で重複したフォーム検証コードを共有できます。
私は仕事でNode.jsを使用していますが、非常に強力であることがわかりました。 Node.jsを説明するために1つのWordを選択せざるを得ないので、「おもしろい」(純粋に肯定的な形容詞ではありません)と言います。コミュニティは活気に満ちて成長しています。 JavaScriptは、その奇妙さにも関わらず、コードを書くのに最適な言語です。また、「ベストプラクティス」と適切に構造化されたコードのパターンについて、自分の理解を毎日再考します。現在、Node.jsには膨大なアイデアのエネルギーが流れ込んでおり、その中で作業することで、このすべての思考に触れることができます-すばらしい精神的な重量挙げです。
実稼働環境でNode.jsを使用することは確かに可能ですが、ドキュメントで約束されているように見える「ターンキー」デプロイメントとはかけ離れています。 Node.js v0.6.xでは、「クラスター」がプラットフォームに統合され、重要な構成要素の1つが提供されますが、私の「production.js」スクリプトは、ログの作成などを処理するためのロジックが最大150行です。ディレクトリ、死んだ労働者のリサイクルなど。「深刻な」本番サービスの場合、着信接続を調整し、Apacheが PHP で行うすべてのことを行う準備も必要です。公平を期すために、 Ruby on Rails にはこのexact問題があります。これは、2つの補完的なメカニズムによって解決されます。1)Rubyを Nginx (または Apache / Lighttd )。 Webサーバーは、静的コンテンツの効率的な提供、ログへのアクセス、URLの書き換え、 SSL の終了、アクセスルールの実施、複数のサブサービスの管理を効率的に行うことができます。実際のノードサービスにヒットするリクエストの場合、ウェブサーバーはリクエストをプロキシします。 2) Unicorn のようなフレームワークを使用して、ワーカープロセスを管理し、定期的にリサイクルするなど。完全に焼き上げられたように見えるNode.js提供フレームワークをまだ見つけていません。存在するかもしれませんが、まだ見つけていないので、手巻きの「production.js」で〜150行を使用しています。
Express のようなフレームワークを読むと、標準的な慣行では、すべての商取引Node.jsサービスを介してすべてを提供するように思えます... "app.use(express.static (__dirname + '/ public'))」。低負荷のサービスと開発の場合は、おそらく大丈夫です。しかし、サービスに大きな時間をかけ、24時間365日実行させるとすぐに、大きなサイトをプッシュして Nginx サイトを前面に出し、すべての静的コンテンツリクエストを処理します(... CDN をセットアップするまで Amazon CloudFront ))。多少ユーモラスで、恥知らずな否定的な意見については、 this guy を参照してください。
Node.jsでは、サービス以外の用途も増えています。 Webコンテンツの提供に他の何かを使用している場合でも、Node.jsをビルドツールとして使用し、 npm モジュールを使用してコードを整理します Browserify それを単一のアセットにつなぎ合わせ、 uglify-js で展開のためにそれを縮小します。 Webを扱う場合、JavaScriptは完璧な インピーダンスマッチ であり、JavaScriptが最も簡単な攻撃経路になります。たとえば、 JSON 応答ペイロードの束を掘り下げたい場合は、ユーティリティ underscore-CLI モジュールを使用する必要があります。構造化データのベルト。
JavaScriptとNode.jsの別の観点については、からJavaからNode.jsへのブログ投稿をチェックしてください。 Java開発者のNode.jsの学習の印象と経験。
Modulesノードを検討するとき、JavaScriptライブラリの選択はDEFINEあなたの経験になります。ほとんどの人は、少なくとも2つの非同期パターンヘルパー(Step、Futures、Async)、およびJavaScriptシュガーモジュール( Underscore.js )を使用します。
ヘルパー/ JavaScriptシュガー:
非同期パターンモジュール:
または、非同期ライブラリのすべてを読むには、著者との this panel-interview を参照してください。
Webフレームワーク:
テスト:
また、推奨されるNode.jsモジュールの 公式リスト も確認してください。ただし、 GitHubのNode Modules Wiki は、より完全で優れたリソースです。
ノードを理解するには、いくつかの主要な設計選択を検討することが役立ちます:
Node.jsはEVENT BASEDおよび非同期/NON-BLOCKING。着信HTTP接続などのイベントは、少しの作業を実行し、データベースへの接続や別のサーバーからのコンテンツのプルなどの他の非同期タスクを開始するJavaScript関数を起動します。これらのタスクが開始されると、イベント関数は終了し、Node.jsはスリープ状態に戻ります。データベース接続の確立や外部サーバーがコンテンツに応答するなど、何か他のことが起こるとすぐに、コールバック関数が起動し、JavaScriptコードが実行され、さらに多くの非同期タスク(データベースクエリなど)を開始する可能性があります。このように、Node.jsは複数の並列ワークフローのアクティビティを喜んでインターリーブし、いつでもブロックされていないアクティビティを実行します。 Node.jsが何千もの同時接続を管理するという素晴らしい仕事をするのはこのためです。
なぜ他の人のように接続ごとに1つのプロセス/スレッドを使用しないのですか?Node.jsでは、新しい接続は、非常に小さなヒープ割り当てです。新しいプロセスを起動するには、かなり多くのメモリ、プラットフォームによってはメガバイトが必要です。しかし、実際のコストは、コンテキスト切り替えに関連するオーバーヘッドです。 10 ^ 6のカーネルスレッドがある場合、カーネルは次に誰を実行すべきかを判断するために多くの作業を行う必要があります。 Linux用のO(1)スケジューラーの構築に多くの作業が費やされましたが、最終的には、CPU時間を奪い合う10 ^ 6プロセスよりも、単一のイベント駆動型プロセスを持つ方が効率的です。また、過負荷状態では、マルチプロセスモデルの動作が非常に悪く、重要な管理および管理サービス、特にSSHDが不足します(つまり、ボックスにログインして、実際のねじ込み具合を把握することさえできません)。
Node.jsはSINGLE THREADEDおよびLOCK FREEです。 Node.jsは、非常に慎重な設計上の選択肢として、プロセスごとに1つのスレッドしか持っていません。このため、複数のスレッドが同時にデータにアクセスすることは基本的に不可能です。したがって、ロックは必要ありません。スレッドは難しいです。本当に本当に難しい。信じられない場合は、十分なスレッドプログラミングを行っていないことになります。ロックを正しく取得するのは難しく、バグを追跡するのは非常に困難です。ロックとマルチスレッドを排除すると、厄介なバグのクラスの1つがなくなります。これがノードの唯一の最大の利点かもしれません。
しかし、16コアのボックスをどのように活用しますか?
二通り:
Node.jsを使用すると、汗をかくことなく本当に強力なことができます。Nodeがあるとしますさまざまなタスクを実行し、 TCP ポートでコマンドをリッスンし、何らかのイメージをエンコードする.jsプログラム。 5行のコードで、アクティブなタスクの現在のステータスを表示するHTTPベースのWeb管理ポータルを追加できます。これは簡単です:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");
これで、URLにアクセスして、実行中のプロセスのステータスを確認できます。いくつかのボタンを追加すると、「管理ポータル」ができます。実行中のPerl/Python/Rubyスクリプトがある場合、単に「管理ポータルでスロー」するのは簡単ではありません。
しかし、JavaScriptは遅い/悪い/悪/ spawn-of-the-devil?ではありませんか?JavaScript奇妙な奇妙な点がいくつかありますが、「良い部分」には非常に強力な言語があり、いずれにせよ、JavaScriptはクライアント(ブラウザー)の言語です。 JavaScriptはここにあります。他の言語がILとしてそれをターゲットにしており、世界クラスの才能が最も高度なJavaScriptエンジンを生産するために競争しています。ブラウザでのJavaScriptの役割のため、JavaScriptを高速化するために膨大な量のエンジニアリング努力が注がれています。 V8 は、少なくとも今月は最新かつ最高のJavaScriptエンジンです。効率と安定性の両方で他のスクリプト言語を吹き飛ばします(あなたを見て、Ruby)。そして、Microsoft、Google、Mozillaで問題に取り組んでいる巨大なチームが最高のJavaScriptエンジンを構築するために競い合うことで良くなるだけです(すべての最新のエンジンが JIT は、1回実行コードのフォールバックとしてのみ解釈されるボンネットの下でコンパイルします。ええ、私たちは皆、奇妙なJavaScript言語の選択のいくつかを修正できることを望んでいますが、それはそれほど悪くはありません。また、この言語は非常に柔軟性が高いため、実際にはJavaScriptをコーディングするのではなく、StepまたはjQueryをコーディングします。JavaScriptの他のどの言語よりも、ライブラリがエクスペリエンスを定義します。 Webアプリケーションを構築するには、とにかくJavaScriptを知っている必要があります。そのため、サーバー上でJavaScriptを使用してコーディングすると、スキルセットの相乗効果が得られます。クライアントコードを書くのが怖くありません。
それに、本当にJavaScriptが嫌いなら、 CoffeeScript のような構文シュガーを使用できます。または、 Google Web Toolkit (GWT)など、JavaScriptコードを作成するその他のもの。
JavaScriptといえば、「クロージャ」とは何ですか?-かなりお洒落な言い方ですコールチェーン全体でレキシカルスコープの変数を保持します。 ;) このような:
var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();
「myData」をオブジェクトに隠しておくような厄介なことを何もせずに、単に使用できる方法をご覧ください。また、Javaとは異なり、「myData」変数は読み取り専用である必要はありません。この強力な言語機能により、非同期プログラミングの冗長性と苦痛が大幅に軽減されます。
非同期コードの作成は、単純なシングルスレッドスクリプトの作成よりも常に複雑になりますが、Node.jsを使用すればそれほど難しくはなく、数千の同時接続の効率性とスケーラビリティに加えて多くの利点が得られます。 ..
V8 はJavaScriptの実装です。 (特に)スタンドアロンのJavaScriptアプリケーションを実行できます。
Node.jsは、イベントI/Oを実行するV8用に作成された単なるライブラリです。この概念は説明するのが少し難しく、誰かが私よりも良い説明で答えると確信しています...要点は、何らかの入力または出力を行って、それが起こるのを待つのではなく、ただdo n't終了するのを待ちます。したがって、たとえば、ファイルの最終編集時間を尋ねます。
// Pseudo code
stat( 'somefile' )
それには数ミリ秒かかることもあれば、数秒かかることもあります。 evented I/O を使用すると、単にリクエストを実行し、待機する代わりに、リクエストの終了時に実行されるコールバックを添付します。
// Pseudo code
stat( 'somefile', function( result ) {
// Use the result here
} );
// ...more code here
これにより、ブラウザのJavaScriptコードに非常に似たものになります(たとえば、 Ajax スタイル機能を使用)。
詳細については、ライブラリ/プラットフォームの紹介であった記事Node.jsは本当に刺激的ですをご覧ください。 ...かなり良かった。
Node.js は、サーバーサイドのJavaScriptコード用に構築されたオープンソースのコマンドラインツールです。 tarball をダウンロードして、ソースをコンパイルしてインストールすることができます。 JavaScriptプログラムを実行できます。
JavaScriptは V8 によって実行され、 Chrome ブラウザで使用されるGoogleによって開発されたJavaScriptエンジンです。 JavaScript APIを使用してネットワークとファイルシステムにアクセスします。
パフォーマンスと並列操作の実行能力で人気があります。
node.jsを理解する は node.jsの最良の説明です 私はこれまでに見つけました。
以下は、このトピックに関するいくつかの良い記事です。
クロージャは、それが作成されたコンテキストでコードを実行する方法です。
これが簡潔さのために何を意味するかというと、変数を定義し、それからノンブロッキング I/O 関数を起動し、それにコールバックのための無名関数を送ることができるということです。
タスクが完了すると、コールバック関数は変数とともにコンテキスト内で実行されます。これがクロージャです。
ノンブロッキングI/Oを使用してアプリケーションを作成するのにクロージャが非常に優れているのは、非同期に実行されている関数のコンテキストを管理するのが非常に簡単だからです。
2つの良い例は、テンプレートの管理方法とそれによるプログレッシブ拡張の使用方法に関するものです。あなたはそれを完璧に動作させるためにJavaScriptコードのいくつかの軽量の断片が必要です。
これらの記事を見て読むことを強くお勧めします。
任意の言語を選択し、HTMLファイルテンプレートを管理する方法と、 _ dom _ 構造内の単一の _ css _ クラス名を更新するためにしなければならなかったことを覚えておいてください。ユーザーがメニュー項目をクリックし、それを「選択済み」としてマークしてページのコンテンツを更新する必要があります。
Node.jsでは、クライアントサイドのJavaScriptコードで行うのと同じくらい簡単です。 DOMノードを取得し、それにCSSクラスを適用してください。あなたのDOMノードとinnerHTMLあなたのコンテンツを入手してください(これを行うにはいくつかの追加のJavaScriptコードが必要になります。詳細については記事を読んでください)。
もう1つの良い例は、同じコードでJavaScriptを有効または無効にしてWebページを互換にできることです。ユーザーがカレンダーを使用して任意の日付を選択できるように、JavaScriptで日付を選択したとします。 JavaScriptをオンまたはオフにして動作するように、同じJavaScriptコードを書く(または使用する)ことができます。
Node.jsのイベントドリブンモデルを最もよく説明する非常に優れたファーストフードの場所の類似性があります。記事全体を参照してくださいNode.js、Doctor's Offices and Fast Food Restaurants –イベント駆動型プログラミングについて
概要は次のとおりです。
ファーストフードのジョイントが従来のスレッドベースのモデルに従った場合、食べ物を注文し、受け取るまで並んで待つことになります。あなたの後ろの人は、注文が完了するまで注文できません。イベント駆動型のモデルでは、食べ物を注文してから、列に並ばずに待機します。他のすべての人は自由に注文できます。
Node.jsはイベント駆動型ですが、ほとんどのWebサーバーはスレッドベースです。YorkはNode.jsの仕組みを説明しています。
Webブラウザーを使用して、Node.js Webサーバーで「/about.html」を要求します。
Node.jsサーバーはリクエストを受け入れ、関数を呼び出してディスクからそのファイルを取得します。
Node.jsサーバーは、ファイルの取得を待機している間、次のWeb要求を処理します。
ファイルが取得されると、Node.jsサーバーキューに挿入されるコールバック関数があります。
Node.jsサーバーは、この場合「/about.html」ページをレンダリングしてWebブラウザーに送り返す関数を実行します。
また、GoogleのV8は非常に速いということを言及することを忘れないでください。実際には、JavaScriptコードをコンパイル済みバイナリと同等のパフォーマンスでマシンコードに変換します。それで、他のすべての素晴らしいものと共に、それはめちゃくちゃ速いです。
まあ、 私はそれを理解しています
- Nodeの目標は、スケーラブルなネットワークプログラムを構築するための簡単な方法を提供することです。
- Nodeは、RubyのEvent MachineやPythonのTwistedのようなシステムと設計が似ており、その影響を受けます。
- V8 JavaScript用のEvented I/O。
私にとっては、それはあなたが3つの仮定すべてにおいて正しかったことを意味します。図書館は確かに有望に見えます!
Q:プログラミングモデルはイベント駆動型で、特に I/O の処理方法です。
正しい。コールバックを使用するため、ファイルシステムにアクセスするための要求があると、ファイルシステムに要求が送信され、Node.jsは次の要求の処理を開始します。ファイルシステムから応答が返ってきたら、I/O要求について心配するだけで、そのときコールバックコードが実行されます。ただし、同期I/O要求(つまり、ブロック要求)を行うことは可能です。非同期(コールバック)と同期(待機)のどちらを選択するかは開発者次第です。
Q:JavaScriptを使いパーサーはV8です。
はい
Q:コンカレントサーバーアプリケーションの作成に簡単に使用できます。
はい、かなりのJavaScriptを手作業でコーディングする必要があります。 http://www.easynodejs.com/ - のようなフレームワークを見た方が良いかもしれません。これには完全なオンラインドキュメントとサンプルアプリケーションが付属しています。