如何更改Meteor加载Javascript文件的顺序?
当你使用Meteor框架做一个项目时,它将所有的文件打包在一起,但是似乎没有办法明确地说“我想在这个文件之前加载这个文件”。
比方说,我有2个JavaScript文件: foo.js和bar.js 
  bar.js文件实际上包含的代码依赖于foo.js的一个,但Meteor正在bar.js之前加载bar.js , foo.js中断了项目。 
-  在node.js中,我只require('./bar')在foo.js使用require('./bar')
-  在浏览器中 ,我会把一个<script>标记指向foo.js,另一个指向bar.js,以便按照正确的顺序加载文件。
我们如何在meteor中做到这一点?
根据Meteor文档,文件目前按这个顺序加载:
- 首先加载[project_root] / lib中的文件
- 文件按目录深度sorting。 更深的文件首先被加载。
- 文件按字母顺序sorting。
- main。*文件最后加载。
资料来源: http : //docs.meteor.com/#structuringyourapp
不是所有场景的解决scheme,但我认为理想情况下,任何依赖于其他代码的东西都将放置在Meteor.startup函数中,以确保所有内容都已加载。
您可以随时使用像yepnope.js这样的JS加载器,并将其添加到client.js文件中。 这对我有用。
我有一套实用function,我在公共命名空间(js全局)下构build。
即
 // utils/utils.js Utils = {}; 
然后在子文件夹中:
 // utils/validation/validation.js Utils.Validation = {}; // utils/validation/creditCard.js Utils.Validation.creditCard = ... // validation logic etc 
还有一堆使用Utils和它的子对象的代码。
显然,这个结构不起作用,因为meteor加载子文件夹第一。
为了使其工作正常,我不得不用无意义的名字创build/子文件夹/子文件夹/子文件夹,然后在最深的子文件夹中推索根对象,并在不太深的子文件夹中分支对象。
这对我的口味和容易出错是非常不直观的(假设你的文件夹结构中有更深的组件)。
为了解决这个问题,我使用了Q库和延期和承诺。 解决scheme仍然是不干净的,因为它使你重复和检查例程代码,但它可以让你完全控制加载顺序,而不会搞乱目录结构(你好,谁说你可以组织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 }) }); 
 这是一个相当狭窄的用例的例子,因为大多数情况下你会很高兴处理一些用户交互callback或Meteor.startup里面的所有东西都已经初始化。 否则,如果你想在初始阶段对初始化顺序进行细粒度的控制,这可能是一个解决scheme。