ファイルとフォルダーのNode.jsプロジェクトの命名規則


115

大規模なNode.jsプロジェクト内のファイルとフォルダーの命名規則は何ですか?

大文字にするか、キャメルケースにするか、アンダースコアにするか?

つまり。これは有効と見なされますか?

project-name
    app
        controllers
            someThings.js
            users.js
        models
                someThing.js
                user.js
        views
            some-things
                index.jade
            users
                logIn.jade
                signUp.jade
    ...

3
非常に主観的な、あなたのディレクトリ構造はあなた自身のものです。個人的には、私がキャメルケースを好むのは、JSでそれを行うからです
チャド

@Chad-Node.jsではrequire、ディレクトリ文字列をパラメーターとして受け取ります。これが完全に独自のものではない理由です。すなわち。require('../app/controllers/someThings');
Rudiger

3
それらが有効なファイル/ディレクトリ名であり、コアモジュール名を上書きしようとしない限り、Nodeはモジュールの命名に関する提案や標準を指定しません。独自のモジュールの場合は、省略形(fs)、単一単語(events)、下線付き(child_process)、小文字(querystring)の混合を使用します。
Jonathan Lonowski 2013

1
@ルディガーそう?任意の文字列と、必要なディレクトリ構造を指定できます(もちろん、名前が有効なファイル名であれば)。
チャド

captain-awesome-file.jsのようなmochaファイル名のようなより重要なプロジェクトをざっと見回すことからわかることから、十分に一般的であるようです。それは私が少なくとも使用するものです!
Charles Ferentchak 2014年

回答:


153

nodeを使って数年が経ちましたが、ディレクトリ/ファイル構造には慣例がないと言えます。ただし、ほとんどの(プロフェッショナル)Expressアプリケーションは次のような設定を使用します。

/
  /bin - scripts, helpers, binaries
  /lib - your application
  /config - your configuration
  /public - your public files
  /test - your tests

この設定を使用する例はnodejs-starterです。

私はこの設定を個人的に次のように変更しました:

/
  /etc - contains configuration
  /app - front-end javascript files
    /config - loads config
    /models - loads models
  /bin - helper scripts
  /lib - back-end express files
    /config - loads config to app.settings
    /models - loads mongoose models
    /routes - sets up app.get('..')...
  /srv - contains public files
  /usr - contains templates
  /test - contains test files

私の意見では、後者はUnixスタイルのディレクトリ構造とよく一致します(一方、前者はこれを少し混ぜます)。

また、ファイルを分離するためにこのパターンが好きです。

lib / index.js

var http = require('http');
var express = require('express');

var app = express();

app.server = http.createServer(app);

require('./config')(app);

require('./models')(app);

require('./routes')(app);

app.server.listen(app.settings.port);

module.exports = app;

lib / static / index.js

var express = require('express');

module.exports = function(app) {

  app.use(express.static(app.settings.static.path));

};

これにより、依存関係を気にすることなく、すべてのソースコードをきれいに分離できます。厄介なJavascriptと戦うための本当に良い解決策です。この設定を使用する実際の例が近くにあります。

更新(ファイル名):

最も一般についてのファイル名は短く小文字のファイル名。ファイルを2語でしか記述できない場合、ほとんどのJavaScriptプロジェクトでは、区切り文字としてアンダースコアを使用します。

更新(変数):

変数に関しては、ファイル名と同じ「ルール」が適用されます。ただし、プロトタイプまたはクラスはcamelCaseを使用する必要があります。

更新(スタイルガイド):


26
あなたの答えはどれほど興味深く、よくできていますか?それはトピックではありません。トピックの作成者は、ディレクトリ構造ではなく命名規則を具体的に求めました。このトピックに到達すると、ダッシュ、アンダースコア、またはキャメルケースを使用してファイルの名前を付ける方が適切かどうかがわかります。これがこの回答に追加された場合、私は賛成票を投じます。
Tronix117 2014

3
@ Tronix117問題は何ですか?「ファイルとフォルダのプロジェクト命名規則」を尋ねる質問です。また、完全なパス名も含まれるため、名前はファイル名に限定されません。
bodokaiser 2014

23
もちろん、作者は特に「大文字にするか、キャメルケースにするか、アンダースコアにするか」と質問します。彼は自分の例を書くときに、「someThings」と「some-things」を明示的に置いて、それが有効であると見なせるかどうかを確認しました。私がこのトピックに行ったとき、私はこの特定の質問への回答を得て、通常ファイルの命名として何が使用されているかを知ることを期待していました。私はあなたの答えが間違っているとは言いません、それはその目的にぴったりですが、彼は主な質問に本当に答えないので私の心の中で不完全です。
Tronix117 2014

5
あなたは私を誤解したと思います;)。私は、受け入れられた回答で見つからなかったものを探していましたが、特に尋ねられました。いかなる種類の憎悪も広がらず、あなたはこれについて少し遠くに行きます。私はあなたが答えにそれについていくつかの情報を追加してほしかったので、将来それを探す人々は行き止まりになりません。
Tronix117 2014

2
@ Tronix117実際、これが私がこのページでこの答えを読んでいることに特に気づいた理由です。私は、ディレクトリ構造だけでなく、より重要な命名規則(ダッシュ、アンダースコア、キャメルケース、タイトルケースなど)を望んでいました。残念ながら、答えはまだそれを含んでいない、それはそうですbodokaiser(OPは当初、彼らの質問に尋ねたように)私はにジャンプし、このについての彼の意見は彼の答えに追加することを要求するために、あまりにも個人的に物事を取っている( )。
2015

