質問

完全に理解できません Node.js についてです。おそらくそれは、私が主に Web ベースのビジネス アプリケーション開発者であるからかもしれません。それは何ですか、そしてそれは何に役立ちますか?

これまでのところ私の理解は次のとおりです。

  1. プログラミング モデルは、特に処理方法においてイベント駆動型です。 I/O.
  2. それは使用しています JavaScript そしてパーサーは V8.
  3. これを使用して、同時サーバー アプリケーションを簡単に作成できます。

私の理解は正しいでしょうか?「はい」の場合、イベント I/O の利点は何ですか。それは単に同時実行に関するものでしょうか?また、Node.js の方向性は、JavaScript ベース (V8 ベース) のプログラミング モデルのようなフレームワークになるのでしょうか。

役に立ちましたか?

解決

利点は次のとおりだと思います。

  1. 驚くほど高速な VM (V8) 上の動的言語 (JavaScript) による Web 開発。Ruby、Python、Perl よりもはるかに高速です。

  2. 単一プロセスで最小限のオーバーヘッドで数千の同時接続を処理する機能。

  3. JavaScript は、ファーストクラスの関数オブジェクトとクロージャを使用したイベント ループに最適です。人々は、ユーザーが開始したイベントに応答するためにブラウザーでそれを使用しているため、この方法でそれを使用する方法をすでに知っています。

  4. プログラマーではない人も含め、多くの人がすでに JavaScript を知っています。おそらく最も人気のあるプログラミング言語です。

  5. Web サーバーとブラウザーで JavaScript を使用すると、方程式の両側で同じように機能する JSON 経由でデータ構造を通信できる 2 つのプログラミング環境間のインピーダンスの不一致が軽減されます。重複したフォーム検証コードはサーバーとクライアントなどの間で共有できます。

他のヒント

私は仕事で Node.js を使用していますが、非常に強力であると感じています。Node.js を説明するには 1 つの単語を選択する必要があるため、「興味深い」と言えます (これは純粋に肯定的な形容詞ではありません)。コミュニティは活気に満ち、成長しています。JavaScript は、その奇妙さにもかかわらず、コーディングには優れた言語です。そして、「ベスト プラクティス」と適切に構造化されたコードのパターンについての自分の理解を毎日再考します。現在、Node.js には莫大なエネルギーのアイデアが流れ込んでおり、そこで作業すると、さまざまな思考にさらされることになり、非常に精神的な負担が大きくなります。

実稼働環境での Node.js は確かに可能ですが、ドキュメントで約束されているように見える「ターンキー」展開からは程遠いです。Node.js v0.6.x では、「cluster」がプラットフォームに統合され、重要な構成要素の 1 つが提供されていますが、私の「production.js」スクリプトには、ログの作成などを処理するロジックがまだ 150 行程度あります。ディレクトリ、死んだ労働者のリサイクルなど「本格的な」運用サービスの場合は、受信接続を調整し、Apache が行うすべての作業を実行する準備も必要です。 PHP. 。公平であるために、 ルビー・オン・レール これを持っています ちょうど 問題。この問題は、次の 2 つの相補的なメカニズムによって解決されます。1) Ruby on Rails/Node.js を専用 Web サーバーの背後に置きます (C で書かれ、徹底的にテストされて戻ってきます)。 Nginx (または アパッチ / ライトティ)。Web サーバーは、静的コンテンツの提供、ログへのアクセス、URL の書き換え、終了を効率的に行うことができます。 SSL, 、アクセス ルールを適用し、複数のサブサービスを管理します。実際のノード サービスにヒットするリクエストの場合、Web サーバーはリクエストをプロキシ経由で送信します。2)次のようなフレームワークを使用する ユニコーン ワーカー プロセスを管理し、定期的にリサイクルするなどします。完全に完成したと思われる Node.js 提供フレームワークをまだ見つけていません。存在するかもしれませんが、私はまだそれを見つけておらず、私の手で作成した「production.js」でまだ約 150 行を使用しています。

