JavaScript:サーバー側とクライアント側の両方で実行されるDOM依存コードのベストプラクティス?

james_womack

バックグラウンド

2年ちょっと前から(Batman.jsnode.jsを使用して)、サーバーとクライアントで同じDOMコードを実行する実験を開始しました。これはpushState、SEOおよび優れたユーザーエクスペリエンスのためにページが既にレンダリングされているルートを使用してレンダリングおよびアクセスできるSPA(単一ページアプリケーション)を備えていることが望まれます(ページのロード後にSPAレンダリング要素に関連付けられたページ「フラッシュ」はありません) )。これには通常if、モジュールがrequire.js実行されているwindowrequire.jsを使用して必要である、またはnode.jsなどのモジュールとして実行されているどうかをチェックするステートメントでモジュールをラップすることが含まれます

クライアント+サーバーSPAの現在の実装

RendrEzelはどちらも、クライアントとサーバーのコード共有とDOMレンダリング機能をバックボーンSPAに導入しようとしています。EzelにはBackboneモデル/コレクションに魔法がありますが、ビューはサーバーでExpress + Jadeを使用してレンダリングされ、クライアントでBackbone.View + Jadeを使用してレンダリングされます。つまり、拡張されたBackbone.ViewでRivetsのようなものを使用しても、HTMLがRivetsによって事前にレンダリングされたクライアントにヒットすることはありません。DOMサーバー側を自分でレンダリングするためのいくつかのベストプラクティスとテクニックを構築して、物事を単純に(ビューコードを1か所で編集)柔軟に(Ezelが現在サポートしていないDOM操作モジュールを追加できるように)したいと思います。 )。

望ましい結果

リベットのようなものを使用して、HTTPリクエストを介してページ全体をロードするためにルートがヒットしたときに、Expressからブラウザにページが提供される前にモデルデータをビューに挿入し、変更に応答するようにバインドしたいと思います。pushStateクライアントで。リベット使用してサーバー上のHTMLを変更してから提供し、クライアントにバインドしたままにするためのノードの環境要件は何ですか?jQueryBackboneRivetsなどをnode.js取り込み、HTMLテンプレートのDOMで実行してから、事前にレンダリングされた結果を提供するにはどうすればよいですか(その後、クライアントで通常のJS動作を維持します)。

関連モジュール

SharifyBrowserifyはどちらも、サイド間でコードを共有するのに役立つツールです。リベットはバックボーンjQueryのすべてのNode.js互換のディストリビューションを持っています。

現在の仕事

Githubのフォークを介しEzelに機能を追加する作業を開始しました

james_womack

jsdomを使用してEzelの上に構築することで、ほぼ純粋な同形のJavaScriptアプリケーションを実現することができました。jsdomはパフォーマンスに影響を与えるため、可能な場合はサーバーでリベットを実行した結果をキャッシュしました。

https://github.com/adjohnson916/rivets-serverからいくつかの手がかりを得ましたリベットに送信する必要のあるいくつかの構成オプションを踏みにじるため、そのモジュールを卸売りで使用できませんでした(リベットサーバーはリベットのフォークを使用します)。

私が最初に遭遇した落とし穴の1つは、SharifyとRivetsを同時に使用することに関連していました。Sharifyは、関数を含み、テンプレートに{}を使用しているため、リベットをトリップしたスクリプトをWebページに挿入します。templateDelimiters二重中括弧に変更することで、この問題を回避しました。

同形JavaScriptアプリケーションの主なコンポーネントは次のとおりです。

  • ブラウザのnode.js環境要素をシムするモジュールrequire(例:Browserify)
  • サーバー上でデータバインディングライブラリの最初の実行を使用する機能(たとえば、リベットを実行しているjsdom)。(私が貢献した)node-jadeifyを使用するEzelの方法ではなく、これを使用することは、レンダリングが2つの異なるファイルで異なる方法で行われる必要があるEzelよりも優れています。
  • HTTPリクエストのクライアントとサーバーの違いを抽象化するモジュール(例:backbone-super-sync)
  • クライアントとサーバー間で構成データを共有できるようにするモジュール(例:sharify)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ボタンクリックでクライアント側とサーバー側の両方の機能を実行する-特定のシナリオ

分類Dev

クライアント側とサーバー側の両方のレンダリングで同形コンポーネントを反応させる

分類Dev

GoogleスライドのmodalDialogHTML javascriptでサーバー側のコードを実行できますか?環境アプリスクリプト

分類Dev

サブクラス(オーバーライド)プロパティで実行されるJavascript基本クラスコンストラクター

分類Dev

クライアント側でjavaを実行すると、サーバー側でnullPointerExceptionが表示されます

分類Dev

Java-Maven-クライアント側とサーバー側の両方のプロジェクトでエンティティレイヤーを再利用する

分類Dev

分散システム:クライアント側のサーバー側でスローされたエラーを発生させる

分類Dev

MVC フォーマット番号 サーバー側とクライアント側の両方の EU スタイル

分類Dev

サーバー側とクライアント側の両方でrecvと送信機能を呼び出すときにクライアントのファイル記述子が使用されるのはなぜですか?

分類Dev

サーバー側とクライアント側のドロップダウンリスト

分類Dev

サーバー側とクライアント側のプロトコルスニフ

分類Dev

サーバー側とクライアント側の間でフィールド制約を共有する

分類Dev

Ember.jsサーバー側またはクライアント側、あるいはその両方?

分類Dev

