2017-05-19 1 views
0

내가 내 질문을 이끌어내는 과정을 안내해 줄 때 나를 참아주십시오.자바 스크립트 클래스를 사용할 수 있습니까 노드 모듈?

나는 노드에서 CLI 응용 프로그램에서 일하고 있어요 그리고 난이 패턴을 사용하여 내 비즈니스 로직을 캡슐화하는 객체를 사용하고 있습니다 :

// my-project/lib/widget/myobject.js 

var MyObject = function(x) { 
    this.x = x; 
}; 

MyObject.prototype.getX = function() { 
    return this.x; 
}; 

module.exports = MyObject; 

나는 또한 이러한 개체 테스트 해요 :

// my-project/test/lib/widget/myobject.spec.js 

var MyObject = require('../../../lib/widget/myobject.js'); 

describe('MyObject', function() { 
    ... 
}); 

한순간에 내가 선택한 이름 지정 및 디렉토리 구조에 만족하지 않았습니다. 상대 경로를 다시 쓸 때 여러 사양 파일에서 해당 부모 디렉터리 참조 (..)를 지루하게 계산했습니다. 나는이 객체 정의를 포함하는 루트 디렉토리를 참조하는 더 쉬운 방법이 있어야한다고 생각했다.

here의 권장 사항 중 하나는 "응용 프로그램 관련 모듈을 node_modules에 넣는"것입니다.

이제 모듈을 이해하면 npm에서 다운로드하여 내 프로젝트에서 사용하는 패키지입니다. 이 라이브러리에는 require에 전화 할 때 내게 내보내는 단일 API로 유용한 라이브러리가 들어 있습니다. 이것은 내 응용 프로그램의 내부 사용을 위해 특별히 제작 된 단순한 단일 목적 클래스를 보는 방법이 아닙니다.

당신이 저와 지금까지 붙어 있다면, 고마워요! 내 질문은 다음과 같습니다.

내 응용 프로그램의 내부를 더 "모듈 식"으로 만들어 객체 지향적 인 상태에서 노드 모듈 시스템의 의도를 올바르게 따르도록하려면 어떻게합니까?

+0

객체로 작업 할 때 노드에서 일반적으로 자산 폴더에서 저장하고 가져옵니다. 많은 것은 환경 설정에서 제외 된 환경 설정, 빌드 도구 및 배치에 따라 다릅니다. node_modules 메소드 또는 정적 애셋을 가져올 수있는 애셋 폴더보다 많거나 적다면 잘 작동합니다 (하지만 npm 애셋을 직접 작성한 애셋과 혼합하는 것은 권장하지 않습니다). –

+0

맞아요, 정적 자산 폴더와 같지만 Node가 모듈을 찾는 기본 장소라는 추가적인 이점이 있습니다. 그것은 나를위한 무승부입니다. require ('../../../ lib/widget/myobject.js') 대신 require ('myobject')를 사용하고 싶습니다. 내 이해는 당신이 다음에 언급했던 것과 정확히 같습니다 : 공개 모듈을 비공개 모듈과 혼합합니다. 그게 내 질문을 자극했다. 나는 기본적으로 "나는이 일을 제대로하고 있는가? 아니면이 목적들에 더 합당한 다른 관례가 있는가?"라고 묻고있다. 섞는 것은 정말로 힘차게 느낍니다. – jkeeler

답변

0

나는 이것이 당신이 추가 할 수 있습니다 생산 또는 배포 계획 모듈하지만 기본 파일에 얼마나 적합 모르겠어요 :

process.env.NODE_PATH = __dirname; 
require('module').Module._initPaths(); 

항상 폴더에 대한 상대 모듈을 필요로 할 것이다 주 파일이 들어 있습니다. 나는. 당신이 파일이 있다면 : tests/some_other_file.js에 다음

library/some_file.js 

을 당신이 단지 수 :

require('library/some_file'); 

또는 당신이 당신의 기본 파일이 추가 수있는 대안으로

:

global.__base = __dirname + '/'; 

및 다른 모듈에서 다음을 사용해야합니다.

var MyObject = require(__base + 'my-project/lib/widget/myobject'); 
+0

예! 나는이 해결책을 또한 찾아 냈다.나는 노드와 브라우저 모두를 지원하지만 $ NODE_PATH의 사용을 막는다. "라는 링크의 문 때문에 NODE_PATH 솔루션을 즉시 할인했습니다. – jkeeler

+0

(내가 틀렸다면 수정하십시오.) 또한이 솔루션이 내 테스트 러너와 함께 작동한다고 생각하지 않습니다. 스펙 파일에는 클래스 정의가있는 js 파일 만 필요하기 때문에 main.js.에서 경로를 채우지는 않을 것입니다. – jkeeler

관련 문제