次のようなフレームワークを読む 急行 1 つの何でも屋の Node.js サービスを通じてすべてを提供するのが標準的な方法であるように思えます...「app.use(express.static(__dirname + '/public'))」。負荷の低いサービスや開発の場合は、おそらくこれで問題ありません。しかし、サービスに長時間の負荷をかけて年中無休で実行しようとすると、大規模なサイトが次のようなよく焼き付けられた強化された C コードを使用する動機がすぐにわかります。 Nginx サイトを立ち上げ、すべての静的コンテンツのリクエストを処理します (...セットアップするまで) CDN, 、 のように Amazon CloudFront))。これに対するややユーモラスで恥ずかしがることなく否定的な見方については、以下を参照してください。 この男.

Node.js はサービス以外の用途も増えています。Web コンテンツを提供するために他のものを使用している場合でも、次のように Node.js をビルド ツールとして使用することができます。 npm コードを整理するためのモジュール、 ブラウザで見る それを単一のアセットにつなぎ合わせます。 uglify-js デプロイメント用に縮小します。Web を扱うには JavaScript が最適です インピーダンスマッチ そして多くの場合、それが最も簡単な攻撃経路になります。たとえば、たくさんの情報を探して調べたい場合は、 JSON 応答ペイロード、私のものを使用する必要があります アンダースコア-CLI モジュール、構造化データのユーティリティ ベルト。

長所短所:

  • プロ:サーバー担当者にとって、バックエンドで JavaScript を記述することは、最新の UI パターンを学習するための「入り口薬」でした。クライアントコードを書くのが怖くなくなりました。
  • プロ:適切なエラー チェックを奨励する傾向があります (事実上すべてのコールバックによって err が返され、プログラマがそれを処理するように要求されます。また、async.js およびその他のライブラリは、「これらのサブタスクのいずれかが失敗した場合に失敗する」パラダイムを、一般的な同期コードよりもはるかにうまく処理します)
  • プロ:実行中のタスクのステータスの取得、ワーカー間の通信、キャッシュ状態の共有など、興味深いタスクや通常は困難なタスクが簡単になります。
  • プロ:巨大なコミュニティと、堅牢なパッケージ マネージャー (npm) に基づく大量の優れたライブラリ
  • 短所:JavaScript には標準ライブラリがありません。機能のインポートに慣れすぎると、npm モジュールの追加を必要としない JSON.parse やその他の組み込みメソッドを使用するときに奇妙に感じます。これは、すべてのものに 5 つのバージョンがあることを意味します。Node.js の「コア」に含まれるモジュールにも、デフォルトの実装に不満がある場合に備えて、さらに 5 つのバリアントがあります。これは急速な進化をもたらしますが、ある程度の混乱も引き起こします。

単純なリクエストごとに 1 プロセスのモデル (ランプ):

  • プロ:数千のアクティブな接続まで拡張可能。非常に高速かつ効率的です。Web フリートの場合、これは、PHP や Ruby と比較して、必要なボックスの数が 10 分の 1 に削減されることを意味します。
  • プロ:並列パターンを書くのは簡単です。から 3 つ (または N) の BLOB をフェッチする必要があると想像してください。 Memcached. 。これをPHPで実行してください...最初の BLOB、次に 2 番目、そして 3 番目の BLOB を取得するコードを書いただけですか?うわー、遅いですね。特別なものがあります PECL Memcached 特有の問題を解決するモジュールですが、データベース クエリと並行して Memcached データを取得したい場合はどうすればよいでしょうか?Node.js ではパラダイムが非同期であるため、Web リクエストで複数の処理を並行して実行するのは非常に自然です。
  • 短所:非同期コードは基本的に同期コードよりも複雑であり、同時実行の実際の意味をしっかりと理解していなければ、開発者にとって事前の学習は困難になる可能性があります。それでも、ロックを使用してあらゆる種類のマルチスレッド コードを作成するよりもはるかに簡単です。
  • 短所:コンピューティング集中型のリクエストが、たとえば 100 ミリ秒にわたって実行されると、同じ Node.js プロセスで処理されている他のリクエストの処理が停止します。別名、 協調マルチタスク. 。これは、Web Workers パターン (高コストのタスクを処理するためにサブプロセスをスピンオフする) で軽減できます。あるいは、多数の Node.js ワーカーを使用し、各ワーカーが 1 つのリクエストのみを同時に処理できるようにすることもできます (プロセスのリサイクルがないため、それでもかなり効率的です)。
  • 短所:実稼働システムの実行は、システムよりもはるかに複雑です。 CGI Apache + PHP のようなモデル、 パール, ルビー, 、など。未処理の例外によりプロセス全体がダウンし、失敗したワーカーを再起動するロジックが必要になります (「 集まる)。バグのあるネイティブ コードを含むモジュールは、プロセスをハードクラッシュさせる可能性があります。ワーカーが死亡すると、ワーカーが処理していたリクエストはすべて破棄されるため、1 つのバグのある API によって、他の共同ホストされた API のサービスが簡単に低下する可能性があります。

