문제

Meteor 프레임워크로 프로젝트를 만들면 모든 파일을 함께 패키징하지만 "이 파일이 저 파일보다 먼저 로드되기를 원합니다"라고 명시적으로 말할 수 있는 방법은 없는 것 같습니다.

예를 들어 자바스크립트 파일이 2개 있다고 가정해 보겠습니다. foo.js 그리고 bar.js.

파일 bar.js 실제로 내부 코드에 따라 코드가 포함되어 있습니다. foo.js 하지만 Meteor가 로딩 중이에요 bar.js ~ 전에 foo.js, 프로젝트를 중단합니다.

  • ~ 안에 node.js 나는 단순히 require('./bar') 내부에 foo.js
  • 에서 브라우저, 나는 <script> 태그를 가리키는 foo.js 그리고 또 다른 하나는 다음을 가리키며 bar.js, 올바른 순서로 파일을 로드하려면

우리는 어떻게 그렇게 할 수 있습니까? 유성?

도움이 되었습니까?

해결책

유성 설명서에 따르면 현재이 순서로 파일이로드됩니다.

  1. [project_root] / lib의 파일은 먼저로드됩니다
  2. 파일은 디렉토리 깊이로 정렬됩니다.더 깊은 파일이 먼저로드됩니다.
  3. 파일은 알파벳 순서로 정렬됩니다.
  4. main. * 파일이 마지막으로로드됩니다.
  5. 출처 : http://docs.meteor.com/#structuringyourApp

다른 팁

모든 시나리오의 해결책이 아닙니다. 그러나 다른 코드에 따라 다른 모든 코드에 종속되는 것이 이상적으로 모든 것이 이미로드되도록 보장합니다.

항상 "Nofollow"> yepnope.js 와 같은 JS 로더를 사용하고 client.js 파일에 추가 할 수 있습니다.이것은 나를 위해 일합니다.

공통 네임스페이스(js 전역) 아래에 구조화된 유틸리티 함수 세트가 있습니다.

즉.

// utils/utils.js
Utils = {};

그런 다음 하위 폴더에서:

// utils/validation/validation.js
Utils.Validation = {};

// utils/validation/creditCard.js
Utils.Validation.creditCard = ... // validation logic etc

또한 Utils와 하위 개체를 사용하는 코드가 많이 있습니다.

분명히 이 구조는 먼저 Meteor 로드 하위 폴더로 작동하지 않습니다.

예상대로 작동하게 하려면 의미 없는 이름으로 /subfolder/subfolder/subfolder를 만든 다음 가장 깊은 하위 폴더에 루트 개체를 밀어넣고 그렇게 깊지 않은 하위 폴더에 개체를 분기해야 했습니다.

내 취향에는 매우 반직관적이며 오류가 발생하기 쉽습니다(폴더 구조가 훨씬 더 깊은 구성 요소가 있다고 가정).

이 문제를 해결하기 위해 연기 및 약속이 포함된 Q 라이브러리를 사용했습니다.일상적인 코드 반복 및 검사를 수행하므로 솔루션은 여전히 ​​깨끗하지 않지만 디렉터리 구조를 망칠 필요 없이 로드 순서를 완전히 제어할 수 있습니다(원하는 대로 Meteor 코드를 구성할 수 있다고 말하는 사람들에게 안녕하세요).

예:

//utils.js
UtilsDefer = UtilsDefer || Q.defer();
UtilsDefer.resolve({
    // here some root utils stuff
});

//cards.js
// here we'll depend on Utils but don't want to care about directory structure
UtilsDefer = UtilsDefer || Q.defer(); // it will be a) already 
// resolved defer from utils.js, or b) new defer that will
// be resolved later in utils.js
UtilsDefer.then(function(Utils) {
    // do something with utils usage, or for instance add some fields here
    Utils.CreditCardDefer = Utils.CreditCardDefer || Q.defer();
    Utils.CreditCardDefer.resolve({
        // Credit card utils here
    })
});

//someOtherFile.js
// it will be pain to use sub-objects with this method though:
UtilsDefer = UtilsDefer || Q.defer();
UtilsDefer.then(function(Utils) {
    Utils.CreditCardDefer = Utils.CreditCardDefer || Q.defer();
    Utils.CreditCardDefer.then(function(CreditCard) {
        // do stuff with CreditCard _if_ you need to do it on startup stage   
    })
});

이는 다소 좁은 사용 사례의 예입니다. 대부분 사용자 상호 작용 콜백 내에서 이러한 전역 변수를 처리하는 데 만족할 것이기 때문입니다. Meteor.startup 모든 것이 이미 초기화된 곳입니다.그렇지 않고 초기 단계에서 초기화 순서를 세밀하게 제어하려면 이것이 해결책이 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top