web-dev-qa-db-ja.com

Node.jsとは何ですか?

Node.js が何なのか完全にはわかりません。私が主にWebベースのビジネスアプリケーション開発者であるためかもしれません。それは何ですか、そしてそれは何を使用していますか?

私の理解はこれまでのところです:

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

私の理解は正しいですか?もしそうであれば、イヴェントされたI/Oの利点は何でしょうか、それは同時並行性のためだけのものですか?また、Node.jsは、JavaScriptベース(V8ベース)のプログラミングモデルのようなフレームワークになることを目指していますか?

506
Jeff

私は利点があると思います:

  1. 非常に速いVM上の動的言語(JavaScript)でのWeb開発(V8)。 Ruby、Python、Perlよりはるかに速いです。

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

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

  4. プログラマであると主張していない人々でさえも、すでに多くの人々がJavaScriptを知っています。それは間違いなく最も人気のあるプログラミング言語です。

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

213
postfuturist

私は仕事で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を記述することは、最新のUIパターンを学習するための「ゲートウェイドラッグ」でした。私はもはやクライアントコードを書くことを恐れません。
  • プロ:適切なエラーチェックを推奨する傾向がある(エラーは事実上すべてのコールバックによって返され、プログラマーがそれを処理するようにせがむ;また、async.jsおよび他のライブラリは、「これらのサブタスクのいずれかが失敗した場合に失敗」パラダイムを通常の同期コードよりもはるかによく処理する)
  • プロ:いくつかの興味深く、通常は難しいタスクが簡単になります-飛行中のタスクのステータスの取得、ワーカー間の通信、キャッシュ状態の共有など
  • プロ:固体パッケージマネージャー(npm)に基づく巨大なコミュニティと多数の優れたライブラリ
  • 欠点:JavaScriptには標準ライブラリがありません。 JSON.parseまたはnpmモジュールの追加を必要としない他のビルドインメソッドを使用すると、奇妙に感じる機能のインポートに慣れます。これは、すべての5つのバージョンがあることを意味します。 Node.jsの「コア」に含まれるモジュールでさえ、デフォルトの実装に満足できない場合は、さらに5つのバリアントがあります。これは急速な進化につながりますが、ある程度の混乱ももたらします。

単純な要求ごとの1プロセスモデル( LAMP )と比較して:

  • Pro:数千のアクティブな接続に拡張可能。非常に高速で非常に効率的です。 Webフリートの場合、これは、必要なボックスの数がPHPまたはRubyに対して10倍削減されることを意味します。
  • 利点:並列パターンの作成は簡単です。 Memcached から3つ(またはN)のブロブを取得する必要があると想像してください。 PHPでこれを行います...最初のblobをフェッチし、次に2番目、次に3番目のblobをフェッチするコードを記述しましたか?うわー、それは遅いです。 Memcachedの特定の問題を修正する特別な PECL モジュールがありますが、データベースクエリと並行してMemcachedデータを取得したい場合はどうでしょうか? Node.jsでは、パラダイムは非同期であるため、Webリクエストに複数の処理を並行して実行させることは非常に自然です。
  • 欠点:非同期コードは同期コードよりも根本的に複雑であり、同時実行が実際に何を意味するのかをしっかりと理解していないと、開発者にとって事前の学習曲線が難しくなります。それでも、ロック付きのあらゆる種類のマルチスレッドコードを記述するよりもはるかに難しくありません。
  • 短所:計算集中型の要求が、たとえば100ミリ秒実行されると、同じNode.jsプロセスで処理されている他の要求の処理が停止します... AKA、 cooperative-multitasking 。これは、Web Workersパターン(コストのかかるタスクを処理するためにサブプロセスをスピンオフする)で軽減できます。あるいは、多数のNode.jsワーカーを使用して、各ワーカーが単一のリクエストを同時に処理できるようにすることもできます(プロセスのリサイクルがないため、かなり効率的です)。
  • 欠点:実稼働システムの実行は、Apache + PHPのような CGI モデル、 PerlRuby など。未処理の例外はプロセス全体を停止させ、失敗したワーカーを再起動するロジックを必要とします(cluster)を参照)。バグのあるネイティブコードを持つモジュールは、プロセスをハードクラッシュさせる可能性があります。ワーカーが死亡するたびに、それが処理していたリクエストはすべて破棄されるため、1つのバグのあるAPIは、他のホストされているAPIのサービスを簡単に低下させる可能性があります。

Java/C#/ C(C?本当に?)での「実際の」サービスの作成と比較

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

JavaScriptとNode.jsの別の観点については、からJavaからNode.jsへのブログ投稿をチェックしてください。 Java開発者のNode.jsの学習の印象と経験。


Modulesノードを検討するとき、JavaScriptライブラリの選択はDEFINEあなたの経験になります。ほとんどの人は、少なくとも2つの非同期パターンヘルパー(Step、Futures、Async)、およびJavaScriptシュガーモジュール( Underscore.js )を使用します。

