如何更改Meteor加载Javascript文件的顺序?

当你使用Meteor框架做一个项目时,它将所有的文件打包在一起,但是似乎没有办法明确地说“我想在这个文件之前加载这个文件”。

比方说,我有2个JavaScript文件: foo.jsbar.js

bar.js文件实际上包含的代码依赖于foo.js的一个,但Meteor正在bar.js之前加载bar.jsfoo.js中断了项目。

  • node.js中,我只require('./bar')foo.js使用require('./bar')
  • 浏览器中 ,我会把一个<script>标记指向foo.js ,另一个指向bar.js ,以便按照正确的顺序加载文件。

我们如何在meteor中做到这一点?

根据Meteor文档,文件目前按这个顺序加载:

  1. 首先加载[project_root] / lib中的文件
  2. 文件按目录深度sorting。 更深的文件首先被加载。
  3. 文件按字母顺序sorting。
  4. 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。