2013-03-09 4 views
3

저는 현재 JavaScript를 사용하여 Windows 8 응용 프로그램을 작성하는 팀원입니다. 우리는 npm 및 browserify를 사용하여 종속성을 관리하고 모듈을 AMD 브라우저 친화적 형식으로 변환합니다.복잡한 응용 프로그램 구조를위한 NodeJS 로컬 모듈

우리가 실행하고있는 한 가지 문제점은 미친 경로입니다. 이는 응용 프로그램 "구성 요소"내에 최상위 폴더가 있기 때문입니다. 이 폴더에는 여러 개의 중첩 된 UI 구성 요소/모듈이 포함되어 있습니다. 이러한 모듈은 때로는 lib 디렉토리에있는 lib 유틸리티 및 도우미를 필요로합니다.

예를 들어 "my/app/components/product/grid/item"에있는 모듈의 경우 "my/app/lib/helpers/view"에있는 도우미 모듈이 필요할 수 있습니다.

요구 사항 경로가 약간 미친 및 매우 못생긴 : require ("../../../../lib/helpers/view");

우리는 모듈 방식으로 응용 프로그램을 빌드하는 데 최선을 다하고 있습니다. 이제 나는 이것에 접근하는 적절한 방법이 우리의 구성 요소 모듈이 이러한 유틸리티 헬퍼 모듈에 의존하게하는 것이라고 생각할 것입니다. 나는 lib 헬퍼를 자신의 외부 전용 git repo에 넣을 수 있었지만 다른 팀에게 액세스 권한을 부여하는 것 (개인 소유의 저장소는 느리다)과 관련하여 고통을 겪고있다. 또한이 모듈은 애플리케이션에서만 사용되므로 변경을 수행하고 변경 사항을 적용한 다음 애플리케이션 및 npm 업데이트로 돌아가는 데 시간이 낭비됩니다. 이것은 일부에게는 문제가되지 않지만, 실제로이 문제를 해소하면 실제 속도가 훨씬 빨라질 수 있습니다.

nim은 package.json 구성 요소 내에 "my/app/lib/helpers/view"를 설치할 수 있습니까? 그러나 npm install은 자동으로이 작업을 수행하지 않습니다.

이 문제를 해결하는 몇 가지 다른 방법이 있습니다 (NODE_PATH, 아마도 npm install hook 또는 npm preinstall 스크립트를 사용합니다).하지만 다른 누구에게도 비슷한 문제와 해결책이 있는지 알고 싶었습니다. 당신이 가능하게 할 수

+0

현재 나의 접근 방식은 빌드 할 때마다 배치 스크립트를 실행하여 NODE_PATH에 대한 환경 변수 var를 설정하는 것입니다. – pbo

+0

좋아, 좀 더 npm 링크를 가지고 놀면 여기로 갈 수 있습니다. 내 응용 프로그램 모듈은 package.json 파일을 가지고 있습니다. npm 링크를 사용하면 해당 모듈을 사용할 수있게되고, npm 링크를 사용하면 해당 모듈을 사용할 수있게됩니다. 여기에있는 파일은 새 설치에 npm 링크가 있는지 확인해야합니다. npm install은이 모듈들을 링크하지 않습니다. – pbo

+0

별도의 repos가가는 길이라고 생각합니다. – Domenic

답변

0

한 가지 ... 당신의 필요 설정에 도우미에 대한 별칭을 만들려면 긴 경로의 일부를 줄일 것

require.config({ 
    paths: { 
     "helpers": "my/app/lib/helpers"  
    } 
}); 

입니다.

+0

이것은 nodej에서도 작동합니까? – pbo

+1

그래, 이건 단지 우리가 사용하지 않는 요구 사항 일 뿐이라고 생각해. 위를 보면, 우리는 우리 모듈을 랩핑하기 위해 browserify를 사용하고 있습니다. 또한이 솔루션을 서버에서도 사용할 수 있기를 바랍니다. – pbo

7