ヘルパー/ JavaScriptシュガー:

  • Underscore.js -これを使用します。早くやれよ。 _.isString()や_.isArray()のようなものでコードを読みやすく、読みやすくします。そうでなければ、安全なコードをどのように書くことができるのか、私には本当にわかりません。また、強化されたコマンドライン機能については、独自の Underscore-CLI を確認してください。

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

  • Step -シリアルアクションとパラレルアクションの組み合わせを表現する非常にエレガントな方法。私の個人的な推薦。ステップコードがどのように見えるかについては、 私の投稿 を参照してください。
  • Futures -要件を介して順序付けを表現する、はるかに柔軟な(本当に良いことですか?) 「a、b、cを並行して開始します。A、Bが終了したらABを開始します。A、Cが終了したらACを開始します」などのことを表現できます。このような柔軟性には、ワークフロー内のバグ(コールバックを呼び出さない、複数回呼び出すなど)を回避するための注意が必要です。先物の使用については、 Raynosの投稿 を参照してください(これは、先物を「取得」した投稿です)。
  • Async -パターンごとに1つのメソッドを持つ従来のライブラリ。私は、宗教へのステップへの変換とその後の、非同期のすべてのパターンがより読みやすい単一のパラダイムでステップで表現できることを認識する前に、これから始めました。
  • TameJS -OKCupidによって書かれた、それはエレガントなシリアルおよびパラレルワークフローを記述するための新しい言語の原始的な「待機」を追加するプリコンパイラです。パターンは驚くほどに見えますが、事前コンパイルが必要です。私はまだこれについて決心しています。
  • StreamlineJS -TameJSのライバル。私はTameに傾いていますが、あなたはあなた自身の決心をすることができます。

または、非同期ライブラリのすべてを読むには、著者との this panel-interview を参照してください。

Webフレームワーク:

  • Express Webサイトを整理するためのRails-eskフレームワークの素晴らしいRuby。 JADE をXML/HTMLテンプレートエンジンとして使用します。これにより、HTMLの作成がはるかに簡単になり、ほとんどエレガントになります。
  • jQuery 技術的にはノードモジュールではありませんが、jQueryはすぐにクライアント側ユーザーインターフェイスの事実上の標準になりつつあります。 jQueryは、操作可能なDOM要素のセット(ハンドラー、プロパティ、スタイルなどを設定)の「クエリ」にCSSのようなセレクターを提供します。同様に、Twitterの Bootstrap CSSフレームワーク、 Backbone.jsMVC パターン、および Browserify.js を使用して、すべてのJavaScriptファイルを1つのファイルに統合します。これらのモジュールはすべて事実上の標準になりつつあるため、聞いたことがない場合は少なくともチェックアウトする必要があります。

