【问题标题】:How do you fix file load order problems using Meteor.startup?如何使用 Meteor.startup 解决文件加载顺序问题?
【发布时间】:2014-01-28 22:19:34
【问题描述】:

互联网上的许多资源(包括此处)建议使用Meteor.startup 来解决由 JS 文件加载顺序引起的依赖问题。但是,没有人详细说明这是如何实现的。

具体来说,文件顺序依赖性似乎是我无法让我的 posts.coffee 集合识别在我的 permissions.coffee 中定义的权限的原因。我认为这是因为posts.coffee 在/lib/collections 中,而permissions.coffee 在/lib 中,子目录中的文件首先被加载。 (顺便说一句,我更希望 /collections 位于根目录中,但之前我不得不将它移动到 /lib 以解决类似的问题。)

这是我的帖子。咖啡:

@Posts = new Meteor.Collection('posts')

Posts.allow(
  update: ownsDocument
  remove: ownsDocument
)

Meteor.methods(
  ...

这是我的权限。咖啡:

@ownsDocument = (userId, doc)->
  doc && doc.userId == userId

(顺便说一句,这全部来自“发现流星”书籍教程,在 these commits 附近,CoffeeScript 除外。)

我的问题:假设我对问题的分析是正确的,您将如何使用Meteor.startup 解决它? This answer 我很难解释;一种解释是我应该以某种方式将Posts.allow(...) 包装在Meteor.startup 中,但这似乎很笨拙。也许我错了,但似乎应该有一个包含所有必要启动代码的通用/配置文件,而特定的控制器应该对此一无所知。

顺便说一句,我意识到我可以利用 Meteor 的默认文件加载排序规则(例如 /lib 优先;子目录优先;main.* 最后;按字母顺序)来破解解决方案,但这对于应该是简单的问题。我不想在文件名前附加“a”或创建虚假目录只是为了让它在另一个文件之前加载。

最后一点:我正在使用 CoffeeScript,我想知道 CS 处理全局范围的方式是否与它有关。 (例如,不是将我的 Posts 集合定义为没有 var 关键字的 JS 变量,而是在 CS 中我必须将其定义为 @Posts,我相信这使它成为窗口的属性。)

【问题讨论】:

  • 您是否将所有集合的所有权限放在一个文件中?将允许/拒绝规则放在与集合定义相同的文件中可能会更容易、更有条理。此外,使用特定于特定实现细节的函数(如 @ownsDocument 函数)破坏全局命名空间通常是不好的做法。但听起来问题确实出在您想要的目录结构上。除了集合之外,您的应用程序的某些部分是否需要访问permissions.coffee?如果是供集合使用的代码库,放在lib/collections/lib/
  • 另一种解决方案可能是将您的收藏代码抽象为 Meteorite 包(只需将其放在 packages/ 中,不要将其发布到 Atmosphere)。这使您可以完全控制目录结构和文件加载顺序。

标签: javascript coffeescript meteor


【解决方案1】:

我强烈建议您考虑完全使用智能包。 Meteor 本身就是这样写的。

我在这里更详细地介绍:http://www.matb33.me/2013/09/05/meteor-project-structure.html

【讨论】:

  • 感谢您的建议,我会在未来的项目中认真考虑它,但它实际上并没有解决我关于 Meteor.startup 的问题:)
【解决方案2】:

是的,你就是这样做的:

Meteor.startup ->
  Posts.allow(
    ...
  )

基本上,任何使用在另一个文件中定义的变量的代码都应该在前面加上Meteor.startup ->,除非您确定加载顺序是正确的(例如,变量在 lib 中)。

是的,加载顺序选择不当。

【讨论】:

  • 谢谢!只是出于好奇,你觉得下面提到的matb33智能包方法怎么样?
  • 我认为 Meteor 的优势之一在于易于开发:当您需要移动东西或制作新文件时,您只需添加文件并继续工作,而无需考虑文件列表, 类声明等。将您使用的应用程序代码移动到智能包中会破坏此好处,因为现在您需要自己管理文件列表。话虽这么说,智能包非常适合它们的用途 - 小的、可重用的代码段,可能不会有太大变化。我有很多用于此类目的 - 只是不要将它们用于常规应用代码。
猜你喜欢
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2019-05-26
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多