2014-04-25 3 views
3

최근에 내가 Node.js를 인해 필요한 모듈은 대소 문자를 구분하거나 경우 문제가되지 않습니다 윈도우 파일 시스템에, 당신이 생각하는 메커니즘nodejs는 필요 - 모듈 이름의 경우 민감한 문제

을 필요에 대한 이상한 문제를 발견 아니. 그래서 ...

모듈 A :

require("fancyModule"); 

모듈 B :

require("fancymodule"); 

는 모두 같은 fancymodule.js 파일을 선도하고 있습니다. 객체의 생성자는 두 번 호출됩니다. 그래서

var FancyModule = { 
    var name = "unkown"; 
    var setName = function(val){ 
     name = val 
    } 
    return { 
     setName:setName 
    } 
} 
module.exports = FancyModule(); 

은 두 개의 분리 된 FancyModule 인스턴스가됩니다. 그래서 그것을 알고 있어야합니다.

필자는 파일 시스템이 대소 문자를 구분하는지에 관계없이 항상 올바른 파일 이름을 신경 써야한다는 것을 알고 있습니다.

내 질문에, 노드를 설치하거나 구성하여 경고를 방지 할 수있는 방법이 있습니까?

+0

왜 처음부터 두 번 require()해야합니까? – Scimonster

+0

은 문제를 명확하게 보여주는 예입니다. –

답변

6

우선, 사용중인 파일 시스템에 대해 절대 가정하지 마십시오. 다른 환경에서 실행하는 경우 항상 대소 문자를 구분해야합니다.

지금 당신의 문제 : 당신이 싱글을 내보내고 두 번 초기화하지 할 위치

당신이 노드의 모듈을 필요로

는, 노드는 경우를 방지하기 위해 정확히 가져 오기를 캐시합니다. 파일 시스템 조회는 대소 문자를 구분하지 않기 때문에 똑같은 정확한 파일을 반환하지만 require의 캐시는 여전히 두 경우를 다른 모듈로 처리합니다. 이것은 대소 문자를 구분하는 환경에서 실행된다고 가정해야하기 때문에 실제로 두 개의 다른 모듈이 뒤에있을 수 있습니다.

그래서 싱글 톤을 두 번 초기화합니다. 실제로 두 개의 다른 모듈로 취급합니다.

방지 할 수있는 방법이 있는지 묻는 중입니다. 매우 쉽지만 끔찍한 방법이 있습니다. 수입품을 소문자로 바꾸려면 global.require을 패치하십시오.

var patchRequire = function() { 
    var oldRequire = global.require; 
    global.require = function (moduleName) { 
     return oldRequire.call(global, moduleName.toLowerCase()); 
    }; 
}; 

patchRequire(); 
require('Foo-Bar'); // Will require 'foo-bar' instead 

그러나 그렇게하지 마십시오. 가져 오기 일관성을 유지하고 대시로 구분 된 모든 소문자 이름을 사용하는 것이 좋습니다.

+0

큰 환경에서이 "버그"를 찾는 것이 매우 어려울 수 있기 때문에 감사합니다. 그리고 버그로 나는 필요한 모듈의 오자를 의미합니다. –

+0

대소 문자를 구분하지 못하게하는 예제가 추가되었습니다. 사용하지 마십시오. – TheShellfishMeme

+0

ja 고마워, 정말 그것을 막을 수있는 잔인한 방법입니다 :) 아니, 실제로 거기에 경고 또는 예외 또는 뭔가 줄 노드를 구성하는 방법이 있다고 생각. 나는 누군가가 큰 프로젝트를 위해 창에서 nodejs를 사용할 때이 함정에 들어갈 것입니다. 특히 한 명 이상의 개발자가 작업 할 때 특히 그렇습니다. 귀하의 도움에 다시 한 번 감사합니다. –