「実際の」サービスを Java / C# / C (C?本当に?)

  • プロ:Node.js で非同期を行うことは、他の場所でスレッド セーフを行うよりも簡単であり、おそらくより大きなメリットが得られます。Node.js は、私がこれまでに取り組んだ中で最も苦痛の少ない非同期パラダイムです。優れたライブラリを使用すると、同期コードを書くよりも少しだけ難しくなります。
  • プロ:マルチスレッドやロックのバグはありません。確かに、ブロック操作のない適切な非同期ワークフローを表現する、より冗長なコードの作成に先行投資します。そして、いくつかのテストを作成して、それを動作させる必要があります (これはスクリプト言語であり、ファット フィンガリング変数名は単体テスト時にのみ検出されます)。しかし、一度機能させると、表面積は ハイゼンバグス -- 100 万回の実行に 1 回しか発生しない奇妙な問題 -- その表面積がはるかに小さいだけです。Node.js コードを記述する税金は、コーディング段階に大幅に前倒しされます。そうすれば、安定したコードが得られる傾向があります。
  • プロ:JavaScript は機能を表現するのにはるかに軽量です。言葉で証明するのは難しいですが、 JSON, 、動的型付け、ラムダ表記、プロトタイプの継承、軽量モジュールなど...同じアイデアを表現するのに必要なコードが少なくなる傾向があるだけです。
  • 短所:おそらく、Java でサービスをコーディングすることが本当に本当に好きなのではないでしょうか?

JavaScript と Node.js に関する別の視点については、以下をご覧ください。 Java から Node.js へ, 、Java 開発者の Node.js を学習した感想と経験に関するブログ投稿。


モジュールノードを検討するときは、JavaScript ライブラリの選択が 定義する あなたの経験。ほとんどの人は、非同期パターン ヘルパー (Step、Futures、Async) と JavaScript シュガー モジュール (アンダースコア.js).

ヘルパー / JavaScript シュガー:

  • アンダースコア.js - これを使って。やるだけ。_.isString() や _.isArray() などを使用すると、コードが読みやすくなります。そうでなければどうやって安全なコードを書くことができるのか、私にはよくわかりません。また、強化されたコマンドライン機能については、私自身のコマンドラインをチェックしてください。 アンダースコア-CLI.

非同期パターンモジュール:

  • ステップ - シリアルアクションとパラレルアクションの組み合わせを表現する非常にエレガントな方法。私の個人的なお勧め。見る 私の投稿 ステップコードがどのようなものであるかについて。
  • 先物 - 要件を通じて順序を表現するはるかに柔軟な (それは本当に良いことですか?) 方法。「a、b、c を並行して開始する」などの表現ができます。A、Bが終了したらABを開始します。A と C が終了したら、AC を開始します。」 このような柔軟性を実現するには、ワークフローのバグを避けるために、より注意が必要です (コールバックを呼び出さない、または複数回呼び出すなど)。見る レイノスさんの投稿 先物を使用する方法について (これは私が先物を「入手」するきっかけとなった投稿です)。
  • 非同期 - パターンごとに 1 つのメソッドを備えた、より伝統的なライブラリ。私がこれを始めたのは、宗教的に Step に改宗し、その後、Async のすべてのパターンが 1 つのより読みやすいパラダイムを使用して Step で表現できることに気づいた前です。
  • TameJS - OKCupid によって書かれた、これは、シリアルおよびパラレルのワークフローをエレガントに記述するための新しい言語プリミティブ「await」を追加するプリコンパイラーです。パターンは素晴らしく見えますが、事前コンパイルが必要です。これについてはまだ考え中です。
  • ストリームラインJS - TameJS の競合相手。私はタメ派ですが、自分で決めることができます。

または、非同期ライブラリの詳細については、次を参照してください。 このパネルインタビュー 著者たちと一緒に。

