2

NodeJSサーバーのCPU使用率を減らすための興味深い方法を検討しています。

調査中に、次の記事を見つけました:http: //engineering.linkedin.com/nodejs/blazing-fast-nodejs-10-performance-tips-linkedin-mobile

これらはすべて優れたヒントですが、ヒント#4について質問があります。

これは本当に、ユーザーが「JavaScriptTemplate.html」を要求し、その後すべてのJSONが要求されることを意味します(これはここでは実装されていません)。

すべての動的コンテンツがユーザーの操作なしで利用可能である必要があると仮定すると(たとえば、ボタンクリックイベントでJSONを要求する)、これを達成するための最良の方法は何ですか?JSONのものを要求するために関数が実行される追加のJS依存関係(requirejs)をロードすることを考えることができます。

静的なhtmlファイルを呼び出す大きなWebサイトは見たことがないので、代わりにアプリケーションサーバーへのルートを要求するので、上記のリンクで提案されている解決策はどれほど一般的ですか?彼らは本当にサーバー側のテンプレートを使用して、ほとんど静的なテキストコンテンツでCPU使用率を浪費していますか?

Node(expressJS)の場合、特に生成されるHTMLがかなり複雑な場合、これは最適ではない方法である必要があります...理想的にはNodeはJSONデータを提供するAPIサーバーとして動作する必要があります。

共有するアイデアはありますか?

4

2 に答える 2

2

これは最も一般的なアプローチではありませんが、今日でもかなり一般的です。クライアント側のテンプレートのこのアイデアでうまく機能する多くのWebフレームワーク( Googleによるangularjsノックアウト口ひげなど)があります。

モデルはサーバー(つまりjson)に要求され、静的ビュー(テンプレート)にマップされます。

JSONデータを提供するAPIサーバーがある場合に非常に適していると思います。このようにして、別のAPIクライアント、この場合はWebクライアント(RIA)を開発できます。しかし、このアプローチの背後にある主な理由は、CPUを節約することではないと思います。

于 2012-12-31T16:08:32.100 に答える
2

投稿を共有してくれてありがとう-それは素晴らしいものです(そして私にとって非常にタイムリーです)。

あなたは実際に2つの質問をしています-1)クライアントとの対話なしでhtmlクライアント側をレンダリングするためにデータをロードする方法と2)ユーザーが実際にルートを要求したときに静的ファイルをブラウザに送信する方法。

ユーザーの操作なしでページをレンダリングし、クライアントMVCで私の¢2

1)ページがロードされた後にページをレンダリングするには、すべての初期化/データロード/レンダリングコードを実行する必要があります。クライアントでjQueryを使用する場合(ほとんどのWebアプリケーションと同様):

$(document).ready(function(){
    // Your code here
});

jQueryドキュメントからコピーされただけです。

ほとんどの人は、バックボーン/アンダースコアを使用してクライアントにMVCレイヤーを構築します。これを行うには、より洗練された(そして一見より強力な)クライアント側フレームワークがたくさんありますが、このカップルは、オプションを制限したり、ある時点で間違いなく必要になる柔軟性を低下させたりすることなく、十分なパワーを提供します。アンダースコア(とにかくバックボーンの依存関係です)に加えて、多くの非常に便利な関数(1ページのマニュアル全体を読むのに1時間費やすと、JavaScriptで何ができるかに驚くでしょう)には、一見シンプルで同時にある独自のテンプレートがありますテンプレート内ですべてのJavaScriptを実行するだけなので、非常に強力な時間です。

通常、テンプレートにアプリケーションロジックを含めることは悪いことですが(アンダースコアが許可され、ほとんどのより洗練された「より強力な」テンプレートエンジンは許可されないため)、テンプレートにロジックを追加できる方が非常に便利で、はるかに優れています。多くのアプリケーションロジックを再設計したり、テンプレートを追加したりするよりも、(よくあることですが)狭い場所にいることに気付いたとき。

また、ここで書いたように、require.jsやその他のモジュールローダーを(実際に使用する必要があるまで)使用しないようにすることも私の意見です。

任意のルートに静的HTMLを提供し、node-as-apiのnginx構成を提供します

2)同じ静的htmlファイル(または複数のルート依存htmlファイル)で応答するには、すべてのルートへの要求を書き換える必要があります。設定やアプリケーションの要件に応じて、本文が空のファイル(この場合、データが読み込まれ、ページが本文にレンダリング/挿入されるまで、ユーザーには空白のページが表示されます)、ウェルカムページ、またはテンプレートページが表示されます。データの代わりに、スピニングホイールが表示されます。

リクエストを書き換える方法は、静的コンテンツの提供とリクエストのプロキシに使用するWebサーバーによって異なります。Apacheを使用する場合(同期であるため、Nodeでの選択はほとんどありません)、.htaccessファイルを使用する必要があります。ノードを使用するほとんどの人が行うようにNginxを使用する場合は、以下の例のように、構成ファイルのサーバーブロック内でrewriteディレクティブを使用する必要があります。

server {
    listen       80;
    server_name  example.com;
    root         html/example;

    access_log   logs/example.log;

    # location block below sends specific static assets from inside your app's
    # public directory when routes /img, /js, /css, /views are requested
    location ~ /(img|js|css|views)/ {
        rewrite ^(.*)$ /public/$1 break;
    }

    # location block below proxies all data requests (/api route) to your node app
    location /api {
        proxy_pass             http://localhost:3000/;
        proxy_redirect         http://localhost:3000/ http://example.com;
        proxy_connect_timeout  30s;
        proxy_read_timeout     30s;
        proxy_cookie_domain    localhost example.com;
        #proxy_http_version     1.1;
    }

    # location block below rewrites all other routes to a specific html file
    # that is sent to the client and that is supposed to load all JS and
    # static assets to render a page
    location / {
        rewrite ^(.*)$ /public/app.html;
    }
}

クライアントでページをレンダリングする方法(およびサーバーに要求するデータ)は、ユーザーが要求したルート(javascriptでアクセス/変更できるほか、Cookieを設定/アクセス/変更できるルート)によって異なります。 )。アプリケーション内のすべてのナビゲーション(ユーザーがボタンまたは内部リンクをクリックすると、すべてのクリックイベントをキャッチする必要があります)は、既にロードされているページまたは静的アセットに対する追加のリクエストなしで実行され、データリクエストのみがサーバーに送信されます。

お役に立てば幸いです。

SEOアップデート

nginxの推奨構成は、ロボットによってインデックスが作成され、Facebookなどの静的HTMLを必要とする他のWebアプリに表示されるページが必要ない場合にのみ適しています。たとえば、インデックスを作成するページの場合、条件を追加する必要があります。ロボットからのリクエストを異なる方法でルーティングし($ http_user_agentに基づく)、それらのルートの静的htmlをレンダリングします。ただし、純粋にセマンティックなHTMLとは異なる場合があります(より小さく、デザインイメージ、レイアウトdiv /クラス、UI要素、およびクロールロボットやWebアプリからのリクエストを減らすためのjavascriptがありません)。

于 2013-01-01T17:48:03.193 に答える