좋아, 그것은 오랜 시간이 지났고 이것은 인기있는 질문입니다. 그래서 JavaScript 코드와 중간 크기의 express.js 응용 프로그램을 구성하는 방법에 대한 긴 README가있는 스캐 폴딩 github 저장소를 만들었습니다.
focusaurus / express_code_structure 는 최신 코드가 포함 된 저장소입니다. 풀 요청을 환영합니다.
다음은 README의 스냅 샷입니다. 스택 오버플로는 링크 응답 만 좋아하지 않습니다. 나는 이것이 계속 업데이트 할 새로운 프로젝트이므로 업데이트 할 것이지만 궁극적으로 github repo 가이 정보의 최신 장소가 될 것입니다.
익스프레스 코드 구조
이 프로젝트는 중간 크기의 express.js 웹 애플리케이션을 구성하는 방법의 예입니다.
현재 2016 년 12 월 v4.14 이상 표현
응용 프로그램이 얼마나 큽니까?
웹 응용 프로그램이 모두 동일하지는 않으며 모든 express.js 응용 프로그램에 적용해야 할 단일 코드 구조는 없습니다.
응용 프로그램이 작은 경우 여기에 설명 된 것과 같은 깊은 디렉토리 구조가 필요하지 않습니다. 간단하게 유지하고 .js
리포지토리의 루트에 소수의 파일을 집어 넣으면 완료됩니다. Voilà.
응용 프로그램이 크면 언젠가는 별도의 npm 패키지로 분리해야합니다. 일반적으로 node.js 접근 방식은 최소한 라이브러리에는 많은 작은 패키지를 선호하는 것으로 보이며 오버 헤드를 이해하고 이해하기 시작하는 여러 npm 패키지를 사용하여 응용 프로그램을 빌드해야합니다. 따라서 응용 프로그램이 커지고 코드의 일부가 응용 프로그램 외부에서 명확하게 재사용 가능하거나 명확한 하위 시스템이됨에 따라 자체 자식 저장소로 이동하여 독립형 npm 패키지로 만듭니다.
따라서이 프로젝트의 초점은 중형 응용 프로그램의 실행 가능한 구조를 설명하는 것입니다.
전반적인 아키텍처는 무엇입니까
웹 애플리케이션을 구축하는 방법에는 여러 가지가 있습니다.
- 서버 측 MVC a la Ruby on Rails
- 단일 페이지 응용 프로그램 스타일 및 MongoDB / Express / Angular / Node (MEAN)
- 일부 형태의 기본 웹 사이트
- la MVC이 (가) 죽은 모델 / 작업 / 뷰 / 이벤트 스타일, 이제 움직일 시간입니다
- 그리고 다른 많은 사람들은 현재와 역사적인
이들 각각은 다른 디렉토리 구조에 잘 맞습니다. 이 예제의 목적 상, 그것은 비계 일 뿐이며 완전히 작동하는 앱은 아니지만 다음과 같은 주요 아키텍처 포인트를 가정합니다.
- 이 사이트에는 전통적인 정적 페이지 / 템플릿이 있습니다
- 사이트의 "응용 프로그램"부분은 단일 페이지 응용 프로그램 스타일로 개발되었습니다.
- 애플리케이션은 REST / JSON 스타일 API를 브라우저에 노출합니다.
- 이 앱은 간단한 비즈니스 도메인을 모델링합니다.이 경우 자동차 대리점 애플리케이션입니다.
그리고 Ruby on Rails는 어떻습니까?
이 프로젝트 전체에 걸쳐 주제가 될 것입니다. Ruby on Rails에서 구현 된 많은 아이디어와 그들이 채택한 "컨벤션 오버 컨벤션"결정은 실제로 널리 사용되지는 않았지만 실제로는 그다지 도움이되지 않으며 때로는이 리포지토리와 반대입니다. 추천합니다.
필자의 주요 요점은 코드 구성에 기본 원칙이 있으며, 이러한 원칙을 기반으로 Ruby on Rails 규칙은 Ruby on Rails 커뮤니티에 적합하다는 것입니다. 그러나 이러한 관습을 신중하게 숙지하는 것은 요점을 놓치게됩니다. 기본 원칙을 고수하면 셸 스크립트, 게임, 모바일 앱, 엔터프라이즈 프로젝트, 홈 디렉토리까지 모든 프로젝트가 잘 구성되고 명확 해집니다.
Rails 커뮤니티의 경우 단일 Rails 개발자가 앱에서 앱으로 전환하고 매번 익숙하고 편안하게 사용할 수 있기를 원합니다. 37 개의 신호 또는 Pivotal Labs에 적합하며 이점이 있습니다. 서버 측 JavaScript 세계에서 전반적인 정신은 훨씬 더 서구 적이며 실제로 문제가 없습니다. 그것이 우리가 굴리는 방식입니다. 우리는 그것에 익숙합니다. express.js에서도 Rails가 아닌 Sinatra와 밀접한 관계가 있으며 Rails에서 컨벤션을 취하는 것은 일반적으로 도움이되지 않습니다. 컨벤션에 대한 컨벤션에 대한 원칙 조차 말하고 싶습니다 .
기본 원칙과 동기
앱 심볼릭 트릭
Node.js에 대한 더 나은 local require () 경로 에서 커뮤니티가 길게 설명하고 논의한 많은 접근 방식이 있습니다 . 나는 곧 "많은 ../../../ .. 다루기"를 원하거나 requireFrom 모듈을 사용하기로 결정할 수도있다. 그러나 현재는 아래에 설명 된 symlink 트릭을 사용하고 있습니다.
따라서 프로젝트 내에서 요구하는 성가신 상대 경로를 피하는 한 가지 방법 require("../../../config")
은 다음 트릭을 사용하는 것입니다.
- 앱의 node_modules 아래에 심볼릭 링크를 만듭니다
- cd node_modules && ln -nsf ../app
- git에 전체 node_modules 폴더가 아닌
node_modules / app symlink 자체를 추가하십시오.
- 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 사용자는 상위 디렉토리 상대 경로를 사용해야합니다.
구성
일반적으로 기본 JavaScript options
객체 만 전달 되도록 모듈 및 클래스를 코딩하십시오. 모듈 만 app/server.js
로드해야 app/config.js
합니다. 거기에서 options
필요에 따라 작은 오브젝트를 합성 하여 서브 시스템을 구성 할 수 있지만, 모든 서브 시스템을 추가 정보로 가득 찬 큰 전역 구성 모듈에 결합하는 것은 나쁜 결합입니다.
연결 매개 변수를 전달하고 서브 시스템이 나가는 연결을 작성하는 것과 달리 DB 연결 작성을 중앙 집중화하여 서브 시스템으로 전달하십시오.
NODE_ENV
이것은 Rails에서 가져온 또 다른 유혹이지만 끔찍한 아이디어입니다. 앱에 정확히 1 개의 위치가 있어야하며 app/config.js
, NODE_ENV
환경 변수 를 살펴 봅니다 . 그 밖의 모든 것에는 클래스 생성자 인수 또는 모듈 구성 매개 변수로 명시적인 옵션을 사용해야합니다.
이메일 모듈에 이메일 전달 방법 (SMTP, stdout에 로그, 대기열에 넣는 방법 등)에 대한 옵션이있는 경우에는 옵션을 선택 {deliver: 'stdout'}
해야하지만 반드시 확인해서는 안됩니다 NODE_ENV
.
테스트
이제 테스트 파일을 해당 코드와 동일한 디렉토리에 유지하고 파일 이름 확장명 명명 규칙을 사용하여 테스트와 프로덕션 코드를 구분합니다.
foo.js
"foo"모듈 코드가 있습니다
foo.tape.js
foo에 대한 노드 기반 테스트가 있으며 동일한 디렉토리에 있습니다.
foo.btape.js
브라우저 환경에서 실행해야하는 테스트에 사용할 수 있습니다.
파일 시스템 글로브와 find . -name '*.tape.js'
명령을 사용하여 필요에 따라 모든 테스트에 액세스합니다.
각 .js
모듈 파일 내에서 코드를 구성하는 방법
이 프로젝트의 범위는 주로 파일과 디렉토리의 위치에 관한 것이며 다른 범위를 추가하고 싶지는 않지만 코드를 3 개의 개별 섹션으로 구성한다고 언급합니다.
- CommonJS의 시작 블록은 상태 종속성에 대한 호출이 필요합니다.
- 순수 자바 스크립트의 메인 코드 블록. 여기에 CommonJS 오염이 없습니다. 내보내기, 모듈 또는 필요를 참조하지 마십시오.
- 내보내기를 설정하기위한 CommonJS의 닫기 블록