에 파일을 넣은 다음 응용 프로그램 코드에 require('grid/item')을 입력하면 경로 구문이 필요한 파일을 얻을 수 있습니다. node_modules/grid/item.js과 git에있는 다른 파일을 확인하십시오. node_modules/ 디렉토리는 최상위 레벨 일 필요가 없습니다. node와 browserify가 사용하는 요구 알고리즘이 일치하는 모듈을 찾을 때까지 현재 경로에서 /까지 현재 경로에서 node_modules/ 디렉토리를 검색합니다.

package.json의 "bundledDependencies" 배열에 "grid"을 추가하면 실수로 무언가를 설치하지 않게됩니다.

checking node modules into git에 대한 자세한 내용을 볼 수 있습니다.

자세한 내용은 browserify handbook about avoiding ../../../../../../ 섹션을 참조하십시오.

NODE_PATH는 항상 잘못된 생각이며 browserify가 지원하지 않습니다. 절대 사용하지 마십시오.

+0

흥미 롭습니다. 나는 NODE_PATH가 최선의 방법이 아니라는 것을 알았지 만, 나는 최근 모듈 웹 어플리케이션 (http://tjholowaychuk.com/post/38571504626/modular-web-applications-with-node-js-and-express)에서 TJ의 비디오를 보았다. Express와 그는 NODE_PATH를 사용하여 언급합니다. – pbo

+0

그래, 우리는 자식 자식 node_modules/*, 무시하지만 모든 종속성, 심지어 종속성의 종속성을 shrinkwrap 잠급니다 생각. 그 게시물은 그 사실을 언급하지 않는 것 같습니다. – pbo

+0

나는 이것들을 최상위 레벨에 두지 않기 때문에 위에서 언급 한 것과 같이 상위 레벨 node_modules가 제 3자를위한 디렉토리 구조를 만들고 내 lib 폴더 안에 애플리케이션 로컬 모듈을위한 node_modules가있을 수 있습니다. 이 접근법에 대한 내 문제는 로컬 모듈의 플랫 목록을 가져야한다는 것입니다. – pbo

0

require() 함수의 문제점은 경로가 현재 파일에서 상대적이라는 점입니다. node_modules 디렉토리 안에 모듈을 넣을 수 있지만, 이것은 당신이 할 수있는 최악의 경우이다.node_modules는 모든 타사 모듈이있는 디렉토리입니다. 이 간단한 규칙을 따르면 매우 쉽고 편리하게 최신 상태를 유지할 수 있습니다. 모든 종속성을 제거하고 (node_modules 제거) 단지 npm install을 수행 할 수 있습니다.

가장 좋은 해결책은 고유 한 요구 기능을 정의하고이를 글로벌하게 만드는 것입니다. 예를 들어 :

프로젝트 구조는 다음과 같습니다

my-project 
| tools 
|- docs 
|- logs 
|- conf 
`- src 
    |- node_modules 
    |- package.json 
    |- mod.js 
    |- a 
    | `- b 
    |  `- c.js 
    `- d 
     `- app.js 

mod.js

global.mod = function (file){ 
    return require ("./" + file); 
}; 

모두 쉽게

//This should be the first line in your main script 
require ("../mod"); 

//Now all the modules are relative from the `src` directory 
//You want to use the a/b/c.js module 
var c = mod ("a/b/c"); 

을 app.js. node_modules에있는 타사 모듈을 가져 오려면 require()를 사용하십시오. 자신의 모듈을 얻으려면 mod()를 사용하십시오.

node_modules은 타사 모듈, rule nº1에만 해당합니다.

+0

'require ("./"+ file)와 같이 사용자 정의 기능이 정적으로 분석 가능하지 않고 browserify와 함께 작동하지 않습니다. 자신의 모듈을'node_modules /'에 넣는 것은 완벽하게 받아 들일 수 있으며, 처음에는'bundledDependencies'와 같은 것이 있습니다. – substack

+0

browserify와 호환되지 않는 경우 browserify와 호환되도록 설정하십시오. 내 솔루션은 node_modules 안에 물건을 넣는 것보다 더 깨끗합니다. –

관련 문제