私は、Rhino と Java に基づくオープン ソースのサーバー側 JS プラットフォームであるMyna (www.mynajs.org) の開発者です。Myna に関連する問題に対処しますが、これらのポイントの多くは一般的にサーバー側 JS に適用されます。
サーバーサイド JS を使用することで、サーバーサイド言語 (C#、Java など) を使用せずに Web アプリケーション全体を実装できますか? または、サーバー側の JS は、Web サーバーと他の言語スタックの間に配置されます。
Myna では、アプリ全体を JS で書くことができます。Myna には、データベース アクセス、オブジェクト リレーショナル マッピング、crytogrophy、OpenID などの API が既に含まれています。
それは本当に c#/Java よりも優れたアプローチですか?
Rhino ベースのサーバーでは、必要に応じて Java にドロップダウンするのは簡単です。オープンソース/商用/ハンドコーディングされた Java ライブラリを簡単にインストールして、JS からスクリプトを作成できます。これは、JS の迅速な開発を実現しながら、Java プラットフォームの利点を維持することを意味します。
長所と短所は何ですか?
長所:
迅速な開発: Myna では、webroot に .sjs 拡張子のファイルを作成するだけです。これは、コードのデバッグ/調整が非常に高速な、編集-保存-更新ブラウザ サイクルを作成できることを意味します。
簡単な JSON : JS がサーバー側でサポートされているということは、複雑な構造の移動が非常に簡単であることを意味します
共有コード: サーバーとブラウザの両方で同じ機能を実行する必要がある場合は、同じコードを使用できます
動的 ORM : 静的に型付けされたコンパイル済み言語により、実行時にオブジェクトを変更することが困難になります。これは通常、ORM を事前に定義する必要があることを意味します。Myna の建物の ORM は次のようにシンプルです。
var manager =new Myna.DataManager("DataSource name").getManager("table name");
DB テーブルを明示的に定義しなくても、すべての基本的な CRUD 操作を実行できるオブジェクトを取得します。別の例として、フォーム投稿から一致するすべての値を含む行を挿入できます。
manager.create($req.data);
関数型プログラミング: 高度な JavaScript 機能を使い始めたことがあれば、それらがサーバー側でどれほど役立つかを理解するでしょう。サーバー側の環境が一貫しているため、Array Extras、generators and iterators、destructuring assignments、E4Xなどの高度な機能を安全に使用できます。
短所:
ツール: C# や Java などの静的型付け言語には、優れた IDE および開発者ツールがあります。JS のような動的言語には、まだツールのサポートがありません。個人的には、ボイラープレート コードの大幅な削減と面倒な型キャストがこれを補っていると思いますが、IDE で多くの開発を行っている場合、これは依然として大きな欠点です。現在 IDE を使用している場合は、動的言語にjeditを使用することを検討してください
成熟度/標準化: サーバーサイド JS はまだ新しいパラダイムであり、多くのプレーヤーが存在し、明確な勝者はいません。ECMA には、サーバーサイド JS の標準はありません。Brandon の回答で述べたように、CommonJSグループはサーバーサイド JS 標準の形成を試みており、Myna はNarwhalを介して CommonJS を実験的にサポートしています。
これはパフォーマンスの点でどのように機能しますか?
生の計算速度では、C# や Java のような静的に型付けされたコンパイル済み言語に匹敵する動的言語はほとんどありません。そうは言っても、それは本当に問題ではありません。計算量の多いアプリケーションの部分は、おそらく Java で作成するか、既存の Java ライブラリを使用する必要があります。たとえば、JS でデータベースを作成することはお勧めしません。現実世界の Web アプリケーション/SOA サービスの場合、スローダウンの主な原因は生の計算速度ではなく、非効率的なコード、特にデータベース アクセスです。Myna は、次のようなことを行うことでこれを支援します。
- コンパイルされた JS スクリプトを内部的にキャッシュする
- データベース トランザクション用にキャッシュされたプリペアド ステートメントを内部的に使用する
- クエリと出力フラグメントのキャッシュ
- データベース接続プーリング
- 自動 ETag ハッシュのサポート
- プロファイリング ツール
- メタデータの遅延読み込み
データベーストランザクションをどれだけうまく実装および維持できますか? サーバーサイドJSでそれを行うことはできますか..?
「リバースまたはコミットできる SQL ステートメントのセット」のようなトランザクションを意味する場合、Myna はまだトランザクションをサポートしていません。十分な関心があれば、これを実装することにオープンです。
「サーバーサイド JS にはどのようなデータベース サポートがありますか?」という意味であれば、答えはプラットフォームに依存します。Myna プラットフォームは、次のデータベース機能を提供します。
- 「データソース」、つまりデータベース接続情報を定義できる Web ベースの管理アプリケーション。その後、これらのデータソースを名前でクエリできます。Myna には、H2、MySQL、Microsoft SQL Server、および Postgresql 用の JDBC ドライバーが含まれていますが、任意の JDBC または ODBC データソースを使用できます
- Myna.DatabaseとMyna.Tableは、データベースに依存しないメタデータ アクセスと、テーブルの作成と変更を提供します。
- Myna のQueryオブジェクトは、maxRows、ページング、SQL パラメーター、カスタム行ハンドラー、query-of-query、キャッシングなどをサポートします
- Myna のDataManagerオブジェクトは、ランタイム ORM オブジェクトの作成をサポートします
サーバーサイド JS で RESTFul および SOAP サービスを開発することは可能ですか??
REST と SOAP のサポートは、プラットフォーム固有の機能です。Myna のWebServiceオブジェクトは、次のプロトコルをサポートしています。
- 石鹸
- XML-RPC
- JSON-RPC
- 外部ダイレクト
- JSON-MYNA (通常の形式のポストを使用し、JSON を返す単純なプロトコル。ブラウザーから簡単に使用できます)
Myna は PUT および DELETE リクエスト メソッドも理解しており、リクエスト ボディ コンテンツへのアクセスをテキスト形式とバイナリ形式の両方で提供するため、これらの RESTful メソッドをアプリケーション固有の方法で処理できます。
デバッグ
従来のブレークポイントのデバッグは、サーバー側で非常に困難です。Rhino はデバッガー フックをサポートしていますが、ステートレスな Web アプリからこれらを使用するのはかなり複雑です。個人的には、ブレークポイント デバッガーが利用可能であっても使用しません (例: firebug)。代わりに、ロギングを好みます。
ミナでは、
Myna.log(type,label,detail)
優先度の低いスレッドを生成して、HTML ログ メッセージを Myna のログ データベースに書き込みます。これらのログは、Myna 管理者を通じて検索できます。ログには、プロファイリングの目的で、タイムスタンプと経過ミリ秒も記録されます。Myna.dump(obj) は、任意のオブジェクトの HTML テーブル表現を表示するためにも使用できます。Myna は、スタック トレース、ソース コード コンテキスト、および要求の詳細と共に、すべての未処理の例外もログに記録します。dump()、log()、およびデフォルトのエラー ハンドラーの間で、Myna コードのデバッグにそれほど問題はありません。