Express、Koa、Meteor、Sails.js:黙示録の4つのフレームワーク
公開: 2022-03-11JavaScriptは、Webアプリケーションに対する膨大な需要により、近年間違いなく最も人気のある言語の1つになっています。 複数のブラウザー用にコーディングしている間、JavaScriptはフロントエンド開発者にとってほとんど唯一の選択肢です。 代わりにCoffeeScript、TypeScript、またはDartがあると主張する人もいるかもしれません。 ただし、真実は、CoffeeScriptは、最終的にJavaScriptに要約される構文糖衣としてほとんど見られているということです。 TypeScriptは、オプションの静的型付け、クラス、インターフェイスなど、いくつかのオブジェクト指向言語機能を含むJavaScriptのスーパーセットであり、まだ初期の段階です。 DartもCのような構文を持つオブジェクト指向言語ですが、それでも主流のブラウザー用にJavaScriptにコンパイルされます。
Node.jsの誕生と急速な成長により、JavaScriptはもはやフロントエンド開発に限定されなくなり、バックエンド開発はフロントエンドコーダーにとってロケット科学ではなくなりました。 人々はJavaScriptを、フロントエンド、Webサーバー、デスクトップアプリケーション、組み込みシステム、データベースなど、あらゆる状況に適合する特効薬と考える傾向があります。リストはどんどん長くなっています。 実際、JavaScriptの幅広いオーディエンスを考えると、Node.js + MongoDB + AngularJS / Reactは、かなりの数のフルスタックWeb開発者を生み出しました。 ただし、Node.jsは軽量になるように設計されており、Webアプリケーションの開発速度を上げるためのWebサーバーとしての基本的な機能のみを提供します。 npmパッケージとして利用できる使いやすいフレームワークの1つは、現実の世界ではより良いオプションです。
この投稿では、開発者が何度も何度も車輪の再発明を行う必要がないようにした、これらのよく知られた、実績のあるNode.jsフレームワークのいくつかについて説明します。 具体的には、この記事ではExpress、Koa、Meteor、Sails.jsについて説明します。 これらのフレームワークのそれぞれが互いにどのようにスタックするかを理解しようとする代わりに、これらのフレームワークのそれぞれが優れている主要な領域と、それらがさまざまなプロジェクトのニーズにどのように関連しているかを確認します。
Express:ミニマリストのWebフレームワーク
言うまでもなく、ExpressはNode.jsビジネスにとって最大の取引です。 すべてのNode.jsプレーヤーはそれを聞いており、気づいているかどうかに関係なく使用しています。 現在、第4世代であり、それに基づいて構築された、またはその概念に触発されたNode.jsフレームワークがかなりあります。
パフォーマンス
ほとんどの開発者はNode.jsの素早いスピードを高く評価しており、フレームワークの選択に関しては、完璧主義者はパフォーマンスの危険性を軽蔑する可能性があります。 Expressは、Node.jsの上に、基本的なルーティング、ミドルウェア、テンプレートエンジン、静的ファイルの提供などのWebアプリケーション機能を備えたシンレイヤーを提供するため、Node.jsの大幅なI/Oパフォーマンスが損なわれることはありません。
Expressは、最小限の意見のないフレームワークです。 MVC、MVP、MVVMなどの一般的なデザインパターンや、すぐに使用できるトレンドは適用されません。 シンプルさのファンにとって、これは他のすべてのフレームワークの中でも大きなプラスです。自分の好みでアプリケーションを構築でき、不必要な学習曲線がないからです。 これは、歴史的な負担のない新しい個人プロジェクトを作成する場合に特に有利ですが、プロジェクトまたは開発チームが成長するにつれて、標準化の欠如はプロジェクト/コード管理のための余分な作業につながる可能性があり、最悪のシナリオでは維持できなくなる可能性があります。
発生器
フレームワークには意見がありませんが、特定のプロジェクトフォルダー構造を生成するジェネレーターがあります。 express-generator npmパッケージをインストールし、generatorコマンドを使用してアプリケーションスケルトンを作成すると、画像、フロントエンドの静的JavaScript、スタイルシートファイル、およびHTMLテンプレートファイルを整理するのに役立つ明確な階層のアプリケーションフォルダーが作成されます。
npm install express-generator -g express helloapp
create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts
ミドルウェア
ミドルウェアは基本的に、要求オブジェクトと応答オブジェクトの両方に完全にアクセスできる単なる関数です。
名前が示すように、ミドルウェアは、実際のビジネスロジックまたは次のレベルのミドルウェアに制御を渡す前に、フィルタリング命令を適用します。 ユーザーのログインステータスの確認、ユーザー権限の検証、クロスサイト攻撃の防止などの一般的なタスクは、ミドルウェアとして最適に抽出されます。
var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);
Expressアプリケーションは本質的にNode.jsであり、独自のミドルウェアをカスタマイズする場合でも、フレームワークの組み込みミドルウェアを利用する場合でも、多くのミドルウェア機能を備えています。Expressは、プロセスを自然で直感的にしました。
テンプレートエンジン
テンプレートエンジンを使用すると、開発者はバックエンド変数をHTMLファイルに埋め込むことができ、要求されると、テンプレートファイルは、変数が実際の値で補間されたプレーンなHTML形式にレンダリングされます。 デフォルトでは、Express-GeneratorはPug(元々はJadeと呼ばれていました)テンプレートエンジンを使用しますが、MustacheやEJSなどの他のオプションもExpressでシームレスに機能します。
データベース統合
最小限のフレームワークとして、Expressはデータベース統合をパッケージ内の必須の側面とは見なしていないため、特定のデータベースの使用法はまったくありません。 MySQL、MongoDB、PostgreSQL、Redis、ElasticSearchなど、特定のデータストレージテクノロジーを採用している間は、特定のnpmパッケージをデータベースドライバーとしてインストールするだけです。 これらのサードパーティのデータベースドライバーは、CRUD命令を実行するときに統一された構文に準拠していないため、データベースの切り替えが非常に面倒でエラーが発生しやすくなります。
Koa:次世代のJavaScript機能を活用する
KoaはExpressの背後にあるチームによって開発されており、その目標は、コア内にミドルウェアをバンドルしないことで、ミニマリストのExpressを最小限に抑えることです。 ミドルウェアがないことを除けば、KoaはExpressに非常によく似ており、軽量で意見がありません。 ただし、Koaを本当に際立たせているのは、ES6ジェネレーター機能を使用してコールバックを完全に破棄する方法です。
エレガントな制御フロー
Javascriptは非同期プログラミング言語であり、言語自体のそのような本能とNode.jsのシングルスレッドイベント駆動型メカニズムにより、コールバックはいたるところにあり、悪名高いコールバック地獄です。
コールバックのネストをフラット化する1つの方法は、Async.jsを使用することです。 Async.jsは、複数の関数を互いに埋め込むことなくマッピング、並列化、シリアル化、または反復する手法を提供し、コールバック関数を使用して制御フローを渡します。1つのコールバックと1つのエラー処理関数で、グループ化された関数の大部分に十分です。 Async.jsメソッドによる。 それでも、Async.jsはコールバック全体を一掃することはできません。 Async.jsを使用してNode.jsコードを作成する場合、コードのインデントは、それほど深くはなく、右にドリフトする傾向があります。
もう1つのクリーンな方法は、その時点で可能なPromiseを使用することです。 評判の高いサードパーティのPromiseライブラリには、bluebirdとqがあります。 JavaScriptの最新版であるES6では、Promiseが標準化されています。 簡単に言うと、Promiseは、実装ブロック/関数を一連のPromiseの「then」関数に接続することにより、関数が順番に実行されて返されることを保証します。 次の「then」関数が実行されるように各実装ブロック/関数の最後で「解決」するか、制御フローがエラー処理に直接ジャンプするように次の実装を「拒否」します。 このようにして、すべてのエラー処理関数を1つの場所に集約し、コールバックを完全に取り除きます。