クライアント側とサーバー側の両方でJavaソケットを閉じることは可能ですか?

分類Dev

クライアント側のAngularアプリで動的に生成されたサーバー側の環境変数にアクセスする

分類Dev

HTML5:クライアント側とサーバー側の両方でWebフォームを検証する必要がありますか、それともクライアント側だけで検証できますか?

分類Dev

クライアント側とサーバー側でのファイル名のスクラビング

分類Dev

これは私のクライアント側とサーバー側のコードです。クライアントコードを2回実行した後、「接続に失敗しました」というエラーが表示される理由がわかりません

分類Dev

サーバー側でクライアント側のWebSocketアプリを実行しますか?

分類Dev

GWTのコードがサーバー側とクライアント側のどちらで実行されるかを確認するにはどうすればよいですか?

分類Dev

同じコードベース/package.jsonにMochaテストとKarmaテスト(サーバー側とクライアント側)を含めるにはどうすればよいですか?

分類Dev

同じコードベース/package.jsonにMochaテストとKarmaテスト(サーバー側とクライアント側)を含めるにはどうすればよいですか?

分類Dev

ac#.NETWebアプリケーションでサーバー側の処理のステータスをクライアント側に表示する方法

分類Dev

MEANスタックを使用する場合、クライアント側とサーバー側の検証は簡単にサポートされますか?

分類Dev

ベースと派生の両方が派生型パラメーターでテンプレート化されている場合にベースコンストラクターを呼び出すときのコンパイラエラー

分類Dev

ギガバイトg1sniper-b5マザーボードで実行されているnVidiaGPUとIntelグラフィックスの両方

分類Dev

HTTP / 2では、ヘッダーはクライアント側とサーバー側の両方でどのように同期を維持しますか?

分類Dev

クライアント側のJavaScriptとサーバー側のJavaはどれくらい速いですか?

分類Dev

クライアント側のルーティングは、角度のあるユニバーサルで提供されるサーバー側のルーティングとともに推奨されますか?

Related 関連記事

  1. 1

    ボタンクリックでクライアント側とサーバー側の両方の機能を実行する-特定のシナリオ

  2. 2

    クライアント側とサーバー側の両方のレンダリングで同形コンポーネントを反応させる

  3. 3

    GoogleスライドのmodalDialogHTML javascriptでサーバー側のコードを実行できますか?環境アプリスクリプト

  4. 4

    サブクラス(オーバーライド)プロパティで実行されるJavascript基本クラスコンストラクター

  5. 5

    クライアント側でjavaを実行すると、サーバー側でnullPointerExceptionが表示されます

  6. 6

    Java-Maven-クライアント側とサーバー側の両方のプロジェクトでエンティティレイヤーを再利用する

  7. 7

    分散システム:クライアント側のサーバー側でスローされたエラーを発生させる

  8. 8

    MVC フォーマット番号 サーバー側とクライアント側の両方の EU スタイル

  9. 9

    サーバー側とクライアント側の両方でrecvと送信機能を呼び出すときにクライアントのファイル記述子が使用されるのはなぜですか?

  10. 10

    サーバー側とクライアント側のドロップダウンリスト

  11. 11

    サーバー側とクライアント側のプロトコルスニフ

  12. 12

    サーバー側とクライアント側の間でフィールド制約を共有する

  13. 13

    Ember.jsサーバー側またはクライアント側、あるいはその両方?

  14. 14

    クライアント側とサーバー側の両方でJavaソケットを閉じることは可能ですか?

  15. 15

    クライアント側のAngularアプリで動的に生成されたサーバー側の環境変数にアクセスする

  16. 16

    HTML5:クライアント側とサーバー側の両方でWebフォームを検証する必要がありますか、それともクライアント側だけで検証できますか?

  17. 17

    クライアント側とサーバー側でのファイル名のスクラビング

  18. 18

    これは私のクライアント側とサーバー側のコードです。クライアントコードを2回実行した後、「接続に失敗しました」というエラーが表示される理由がわかりません

  19. 19

    サーバー側でクライアント側のWebSocketアプリを実行しますか?

  20. 20

    GWTのコードがサーバー側とクライアント側のどちらで実行されるかを確認するにはどうすればよいですか?

  21. 21

    同じコードベース/package.jsonにMochaテストとKarmaテスト(サーバー側とクライアント側)を含めるにはどうすればよいですか?

  22. 22

    同じコードベース/package.jsonにMochaテストとKarmaテスト(サーバー側とクライアント側)を含めるにはどうすればよいですか?

  23. 23

    ac#.NETWebアプリケーションでサーバー側の処理のステータスをクライアント側に表示する方法

  24. 24

    MEANスタックを使用する場合、クライアント側とサーバー側の検証は簡単にサポートされますか?

  25. 25

    ベースと派生の両方が派生型パラメーターでテンプレート化されている場合にベースコンストラクターを呼び出すときのコンパイラエラー

  26. 26

    ギガバイトg1sniper-b5マザーボードで実行されているnVidiaGPUとIntelグラフィックスの両方

  27. 27

    HTTP / 2では、ヘッダーはクライアント側とサーバー側の両方でどのように同期を維持しますか?

  28. 28

    クライアント側のJavaScriptとサーバー側のJavaはどれくらい速いですか?

  29. 29

    クライアント側のルーティングは、角度のあるユニバーサルで提供されるサーバー側のルーティングとともに推奨されますか?

ホットタグ

アーカイブ