ウェブフレームワーク:

  • 急行 Web サイトを整理するための優れた Ruby on Rails フレームワーク。それは使用しています ジェイド XML/HTML テンプレート エンジンとして使用すると、HTML の構築がはるかに楽になり、ほとんどエレガントになります。
  • jQuery jQuery は厳密にはノード モジュールではありませんが、急速にクライアント側のユーザー インターフェイスの事実上の標準になりつつあります。jQuery は、操作できる DOM 要素のセット (セット ハンドラー、プロパティ、スタイルなど) を「クエリ」する CSS のようなセレクターを提供します。同様に、Twitter も ブートストラップ CSSフレームワーク、 バックボーン.js のために MVC パターンと ブラウザ化.js すべての JavaScript ファイルを 1 つのファイルに結合します。これらのモジュールはすべて事実上の標準になりつつあるため、聞いたことがない場合は少なくともチェックしてみる必要があります。

テスト:

  • JSHint - 必ず使用してください。最初はこれを使用しませんでしたが、今では理解できないようです。JSLint は、Java などのコンパイル言語で得られる一連の基本的な検証を追加します。括弧の不一致、宣言されていない変数、さまざまな形状やサイズの typeos。また、私が「アナル モード」と呼んでいるさまざまな形式をオンにして、空白文字などのスタイルを確認することもできます。それが好みであれば問題ありませんが、本当の価値は、正確な行番号に関する即座のフィードバックが得られることにあります。終わりの「)」を忘れました...コードを実行して問題のある行に到達する必要はありません。「JSHint」は、より構成可能な次の亜種です。 ダグラス・クロックフォードさんの JSLint.
  • モカ 私が好み始めているVowsのライバルです。どちらのフレームワークも基本を十分に処理しますが、複雑なパターンは Mocha で表現する方が簡単な傾向があります。
  • 誓い Vows は本当にエレガントです。そして、どのテストケースが成功したか失敗したかを示す素敵なレポート (--spec) を出力します。30 分かけて学習すれば、最小限の労力でモジュールの基本テストを作成できます。
  • ゾンビ - を使用した HTML および JavaScript のヘッドレス テスト JSDom 仮想「ブラウザ」として。とても強力なものです。と組み合わせる リプレイ ブラウザ内コードの決定論的テストを超高速で実行できます。
  • テストについて「考える」方法についてのコメント:
    • テストは任意ではありません。JavaScript のような動的言語には、次のものがあります。 とても いくつかの静的チェック。たとえば、4 つを期待するメソッドに 2 つのパラメータを渡しても、コードが実行されるまで中断されません。JavaScript でバグを作成するハードルはかなり低いです。基本的なテストは、コンパイル言語との検証の差を埋めるために不可欠です。
    • 検証を忘れて、コードを実行するだけです。すべてのメソッドについて、私の最初の検証ケースは「何も壊れない」であり、これが最も頻繁に発生するケースです。コードをスローせずに実行できることを証明すると、バグの 80% が捕捉され、コードの信頼性が向上するため、スキップした微妙な検証ケースを後から追加することになります。
    • 小さく始めて慣性バリアを打ち破ってください。私たちは皆怠け者で、時間に追われているため、テストを「余分な仕事」と見なすのは簡単です。だから、小さなことから始めてください。テスト ケース 0 を作成します - モジュールをロードし、成功を報告します。これだけのことを自分に強制すれば、テストに対する慣性の壁は壊れます。初めて行う場合、ドキュメントを読むことも含めて 30 分未満です。次に、テスト ケース 1 を作成します。メソッドの 1 つを呼び出し、「何も壊れていない」こと、つまりエラーが返されないことを確認します。テスト ケース 1 には 1 分もかかりません。慣性がなくなると、テスト範囲を段階的に拡大することが簡単になります。
    • コードを使用してテストを進化させましょう。模擬サーバーなどを使用した「正しい」エンドツーエンドのテストがどのようなものになるかに怯える必要はありません。コードはシンプルに始まり、新しいケースを処理できるように進化します。テストもそうすべきです。新しいケースや新しい複雑さをコードに追加するときは、新しいコードを実行するためのテスト ケースを追加します。バグを見つけたら、検証や新しいケースを追加して、欠陥のあるコードをカバーします。デバッグ中にコードの一部に自信を失った場合は、戻ってテストを追加して、思ったとおりに動作していることを証明します。サンプル データの文字列 (呼び出した他のサービス、スクレイピングした Web サイトなどから) をキャプチャし、解析コードにフィードします。ここにいくつかのケースがあり、そこでの検証が改善され、最終的に信頼性の高いコードが得られます。