ES6は、ゲームチェンジャーをテーブルにもたらします—ES6ジェネレーター。 この概念はJavaScriptにとっては新しいものですが、プログラミングの世界ではまったく新しいものではありません。 ES6 Generatorは、Cでの中断のようなもので、コード行を上から下まで実行する代わりに、ES6 Generatorは、実行->停止して他の何かを実行->戻って残りを終了する手段を導入します。
KoaはES6ジェネレーターを利用してJavaScript非同期プログラミングに対処するための洗練された方法を提供しているため、純粋なKoaアプリケーションではコールバックを確認できません。 KoaでのES6Generatorの典型的なユースケースの1つは、ミドルウェアカスケードです。これにより、カスタマイズされたミドルウェアを、厄介なコールバックなしで次々に実行できます。
var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);
この最先端の手法がAsync.js、Promise、イベントエミッターなどの古いソリューションよりも優れていると主張する結論に飛びつくことはできませんが、この新しい概念に慣れるのに時間がかかることは確かです。 型破りな制御フローシーケンスでは、コードのデバッグがさらに困難になる可能性があります。
Meteor:Web、モバイル、デスクトップ向けのフレームワーク
MeteorはオールインワンのJavaScriptフレームワークです。 ExpressやKoaの簡素化の哲学とは異なり、サーバー、モバイル、デスクトップ、ウェブアプリをカバーするフルパッケージであるフルスタックフレームワークとして定義することで、さらに極端になります。
ワンフォーオールパッケージ
内部をよく見ると、Meteorが実際にはNode.js + Blaze / AngularJS / React + Cordova+MongoDBであることがわかります。 Node.jsとMongoDBは、それぞれサーバー側のビジネスロジックとデータストレージを担当します。 Blaze、AngularJS、またはReactのいずれかがフロントエンドUIを処理します。 また、Cordovaは、モバイルハイブリッドアプリの最も有名なHTMLソリューションとして、Webページをモバイルビューにブリッジします。
データ同期
バックエンドとフロントエンドがデータを共有するための主流のプロセスは次のとおりです。
- クライアントがデータまたは特定のHTMLビューを要求する
- サーバーはデータベースからデータを取得し、テンプレートエンジンを使用してデータをHTMLビューと混合し、フロントエンドに送り返します。
- クライアントは、ユーザーフレンドリーな方法でデータ/ビューをレンダリングおよび表示します
最新のシングルページWebアプリケーションは、上記のプロセスを少し調整します。 AngularJSを例にとると、HTMLテンプレートを静的ファイルとして、フロントエンドのJavaScriptファイル、スタイルシート、画像などの他のアセットと一緒に配置します。 次に、AngularJSは、Ajax RESTful APIを使用してバックエンドにデータを要求することにより、データをHTMLテンプレートに入力します。 いずれにせよ、バックエンド開発者は、フロントエンドからのデータ変更要求を処理し、データベースに変更を保存する責任があります。
Meteorを他のフレームワークと区別する機能の1つは、サーバーとフロントエンド/モバイルアプリ間のデータ同期メカニズムです。 Meteorでは、クライアントは、サーバーデータベースからのレプリケーションのごく一部であるミニデータベースシャドウコピーを保持します。この部分は、以前にクライアントによって要求され、サーバーによって承認されています。 クライアントがデータに変更を加えたい場合、サーバー側として一貫性のあるデータベースAPIを使用してCRUD命令を実行します。その後、データの変更はサーバーに自動的に送信され、実際のデータベースに保存されます。 サーバーは、データの変更を検出すると、更新されたデータを、それらのデータをサブスクライブしている特定のクライアントにプッシュします。 この双方向のデータ同期は、手動の介入なしに自動的に実行されます。 この魔法を生み出すために、MeteorはWebSocketを使用してクライアントとサーバーを内部で接続し、一方の端でのデータの変更がもう一方の端に即座に反映されるようにします。
ビルド自動化ツール
Meteorは、サーバーとWebアプリのアプリケーションを処理するだけでなく、HTML / JavaScript / CSSとネイティブモバイル機能をバンドルしたライブラリであるCordovaの助けを借りてIsobuildという名前のMeteorのビルドツールを使用して、iOSおよびAndroidアプリのビルドを簡単にします。 生成されたモバイルアプリは、JavaScriptを実行するか、WebView内にHTMLページを表示するハイブリッドアプリです。 この回避策は、ネイティブモバイルアプリと比較した場合、一部のユーザーエクスペリエンスを損なう可能性がありますが、多くの場合、Webアプリと同じコードベースですべてを管理できることは非常に大きなセールスポイントであり、開発コストを大幅に節約できます。
全体として、Meteorは高度に自動化されたフレームワークです。 この高レベルの自動化により、開発者の作業ははるかに楽になりますが、パフォーマンスとスケーラビリティの制限が危険にさらされるというコストが伴います。 ユーザーベースが拡大するにつれて、自動化されたデータ同期技術がスケーリングのチョークポイントになります。 Meteorは、他の手動で調整されたバックエンドテクノロジーと同じ容量とパフォーマンスを実現するために、通常、はるかに多くのサーバーハードウェアと帯域幅のリソースを消費します。 したがって、Meteorは、すべての主要なプラットフォームのプロジェクトのプロトタイプを作成する場合に最適な出発点であり、完璧なツールボックスになる可能性がありますが、プロトタイプが十分な本番プロジェクトになる場合は、最終的にシステムアーキテクチャをより専門的な方法で再設計する必要があります。クライアントベース。
Sails.js:Node.js用の優れたMVCフレームワーク
Sails.jsはExpressと多くの類似点を共有しています。 これは、プロジェクトジェネレーター、ミドルウェア、およびテンプレートエンジンです。 実際、Expressに加えて、開発をスピードアップするためのいくつかのより高いレベルの機能の上に構築されています。
MVC
Sails.jsは、コアからModel-View-Controllerデザインパターンを採用しています。 Ruby on RailsまたはLaravelから来ている人にとっては、Sails.jsアプリの構造があまりにも馴染み深いことに気付くでしょう。 モデルは、データベーステーブル/コレクションスキーマを反映するデータモデルを表します。ビューは、データが入力されたHTMLビューです。コントローラーは、すべてのサーバー側のビジネスロジックを配置し、データとビューの間の接着剤として機能します。
リアルタイムコミュニケーション
クライアントが毎回サーバーデータをクエリする必要があるHTTPリクエストや、サーバーをアイドリングモードにする長いポーリング接続とは異なり、Socket.ioはクライアントとサーバー間の双方向のイベントベースの通信を確立します。 Sails.jsはSocket.ioを統合し、それをより高い抽象化レベルのAPIでラップして、より便利なものにします。したがって、Sails.jsは、チャットアプリやマルチプレイヤーゲームの作成に特に適しています。
データベースORM
バックエンドロジックと実際のデータベース操作の間には、Waterlineと呼ばれる中間のORMレイヤーがあります。 簡単に言えば、このORMツールは、開発者がSQLとNoSQL、スキーマとスキーマレスなどのさまざまなデータベースクエリ言語について心配することなく、さまざまなデータベースにアクセスするための一貫した構文を提供します。
Sails.jsには中程度の自動化の学位があります。 サーバー側のロジックに重点を置いており、本番環境に対応しており、パフォーマンスや将来のスケーラビリティを犠牲にすることなく、Expressよりも開発ペースが速くなります。 特に、MVCパターンの愛好家が多い場合、Sails.jsの学習曲線は非常にスムーズです。
要約
この記事では、さまざまなNode.jsフレームワークをランク付けしているのではなく、Node.js開発者がプロジェクトをゼロから構築するときに最も適したツールボックスを選択できるように、群衆から目立つように各フレームワークの輝かしい点をリストしています。
では、Web開発用のお気に入りのNode.jsフレームワークはどれですか? 上で説明したもの以外のフレームワークが好きですか? 以下のコメントセクションでお知らせください。
- なぜ地獄はNode.jsを使用するのでしょうか? ケースバイケースのチュートリアル
- キャビンフィーバーコーディング:Node.jsバックエンドチュートリアル
- Node.js / TypeScript REST APIの構築、パート1:Express.js