テスト:

  • JSHint -使用する必要があります。最初はこれを使用しませんでしたが、今では理解できないようです。 JSLintは、Javaのようなコンパイルされた言語で得られる基本的な検証の束を追加します。括弧の不一致、宣言されていない変数、多くの形状とサイズのタイプ。空白やその他のスタイルを検証する「アナルモード」と呼ばれるもののさまざまな形式をオンにすることもできますが、それがあなたのお茶のカップであれば大丈夫です-しかし、本当の価値は正確な行番号に関する即時のフィードバックを得ることです終了 ")"を忘れた...コードを実行して問題のある行にヒットする必要はありません。 「JSHint」は、 Douglas CrockfordJSLint のより構成可能なバリアントです。
  • Mocha のVowsのライバルです。両方のフレームワークは基本を十分に処理しますが、複雑なパターンはMochaで表現しやすい傾向があります。
  • Vows Vowsは本当にエレガントです。そして、どのテストケースが成功/失敗したかを示す素敵なレポート(--spec)を出力します。 30分間学習すれば、最小限の労力でモジュールの基本的なテストを作成できます。
  • Zombie - JSDom を仮想「ブラウザ」として使用したHTMLおよびJavaScriptのヘッドレステスト。非常に強力なもの。 Replay と組み合わせて、ブラウザ内のコードの非常に高速な確定的テストを取得します。
  • テストを「考える」方法に関するコメント:
    • テストはオプションではありません。 JavaScriptのような動的言語では、非常に少ない静的チェックがほとんどありません。たとえば、4を予期するメソッドに2つのパラメーターを渡すと、コードが実行されるまで中断しません。 JavaScriptのバグを作成するためのかなり低いバー。コンパイルされた言語との検証のギャップを埋めるには、基本的なテストが不可欠です。
    • 検証を忘れて、コードを実行するだけです。どの方法でも、最初の検証ケースは「何も壊れない」ことであり、これが最も頻繁に発生するケースです。コードをスローせずに実行すると、バグの80%がキャッチされ、コードの信頼性が向上して、戻ってスキップした微妙な検証ケースを追加できるようになります。
    • 小さく始めて、慣性障壁を破ります。私たちは皆怠け者であり、時間に追われており、テストを「余分な作業」と見なすのは簡単です。だから小さく始めましょう。テストケース0を書く-モジュールをロードし、成功を報告します。これだけのことを強制する場合、テストに対する慣性の障壁が破られます。ドキュメントを読むことを含めて、初めて行うのは30分未満です。テストケース1を作成します。メソッドの1つを呼び出して、「何も壊れない」こと、つまりエラーが返されないことを確認します。テストケース1では、1分もかかりません。慣性がなくなると、テストカバレッジを段階的に拡張することが容易になります。
    • 次に、コードを使用してテストを進化させます。 「正しい」エンドツーエンドテストがモックサーバーなどでどのように見えるかを怖がらないでください。コードはシンプルに始まり、新しいケースを処理するために進化します。テストもすべきです。コードに新しいケースと新しい複雑さを追加したら、テストケースを追加して新しいコードを実行します。バグを見つけたら、検証や新しいケースを追加して、欠陥のあるコードをカバーします。デバッグ中にコードの一部に自信がなくなったら、戻ってテストを追加し、自分が思っているとおりに動作していることを証明します。サンプルデータの文字列(呼び出した他のサービス、スクレイプした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コアのボックスをどのように活用しますか?

二通り:

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

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を使用すればそれほど難しくはなく、数千の同時接続の効率性とスケーラビリティに加えて多くの利点が得られます。 ..

619
Dave Dopson

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は本当に刺激的ですをご覧ください。 ...かなり良かった。

85
rfunduk

Node.js は、サーバーサイドのJavaScriptコード用に構築されたオープンソースのコマンドラインツールです。 tarball をダウンロードして、ソースをコンパイルしてインストールすることができます。 JavaScriptプログラムを実行できます。

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

パフォーマンスと並列操作の実行能力で人気があります。

node.jsを理解するnode.jsの最良の説明です 私はこれまでに見つけました。

以下は、このトピックに関するいくつかの良い記事です。

35
Asif Mushtaq

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

これが簡潔さのために何を意味するかというと、変数を定義し、それからノンブロッキング I/O 関数を起動し、それにコールバックのための無名関数を送ることができるということです。

タスクが完了すると、コールバック関数は変数とともにコンテキスト内で実行されます。これがクロージャです。

ノンブロッキングI/Oを使用してアプリケーションを作成するのにクロージャが非常に優れているのは、非同期に実行されている関数のコンテキストを管理するのが非常に簡単だからです。

13
Fire Crow

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

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

任意の言語を選択し、HTMLファイルテンプレートを管理する方法と、 _ dom _ 構造内の単一の _ css _ クラス名を更新するためにしなければならなかったことを覚えておいてください。ユーザーがメニュー項目をクリックし、それを「選択済み」としてマークしてページのコンテンツを更新する必要があります。

Node.jsでは、クライアントサイドのJavaScriptコードで行うのと同じくらい簡単です。 DOMノードを取得し、それにCSSクラスを適用してください。あなたのDOMノードとinnerHTMLあなたのコンテンツを入手してください(これを行うにはいくつかの追加のJavaScriptコードが必要になります。詳細については記事を読んでください)。

もう1つの良い例は、同じコードでJavaScriptを有効または無効にしてWebページを互換にできることです。ユーザーがカレンダーを使用して任意の日付を選択できるように、JavaScriptで日付を選択したとします。 JavaScriptをオンまたはオフにして動作するように、同じJavaScriptコードを書く(または使用する)ことができます。

8
Renato

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ブラウザーに送り返す関数を実行します。

7
adeleinr

また、GoogleのV8は非常に速いということを言及することを忘れないでください。実際には、JavaScriptコードをコンパイル済みバイナリと同等のパフォーマンスでマシンコードに変換します。それで、他のすべての素晴らしいものと共に、それはめちゃくちゃ速いです。

6
Quinton Pike

まあ、 私はそれを理解しています

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

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

6
nes1983

Q:プログラミングモデルはイベント駆動型で、特に I/O の処理方法です。

正しい。コールバックを使用するため、ファイルシステムにアクセスするための要求があると、ファイルシステムに要求が送信され、Node.jsは次の要求の処理を開始します。ファイルシステムから応答が返ってきたら、I/O要求について心配するだけで、そのときコールバックコードが実行されます。ただし、同期I/O要求(つまり、ブロック要求)を行うことは可能です。非同期(コールバック)と同期(待機)のどちらを選択するかは開発者次第です。

Q:JavaScriptを使いパーサーはV8です。

はい

Q:コンカレントサーバーアプリケーションの作成に簡単に使用できます。

はい、かなりのJavaScriptを手作業でコーディングする必要があります。 http://www.easynodejs.com/ - のようなフレームワークを見た方が良いかもしれません。これには完全なオンラインドキュメントとサンプルアプリケーションが付属しています。

3
Charles