また、以下もチェックしてください 公式リスト 推奨される Node.js モジュールのリスト。しかし、 GitHubの ノードモジュールWiki はより完全で、優れたリソースです。


Node を理解するには、主要な設計上の選択肢をいくつか考慮すると役立ちます。

Node.js は イベントベース そして 非同期 / ノンブロッキング. 。受信 HTTP 接続などのイベントは、少しの作業を実行する JavaScript 関数を起動し、データベースへの接続や別のサーバーからのコンテンツの取得などの他の非同期タスクを開始します。これらのタスクが開始されると、イベント関数が終了し、Node.js はスリープ状態に戻ります。データベース接続が確立されたり、外部サーバーがコンテンツで応答したりするなど、何か他のことが起こるとすぐに、コールバック関数が起動され、さらに多くの JavaScript コードが実行され、さらに多くの非同期タスク (データベース クエリなど) が開始される可能性があります。このようにして、Node.js は複数の並列ワークフローのアクティビティを適切にインターリーブし、いつでもブロックが解除されたアクティビティを実行します。これが、Node.js が数千の同時接続の管理に非常に優れた仕事をする理由です。

他の人と同じように、接続ごとに 1 つのプロセス/スレッドを使用しないのはなぜでしょうか? Node.js では、新しい接続は非常に小さなヒープ割り当てにすぎません。新しいプロセスをスピンアップすると、かなり多くのメモリが必要になり、プラットフォームによってはメガバイトになります。しかし、実際のコストはコンテキストの切り替えに伴うオーバーヘッドです。10^6 のカーネル スレッドがある場合、カーネルは次に誰を実行するかを判断するために多くの作業を行う必要があります。Linux 用の O(1) スケジューラの構築には多くの作業が費やされましたが、最終的には、10^6 のプロセスが CPU 時間を争うよりも、単一のイベント駆動型プロセスを使用する方がはるかに効率的です。また、過負荷状態では、マルチプロセス モデルの動作が非常に悪くなり、重要な管理サービス、特に SSHD が利用できなくなります (つまり、ボックスにログインして実際にどれほどひどい状態になっているかを理解することさえできません)。

Node.js は シングルスレッド そして ロックフリー. 。Node.js は、非常に慎重な設計選択により、プロセスごとに 1 つのスレッドのみを持ちます。このため、複数のスレッドが同時にデータにアクセスすることは基本的に不可能です。したがって、ロックは必要ありません。糸は硬いですね。本当に本当に大変です。それが信じられない場合は、スレッド プログラミングを十分に行っていないことになります。正しくロックすることは難しく、追跡が非常に困難なバグが発生します。ロックとマルチスレッドを排除すると、最も厄介なクラスのバグの 1 つが消えます。これがノードの最大の利点かもしれません。

しかし、16 コア ボックスを活用するにはどうすればよいでしょうか?

ふたつのやり方:

  1. 画像エンコードなどの大きく負荷の高い計算タスクの場合、Node.js は子プロセスを起動したり、追加のワーカー プロセスにメッセージを送信したりできます。この設計では、イベントのフローを管理する 1 つのスレッドと、負荷の高い計算タスクを実行して他の 15 個の CPU を使い果たす N 個のプロセスがあります。
  2. Web サービスのスループットをスケーリングするには、次のようにして、1 つのボックス上でコアごとに 1 つずつ複数の Node.js サーバーを実行する必要があります。 集まる (Node.js v0.6.x では、ここにリンクされている公式の「クラスター」モジュールが、別の API を持つ learnboost バージョンを置き換えます)。これらのローカル Node.js サーバーは、ソケット上で競合して新しい接続を受け入れ、負荷を分散します。接続が受け入れられると、その接続はこれらの共有プロセスの 1 つに緊密にバインドされます。理論的には、これは悪いように思えますが、実際には非常にうまく機能し、スレッドセーフなコードを書くという頭痛の種を避けることができます。また、これは、Node.js が優れた CPU キャッシュ アフィニティを獲得し、メモリ帯域幅をより効果的に使用できることを意味します。