97

kebab-caseすべてのパッケージ、フォルダ、ファイル名に使用します。

どうして?

いずれかのフォルダまたはファイルがいつか独自のパッケージに抽出される可能性があることを想像する必要があります。パッケージに大文字を含めることはできません。

新しいパッケージの名前に大文字を含めることはできません。 https://docs.npmjs.com/files/package.json#name

したがって、camelCase使用しないでください。この葉snake_casekebab-case

kebab-case今日、これは最も一般的な慣例です。アンダースコアの唯一の使用は内部ノードパッケージであり、これは単に初期の頃からの慣習です。


2
あなたはドットを忘れましたか?socket.ioのように
Roee

1
.2cは、正規表現を使用して任意の言語の任意のスクリプトまたはアプリでkebab-caseからkebabCaseへの単純な自動化を実行できます-いつでも実行できますro
rob2d

63

規約はありません。いくつかの論理構造があります。

私が言える唯一のことは、キャメルケースのファイル名とディレクトリ名を使用しないことです。どうして?動作しますが、MacとWindowsではsomeActionとsome actionに違いはありません。私はこの問題に遭遇しました。次のようなファイルが必要です。

var isHidden = require('./lib/isHidden');

しかし、残念なことに、私は小文字でいっぱいのファイルを作成しましたlib/ishidden.js。Macで動作しました。私の同僚のMacでも問題なく動作しました。テストはエラーなしで実行されます。デプロイ後、大きなエラーが発生しました:

Error: Cannot find module './lib/isHidden'

そうそう。これはLinuxボックスです。したがって、キャメルケースのディレクトリ構造は危険な場合があります。WindowsまたはMacで開発している同僚には十分です。

したがって、必要に応じて、アンダースコア(_)またはダッシュ(-)の区切り文字を使用してください。


4
+1、非csシステムのgitで大文字と小文字を区別するフォルダーの名前を変更するのは本当に面倒であるという事実を追加します。
最大

4
camelCaseの問題はここではよくわかりません。最初にファイルに正しく名前を付けることで問題は解決しませんか(lib / isHidden.js)?
Mike

マイクさん、キャメルケースが一部のシステムへの展開を中断するというのがポイントです。「groupPages」という名前のパッケージを使用してMacからLinuxボックスにデプロイしたときに、ディレクトリがすべて404になる理由について混乱しました。私は物事を修正するためにグループページに変更しなければなりませんでした。
tempranova 2015

3
さらに悪いことに、ファイル名のキャメルケースバージョンを作成し、不注意な同僚に同じディレクトリに小文字バージョンを作成してもらいます。次に、大文字と小文字を区別しないosでチェックアウトし、アプリケーションが機能しない理由を理解してみます。そして、はい、これは起こりました。
L0LN1NJ4 2015年

私はこの答えが好きですが、ダッシュ(-)にも問題がある可能性があることを指摘しておきます。たとえば、Nighwatchテストフレームワークを使用して、admin-login.jsという名前のページオブジェクトを作成しました。次に、を使用してテストスクリプトからアクセスしようとしましたconst loginPage = browser.page.admin-login()。エラーがありますReferenceError: login is not defined。ファイル名にアンダースコア(_)を使用すると、問題が解決しました。コマンドラインでダッシュ文字を含むファイル名を使用すると、いくつかの問題が発生する可能性があることも想像できます。したがって、一般的にアンダースコアがファイル名の最も安全な区切り文字だと思います。
Dragan Nikolic

15

Google JavaScript Style Guide」に基づいています

ファイル名はすべて小文字でなければならず、アンダースコア(_)またはダッシュ(-)を含めることができますが、句読点を追加することはできません。プロジェクトが使用する規則に従います。ファイル名の拡張子は.jsでなければなりません。


3

ほとんどの人camelCaseはJSで使用します。何かをオープンソース化したいなら、これを使うことをお勧めします:-)


Locomotive.jsなどの一部のプロジェクトは、camelCaseコントローラーファイルに使用しています。:-)依存します。PascalCaseクラスのようなファイルを使用する傾向があります。
Mathieu Amiot 2014年

@yitsushiは、キャメル(およびパスカル)ケースの命名に関してかなりの懸念を抱いているようです。もしポータブルモジュールのキャメルケースを作成したい場合、確かに悪い考えのように思われますか?
gumaflux 2014

0

Node.jsは、ファイルの命名規則を適用しません(を除くindex.js)。また、JavaScript言語は一般的にもそうではありません。キャメルケース、ハイフン、アンダースコアを示唆する数十のスレッドをここで見つけることができます。だからあなた次第です。1つを選択し、それを使用してください。


1
実際には「強制」するノードではありません。これを読んでください:nodejs.org/api/modules.html#modules_folders_as_modules
moka

0

私によると:ファイルの場合、module.exportsがオブジェクトの場合はキャメルの小文字を使用します。つまり、シングルトンモジュールです。単一のトンであるので、これはJSONファイルにも当てはまります。module.exportsがクラスのように機能するコンストラクタ関数を返す場合は、キャメル大文字を使用します。

フォルダには短い名前を使用します。複数の単語が必要な場合は、「-」で区切って完全に小文字にし、すべてのプラットフォームで一貫して機能するようにします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.