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

IT技术 javascript dependencies meteor require
2021-02-26 04:26:38

当您使用 Meteor 框架创建一个项目时,它将所有文件打包在一起,但似乎没有一种方法可以明确地说“我希望在那个文件之前加载这个文件”。

比方说,例如,我有 2 个 javascript 文件:foo.jsbar.js.

该文件bar.js实际上包含依赖于内部代码的代码,foo.js但 Meteor 在加载bar.js之前foo.js,破坏了项目。

  • node.js 中,我会简单地require('./bar')在里面使用foo.js
  • 浏览器中,我会放置一个<script>指向标记,foo.js然后放置另一个指向标记bar.js,以便以正确的顺序加载文件。

我们如何在Meteor 中做到这一点

4个回答

根据 Meteor 文档,文件当前按以下顺序加载:

  1. [project_root]/lib 中的文件首先加载
  2. 文件按目录深度排序。首先加载更深的文件。
  3. 文件按字母顺序排序。
  4. main.* 文件最后加载。

来源:http : //docs.meteor.com/#structuringyourapp

@JérémyFaivre 是的,如果您使用 Meteor.startup(...),您可以保证在开始使用它之前一切都已加载并且 DOM 已准备就绪。玩得开心!
2021-04-18 04:26:38
用陨石安装的代码怎么样?他们什么时候加载?
2021-04-18 04:26:38
如果我使用外部脚本(如 Google)并且我的脚本依赖它怎么办?
2021-04-24 04:26:38
@JordyMeow 你应该能够把它放在 lib/ 中 - 现在记录了排序逻辑@ docs.meteor.com/#structuringyourapp
2021-05-03 04:26:38
谢谢,这个逻辑实际上比我预期的按字母顺序排序文件要好。应该足以管理依赖项。
2021-05-14 04:26:38

不是适用于所有场景的解决方案,但我认为理想情况下,任何依赖于其他代码的东西都将放置在 Meteor.startup 函数中,以确保一切都已加载。

您始终可以使用yepnope.js之类的 JS 加载器并将其添加到 client.js 文件中。这对我有用。

我有一组在公共命名空间(js 全局)下构建的实用程序函数。

IE

// 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,然后将根对象推入最深的子文件夹中,并将分支对象推入不那么深的子文件夹中。

这对我的品味来说非常违反直觉并且容易出错(假设您有文件夹结构更深的组件)。

为了解决这个问题,我使用了带有延迟和Promise的 Q 库。解决方案仍然不干净,因为它使您重复和检查例行代码,但它使您可以完全控制加载顺序而不会弄乱目录结构(向那些说您可以根据需要组织流星代码的人你好)。

例子:

//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一切都已经初始化的地方。否则,如果您想在很早的阶段对初始化顺序进行细粒度控制,那可能是一个解决方案。