Node.js を使用すると、汗をかかずに非常に強力な処理を行うことができます。 さまざまなタスクを実行し、 TCP コマンド用のポート、画像などをエンコードします。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 は遅い/悪い/邪悪/悪魔の子ではないでしょうか? JavaScript には奇妙な点がいくつかありますが、「良い部分」を備えた非常に強力な言語があり、いずれにせよ、JavaScript はクライアント (ブラウザ) 上の言語です。JavaScript は今後も存続します。他の言語もこれを IL としてターゲットにしており、世界クラスの人材が最先端の JavaScript エンジンを開発するために競い合っています。ブラウザーにおける JavaScript の役割により、JavaScript を高速化するために多大なエンジニアリング努力が費やされています。 V8 は、少なくとも今月に関しては、最新かつ最高の JavaScript エンジンです。効率性と安定性の両方で他のスクリプト言語を圧倒します (Ruby さん、見てください)。そして、Microsoft、Google、Mozilla の大規模なチームがこの問題に取り組み、最高の JavaScript エンジンを構築するために競い合うことで、この問題はさらに改善されるでしょう (最新のエンジンはすべて、大量の機能を実行するため、JavaScript はもはや JavaScript の「インタプリタ」ではありません)。 ジット 1 回実行コードのフォールバックとしてのみ解釈して内部でコンパイルします)。そうです、JavaScript 言語の奇妙な選択をいくつか修正できればと誰もが願っていますが、実際にはそれほど悪いことではありません。そして、この言語は非常に柔軟なので、実際には JavaScript をコーディングしているのではなく、Step または jQuery をコーディングしていることになります。JavaScript では、他のどの言語よりもライブラリがエクスペリエンスを定義します。Web アプリケーションを構築するには、とにかく JavaScript を理解する必要があるため、サーバー上で JavaScript を使用してコーディングすると、一種のスキルセットの相乗効果が得られます。そのおかげで、クライアント コードを書くのが怖くなくなりました。

さらに、JavaScript が本当に嫌いな場合は、次のような糖衣構文を使用できます。 コーヒースクリプト. 。または、JavaScript コードを作成するその他のもの: Google ウェブ ツールキット (GWT)。

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」をオブジェクトに隠し込むなどの厄介なことをせずに、単に「myData」を使用できる方法がわかりましたか?また、Java とは異なり、「myData」変数は読み取り専用である必要はありません。この強力な言語機能により、非同期プログラミングの冗長性と苦痛が大幅に軽減されます。

非同期コードの作成は、単純なシングルスレッド スクリプトを作成するよりも常に複雑になりますが、Node.js を使用すると、それほど難しくなく、数千の同時接続に対する効率性とスケーラビリティに加えて、多くのメリットが得られます。 ..

V8 にはJavaScriptの実装です。それはあなたが(特に)、スタンドアロンのJavaScriptアプリケーションを実行できます。

Node.jsのは、単純にイベント化I / Oを行いますV8のために書かれたライブラリです。ドン要旨ではなく、いくつかの入力または出力をやって、それが起こるのを待っているよりも、あなただけの<全角>ということです...この概念は説明するのは少しトリッキーです、と私は誰かが私より良い説明を答えると確信して「T の、それが終了するのを待ちます。したがって、たとえば、ファイルの最後に編集した時間を尋ねるます:

// Pseudo code
stat( 'somefile' )

これは、ミリ秒のカップルがかかる場合があります、またはそれは秒かかる場合があります。添付イベント化 I / O には、単に要求をオフに解雇し、代わりにあなたの周りに待っています要求が終了したときに実行されるコールバックます:

// Pseudo code
stat( 'somefile', function( result ) {
  // Use the result here
} );
// ...more code here

これはアヤックスで、それ例えば、ブラウザでのJavaScriptコードのようにたくさん(作りますのスタイル機能)。

詳細については、あなたが記事をチェックアウトする必要があります。のNode.js本当にありますライブラリ/プラットフォームへの私の紹介したのエキサイティングの...私はそれがかなり良い見つけます。

Node.js は、サーバー側の JavaScript コード用に構築されたオープン ソースのコマンド ライン ツールです。ダウンロードできます タールボール, 、ソースをコンパイルしてインストールします。JavaScript プログラムを実行できるようになります。

