파일 및 폴더에 대한 Node.js 프로젝트 명명 규칙


116

대규모 Node.js 프로젝트의 파일 및 폴더에 대한 이름 지정 규칙은 무엇입니까?

대문자, camelCase 또는 밑줄을 사용해야합니까?

즉. 이것이 유효한 것으로 간주됩니까?

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에서 내가하는 일이기 때문에 camelCase를 좋아한다
Chad

@Chad-Node.js require에서 디렉토리 문자열을 매개 변수로 사용하므로 전적으로 자신 의 것이 아닙니다 . 즉. require('../app/controllers/someThings');
Rudiger 2013 년

3
Node는 유효한 파일 / 디렉토리 이름이고 핵심 모듈 이름 을 재정의하지 않는 한 모듈 이름 지정에 대한 제안이나 표준을 지정하지 않습니다 . 자체 모듈의 경우 약어 ( fs), 단일 단어 ( events), 밑줄 ( child_process) 및 소문자 ( querystring)를 혼합하여 사용합니다 .
Jonathan Lonowski

1
@Rudiger 그래서? 원하는 문자열과 원하는 디렉토리 구조를 지정할 수 있습니다 (물론 이름이 유효한 파일 이름 인 경우).
Chad

captain-awesome-file.js와 같은 모카 파일 이름과 같은 더 많은 핵심 프로젝트를 살펴보면 알 수 있듯이 충분히 일반적인 것 같습니다. 그게 제가 적어도 사용할 것입니다!
Charles Ferentchak 2014 년

답변:


154

노드와 함께 몇 년 후 , 디렉토리 / 파일 구조에 대한 규칙 이 없다고 말할 수 있습니다 . 그러나 대부분의 (전문) 익스프레스 애플리케이션은 다음과 같은 설정을 사용합니다.

/
  /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

제 생각에 후자는 유닉스 스타일의 디렉토리 구조와 더 잘 어울립니다 (전자는 이것을 약간 혼합합니다).

나는 또한 파일을 분리하는이 패턴을 좋아합니다.

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와 싸우는 데 정말 좋은 솔루션입니다. 이 설정을 사용 하는 실제 예제가 근처에 있습니다 .

업데이트 (파일 이름) :

가장 일반적인에 관한 파일 이름은 짧은 , 소문자 파일 이름. 파일을 두 단어로만 설명 할 수있는 경우 대부분의 JavaScript 프로젝트는 구분 기호로 밑줄을 사용합니다.

업데이트 (변수) :

변수와 관련하여 파일 이름과 동일한 "규칙"이 적용됩니다. 그러나 프로토 타입이나 클래스는 camelCase 를 사용해야 합니다 .

업데이트 (스타일 가이드) :


27
당신의 대답은 얼마나 흥미롭고 잘 되었는가, 그것은 주제에서 벗어 났고, 주제 작성자는 특별히 디렉토리 구조가 아닌 명명 규칙을 요구했습니다. 이 주제에 도달하면 파일 이름이 대시, 밑줄 또는 camelCase로 더 나은지 알 수 있습니다. 이것이이 답변에 추가되면 나는 찬성 할 것입니다.
Tronix117 2014-08-04

3
@ Tronix117 문제는 무엇입니까? 질문은 "파일 및 폴더에 대한 프로젝트 명명 규칙"을 묻습니다. 전체 경로 이름도 포함하므로 이름 지정은 파일 이름으로 제한되지 않습니다.
bodokaiser

24
물론 저자는 "대문자, camelCase 또는 밑줄?"이라고 구체적으로 묻습니다. 그는 자신의 예를 쓸 때 'someThings'와 'some-things'를 명시 적으로 넣어 타당한 것으로 간주 될 수 있는지를 알 수 있습니다. 이 주제로 이동했을 때이 특정 질문에 대한 답을 얻고 일반적으로 파일 이름 지정으로 사용되는 것이 무엇인지 알기를 기대했습니다. 나는 당신의 대답이 틀렸다고 말하지 않습니다. 그것은 목적에 완벽하지만 그가 실제로 주요 질문에 대답하지 않기 때문에 제 마음에는 불완전합니다.
Tronix117 2014-08-05

5
나는 당신이 나를 오해했다고 생각합니다;). 나는 받아 들여진 대답에서 찾을 수없는 것을 찾고 있었지만, 어떤 종류의 증오도 퍼 뜨리지 않고 구체적으로 요청 받았습니다. 나는 단지 당신이 그것에 대한 몇 가지 정보를 대답에 추가하기를 원했기 때문에 미래에 그것을 찾는 사람들이 막 다른 길에 빠지지 않을 것입니다.
Tronix117

