如何更改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。