JavaScript は次によって実行されます。 V8, 、Google によって開発された JavaScript エンジンで、 クロム ブラウザ。JavaScript API を使用してネットワークとファイル システムにアクセスします。

そのパフォーマンスと並列処理を実行できる機能で人気があります。

Node.js を理解する の最良の説明です ノード.js これまでに見つけました。

以下に、このトピックに関する優れた記事をいくつか紹介します。

クロージャは、それが作成されたコンテキストでコードを実行する方法である。

これは並行性のために何を意味しますが、変数を定義することができるということです、そしてhref="http://en.wikipedia.org/wiki/Input/output" rel="nofollow noreferrer"> I / Oノンブロッキングの機能、およびそれにそのコールバックの無名関数を送っています。

タスクが完了すると、コールバック関数は変数とコンテキストで実行されます、これは閉鎖されます。

閉鎖はノンブロッキングでの書き込みアプリケーションのためのとても優れている理由は、I / Oは、それが非同期に実行機能のコンテキストを管理するのは非常に簡単だということです。

2 つの良い例は、テンプレートの管理方法と、テンプレートでのプログレッシブ機能拡張の使用方法に関するものです。完璧に動作させるために必要なのは、いくつかの軽量の JavaScript コードだけです。

以下の記事を見て読むことを強くお勧めします。

任意の言語を選択し、HTML ファイル テンプレートをどのように管理するか、単一の HTML ファイル テンプレートを更新するには何をしなければならないかを思い出してください。 CSS あなたのクラス名 ドム 構造 (たとえば、ユーザーがメニュー項目をクリックし、それを「選択済み」としてマークし、ページのコンテンツを更新したい場合など)。

Node.js を使用すると、クライアント側の JavaScript コードで実行するだけで簡単になります。DOM ノードを取得し、それに CSS クラスを適用します。DOM ノードとコンテンツの innerHTML を取得します (これを行うには追加の JavaScript コードが必要になります。詳細については記事をお読みください)。

もう 1 つの良い例は、同じコード部分で JavaScript をオンまたはオフにした両方に Web ページの互換性を持たせることができることです。JavaScript で日付を選択し、ユーザーがカレンダーを使用して任意の日付を選択できるようにすると想像してください。同じ JavaScript コードを作成 (または使用) することで、JavaScript がオンでもオフでも機能するようにすることができます。

Node.js のイベント駆動モデルを最もよく説明する非常に優れたファストフード店の例えがあります。記事全文を参照してください。 Node.js、診療所、ファーストフード レストラン – イベント駆動型プログラミングを理解する

要約は次のとおりです。

ファストフード店が従来のスレッドベースのモデルに従っていた場合、食べ物を注文し、それが届くまで列に並んで待つことになります。あなたの注文が完了するまで、後ろの人は注文できません。イベント駆動型モデルでは、食べ物を注文し、列から出て待ちます。その後、他の人は自由に注文できます。

Node.js はイベント駆動型ですが、ほとんどの Web サーバーはスレッドベースです。York は Node.js がどのように機能するかを説明します。

  • Webブラウザを使用して、node.js Webサーバーで「/about.html」をリクエストします。

  • node.jsサーバーはリクエストを受け入れ、関数を呼び出してディスクからそのファイルを取得します。

  • node.jsサーバーがファイルが取得されるのを待っている間、次のWebリクエストをサービスします。

  • ファイルが取得されると、node.jsサーバーキューに挿入されるコールバック関数があります。

  • node.jsサーバーは、この場合、「/about.html」ページをレンダリングしてWebブラウザに送信する関数を実行します。

良い、 という事は承知しています

  • ノードの目標は、スケーラブルなネットワークプログラムを構築する簡単な方法を提供することです。
  • Node は、Ruby の Event Machine や Python の Twisted などのシステムと設計が似ており、その影響を受けています。
  • V8 JavaScript のイベント I/O。

私にとって、それはあなたが 3 つの仮定すべてにおいて正しかったことを意味します。図書館は確かに期待できそうです!

また、GoogleのV8は非常に高速であることを言及するのを忘れないでください。これは、実際にコンパイルされたバイナリのマッチした性能を持つマシンコードにJavaScriptコードを変換します。だから、他のすべての偉大なものと一緒に、それはめちゃくちゃ速いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top