Meteor가 Javascript 파일을 로드하는 순서를 어떻게 변경합니까?
-
12-12-2019 - |
문제
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
, 올바른 순서로 파일을 로드하려면
우리는 어떻게 그렇게 할 수 있습니까? 유성?
해결책
유성 설명서에 따르면 현재이 순서로 파일이로드됩니다.
- [project_root] / lib의 파일은 먼저로드됩니다
- 파일은 디렉토리 깊이로 정렬됩니다.더 깊은 파일이 먼저로드됩니다.
- 파일은 알파벳 순서로 정렬됩니다.
- main. * 파일이 마지막으로로드됩니다.
다른 팁
모든 시나리오의 해결책이 아닙니다. 그러나 다른 코드에 따라 다른 모든 코드에 종속되는 것이 이상적으로 모든 것이 이미로드되도록 보장합니다.
항상 "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
모든 것이 이미 초기화된 곳입니다.그렇지 않고 초기 단계에서 초기화 순서를 세밀하게 제어하려면 이것이 해결책이 될 수 있습니다.