さて、久しぶりですが、これはよくある質問なので、先に進んで、中規模のexpress.jsアプリケーションをどのように構築するかについて、JavaScriptコードと長いREADMEを使用して足場githubリポジトリを作成しました。
focusaurus / express_code_structureは、このための最新のコードを含むリポジトリです。プルリクエストは大歓迎です。
stackoverflowはリンクのみの回答を好まないため、ここにREADMEのスナップショットを示します。これは今後も更新する新しいプロジェクトであるため、更新を行いますが、最終的にはgithubリポジトリがこの情報の最新の場所になります。
エクスプレスコード構造
このプロジェクトは、中規模のexpress.js Webアプリケーションを編成する方法の例です。
2016年12月にv4.14を少なくとも表す最新版
アプリケーションの大きさはどれくらいですか?
Webアプリケーションはすべて同じではなく、私の意見では、すべてのexpress.jsアプリケーションに適用する必要のある単一のコード構造はありません。
アプリケーションが小さい場合は、ここで例示するような深いディレクトリ構造は必要ありません。単純.js
にして、リポジトリのルートに少数のファイルを貼り付ければ完了です。ボイラ。
アプリケーションが巨大な場合、ある時点でそれを個別のnpmパッケージに分割する必要があります。一般に、node.jsアプローチは、少なくともライブラリに対しては、多くの小さなパッケージを優先するようであり、いくつかのnpmパッケージを使用してアプリケーションを構築する必要があります。そのため、アプリケーションが大きくなり、コードの一部がアプリケーションの外で明らかに再利用可能になった場合、または明確なサブシステムになった場合は、それを独自のgitリポジトリに移動し、スタンドアロンのnpmパッケージにします。
したがって、このプロジェクトの焦点は、中規模アプリケーションの実行可能な構造を示すことです。
全体的なアーキテクチャは何ですか
Webアプリケーションを構築するには、次のような多くのアプローチがあります。
- Ruby on Railsのサーバー側MVC
- MongoDB / Express / Angular / Node(MEAN)の単一ページアプリケーションスタイル
- いくつかのフォームがある基本的なWebサイト
- MVCのモデル/操作/ビュー/イベントスタイルが無効になっているため、MOVEを開始します
- そして現在および歴史的な他の多くの
これらはそれぞれ、異なるディレクトリ構造にうまく適合します。この例では、これは足場にすぎず、完全に機能するアプリではありませんが、以下の主要なアーキテクチャポイントを想定しています。
- サイトには、いくつかの従来の静的ページ/テンプレートがあります
- サイトの「アプリケーション」部分は、単一ページアプリケーションスタイルとして開発されています。
- アプリケーションがREST / JSONスタイルのAPIをブラウザーに公開する
- アプリは単純なビジネスドメインをモデル化します。この場合は、自動車販売店アプリケーションです。
そしてRuby on Railsはどうですか?
Ruby on Railsで具体化されたアイデアの多くと、彼らが採用した「Convention over Configuration」の決定は広く受け入れられ使用されていますが、実際にはあまり役に立たず、このリポジトリとは正反対である場合があります。お勧めします。
ここでの私の主なポイントは、コードを編成するための基本的な原則があり、それらの原則に基づいて、Ruby on Railsの規則はRuby on Railsコミュニティにとって(主に)意味があるということです。しかし、それらの慣習を不注意に苦しめるだけでは要点を逃します。基本原則を理解すれば、すべてのプロジェクトがよく整理され、明確になります。シェルスクリプト、ゲーム、モバイルアプリ、エンタープライズプロジェクト、さらにはホームディレクトリまでです。
Railsコミュニティの場合、Rails開発者が1人でアプリを切り替えられるようにし、毎回それに慣れ親しんでいる必要があります。これは、37の信号またはPivotal Labsである場合に非常に意味があり、利点があります。サーバー側のJavaScriptの世界では、全体的な精神は、何が起こってもまったくよりワイルドウエストであり、実際には問題はありません。それが私たちが転がる方法です。私たちはそれに慣れています。express.js内でも、これはRailsではなくSinatraの近縁であり、Railsから規則を採用しても通常は何の助けにもなりません。設定よりも規約に関する原則も言います。
根本的な原則と動機
アプリのsymlinkトリック
Node.jsの優れたローカルローカルrequire()パスには、コミュニティによって概要が説明され、議論されている多くのアプローチがあります。私はすぐに「たくさんの../../../ ..を扱う」か、requireFromモジュールを使用することを好むかもしれません。ただし、現時点では、以下に説明するシンボリックリンクトリックを使用しています。
したがって、プロジェクト内を回避するための1つの方法require("../../../config")
は、次のようなトリックを使用することです。
- アプリのnode_modulesの下にシンボリックリンクを作成します
- cd node_modules && ln -nsf ../app
- 追加アプリ自体をシンボリックリンク/ちょうどnode_modulesを、全体ではなくnode_modulesはgitのには、フォルダ
- git add -f node_modules / app
- はい、
.gitignore
ファイルに「node_modules」がまだあるはずです
- いいえ、「node_modules」をgitリポジトリに配置しないでください。一部の人々はこれを行うことをお勧めします。それらは正しくありません。
- これで、このプレフィックスを使用してプロジェクト内モジュールを要求できます
var config = require("app/config");
var DealModel = require("app/deals/deal-model")
;
- 基本的に、これにより、プロジェクト内で外部npmモジュールの場合と同様に作業が必要になります。
- 申し訳ありませんが、Windowsユーザーは親ディレクトリの相対パスを使用する必要があります。
構成
通常、モジュールとクラスは、options
渡される基本的なJavaScript オブジェクトのみを想定するようにコーディングします。モジュールのみapp/server.js
をロードする必要がありapp/config.js
ます。そこから小さなoptions
オブジェクトを合成して必要に応じてサブシステムを構成できますが、すべてのサブシステムを追加情報でいっぱいの大きなグローバル構成モジュールに結合するのは不適切な結合です。
接続パラメータを渡してサブシステム自体に発信接続を行わせるのではなく、DB接続の作成を一元化してサブシステムに渡そうとします。
NODE_ENV
これは、Railsから引き継がれたもう1つの魅力的ですが恐ろしいアイデアです。アプリにapp/config.js
は、NODE_ENV
環境変数を調べる場所が1つだけあるはずです。その他はすべて、クラスコンストラクターの引数またはモジュール構成パラメーターとして明示的なオプションを取る必要があります。
電子メールモジュールに電子メールの配信方法に関するオプション(SMTP、標準出力へのログ、キューに入れるなど)がある場合、次のようなオプションを使用する必要があります{deliver: 'stdout'}
が、絶対にチェックしないでくださいNODE_ENV
。
テスト
テストファイルを対応するコードと同じディレクトリに保存し、ファイル名拡張子の命名規則を使用してテストと製品コードを区別しています。
foo.js
モジュール「foo」のコードがあります
foo.tape.js
fooのノードベースのテストがあり、同じディレクトリにあります
foo.btape.js
ブラウザ環境で実行する必要があるテストに使用できます
find . -name '*.tape.js'
必要に応じて、ファイルシステムグロブとコマンドを使用して、すべてのテストにアクセスします。
各.js
モジュールファイル内のコードを整理する方法
このプロジェクトのスコープは主にファイルとディレクトリがどこにあるかに関するものであり、他のスコープをあまり追加したくありませんが、コードを3つの異なるセクションに編成することだけを述べます。
- CommonJSのオープニングブロックには、状態の依存関係への呼び出しが必要です
- pure-JavaScriptのメインコードブロック。ここにはCommonJS汚染はありません。exports、module、またはrequireを参照しないでください。
- CommonJSのブロックを閉じてエクスポートをセットアップする