3
@ Tronix117 사실, 이것이 내가이 페이지 에서이 답변을 읽은 이유입니다. 나는 디렉토리 구조뿐만 아니라 더 중요한 이름 규칙 (대시, 밑줄, camelCase, TitleCase 등)을 원했습니다. 불행히도, 대답은 여전히 ​​그것을 포함하지 않으며, bodokaiser내가 뛰어 들어서 이것에 대한 그의 의견을 그의 대답에 추가하도록 요청하기에는 너무 개인적으로 취하는 것 같습니다 (OP가 처음에 질문에서 물었을 때) ( 기침 기침 ).
Swivel

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로 간단한 자동화를 수행 할 수 있습니다.-항상 수행하십시오 🙃
rob2d

63

규칙이 없습니다. 논리적 구조가 있습니다.

내가 말할 수있는 단 한가지 : camelCase 파일과 디렉토리 이름을 사용하지 마십시오. 왜? 작동하지만 Mac과 Windows에서는 someAction과 일부 작업간에 차이가 없습니다. 나는이 문제를 한 번도 만난 것이 아닙니다. 다음과 같은 파일이 필요합니다.

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

하지만 슬프게도 소문자로 가득 찬 파일을 만들었습니다 : lib/ishidden.js. Mac에서 저에게 효과적이었습니다. 내 동료의 Mac에서 잘 작동했습니다. 테스트는 오류없이 실행됩니다. 배포 후 큰 오류가 발생했습니다.

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

오 예. 리눅스 박스입니다. 따라서 camelCase 디렉토리 구조는 위험 할 수 있습니다. Windows 또는 Mac에서 개발중인 동료에게는 충분합니다.

따라서 필요한 경우 밑줄 (_) 또는 대시 (-) 구분 기호를 사용하십시오.


4
+1, 비 cs 시스템에서 git에서 대소 문자 구분 폴더의 이름을 바꾸는 것이 정말 번거 롭다는 사실을 추가하십시오.
최대

4
여기 camelCase의 문제를 정말로 이해하지 못합니다. 처음에 파일 이름을 올바르게 지정하면 문제가 해결되지 않습니까 (lib / isHidden.js)?
Mike

Mike, 요점은 camelCase가 일부 시스템에서 배포가 중단된다는 것입니다. Mac에서 "groupPages"라는 패키지를 사용하여 Linux 상자에 배포했을 때 내 디렉토리가 모두 404를받는 이유에 대해 혼란 스러웠습니다. 문제를 해결하기 위해 그룹 페이지로 변경해야했습니다.
tempranova 2015

3
더 나쁜 것은 파일 이름의 낙타 버전을 만들고 부주의 한 동료가 같은 디렉토리에 소문자 버전을 만들도록하는 것입니다. 이제 대소 문자를 구분하지 않는 OS에서 확인하고 응용 프로그램이 작동하지 않는 이유를 알아 내십시오. 그리고 네, 이런 일이 일어났습니다.
L0LN1NJ4

나는이 대답을 좋아하지만 대시 (-)에도 몇 가지 문제가있을 수 있음을 지적하고 싶습니다. 예를 들어 Nighwatch 테스트 프레임 워크를 사용하여 admin-login.js라는 페이지 개체를 만들었습니다. 그런 다음을 사용하여 테스트 스크립트에서 액세스하려고했습니다 const loginPage = browser.page.admin-login(). 오류가 발생했습니다 ReferenceError: login is not defined. 파일 이름에 밑줄 (_)을 사용하면 문제가 해결되었습니다. 또한 명령 줄에서 대시 문자가있는 파일 이름을 사용하면 몇 가지 문제가 발생할 수 있다고 상상할 수 있습니다. 따라서 밑줄은 일반적으로 파일 이름에 대해 가장 안전한 구분 기호입니다.
Dragan Nikolic

15

' Google JavaScript 스타일 가이드 '를 기반으로 함

파일 이름은 모두 소문자 여야하며 밑줄 (_) 또는 대시 (-)를 포함 할 수 있지만 추가 구두점은 없습니다. 프로젝트에서 사용하는 규칙을 따르십시오. 파일 이름의 확장자는 .js 여야합니다.


3

대부분의 사람들 camelCase은 JS에서 사용 합니다. 오픈 소스를 원한다면 이것을 사용하는 것이 좋습니다 :-)


Locomotive.js와 같은 일부 프로젝트 camelCase는 컨트롤러 파일에 사용됩니다. :-) 그냥 다릅니다. 나는 PascalCase클래스와 같은 파일 에 사용하는 경향이 있습니다.
Mathieu Amiot 2014 년

@yitsushi는 낙타 (및 파스칼) 케이스 이름 지정에 대해 상당한 우려를 제기하는 것 같습니다.
gumaflux

0

Node.js는 파일 이름 지정 규칙을 적용하지 않습니다 (제외 index.js). 그리고 일반적으로 자바 스크립트 언어도 마찬가지입니다. 여기에서 camelCase, 하이픈 및 밑줄을 제안하는 수십 개의 스레드를 찾을 수 있으며 이들 중 어느 것이 든 완벽하게 작동합니다. 그래서 그것은 당신에게 달려 있습니다. 하나를 선택하고 고수하십시오.


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.