Coffeescript、主干和加载顺序

Coffeescript、主干和加载顺序,coffeescript,dependency-management,Coffeescript,Dependency Management,考虑这个Coffeescript类,在一个应用程序中,每个类都位于自己的文件中 class Manager extends Person title: titles["manager"] 如果该文件在“titles”对象之前加载,则会生成错误。我假设这是因为Coffeescripts安全包装器在首次加载此文件时执行“.call(this)” 否则,如果我延迟运行任何代码,直到整个页面完全加载($(document.ready())之后,我可以确保所有javascript文件都在任何代码实际

考虑这个Coffeescript类,在一个应用程序中,每个类都位于自己的文件中

class Manager extends Person
  title: titles["manager"]
如果该文件在“titles”对象之前加载,则会生成错误。我假设这是因为Coffeescripts安全包装器在首次加载此文件时执行“.call(this)”

否则,如果我延迟运行任何代码,直到整个页面完全加载($(document.ready())之后,我可以确保所有javascript文件都在任何代码实际运行之前完全加载


这不是造成了一些恼人的加载顺序问题,还是我没有正确地执行某些操作?

这确实是一个加载顺序问题,
Manager
中的
titles
指的是一个全局,在这种情况下,它在此时未被声明。如果您知道
titles
在其他地方被全局声明,则必须手动确保没有首先加载了hat脚本。是的,问题很可能出在安全包装器上。但正如建议的那样:它的存在是有充分理由的。请自己创建一个名称空间,而不是导出到全局对象。全局对象位于
中(在定义时)或者在节点中导出。我通常将这一行放在脚本之上,这些脚本应该可以轻松访问全局对象:

root = exports ? window
从那里我可以把东西放在全局对象中,比如名称空间:

root.app =
  a: 1,
  a_fun: -> 1

class root.app.Cls
   method: => 1 + 1

root.app.obj = new root.app.Cls

现在,您的全局对象中将有一个带有“类”(可以说)和“and”对象的“app”对象。

它不能同时是订单问题和包装问题。使用立即运行的函数包装某个对象对订单没有影响,只对范围有影响

如果
标题
是在另一个文件中定义的,那么
类管理器
的范围并不重要。因此,这是一个顺序问题。如何定义
标题

如果我将运行任何代码延迟到整个页面完全加载($(document.ready())之后,我可以确保所有javascript文件在任何代码实际运行之前都已完全加载

不完全正确。
$(document.ready()
(注意括号中没有
document.ready
函数…)延迟函数的执行直到页面的所有HTML都被加载,这并不意味着所有JavaScript都被加载。好消息是:从JavaScript代码的角度来看,是否加载了其他JavaScript文件并不重要,因为它们都是按顺序运行的。(注意:我在这里假设您没有做任何花哨的事情,比如从JavaScript代码中添加额外的
标记。)只要您有

<script src="titles.js"></script>
<script src="Manager.js"></script>
其中
titles.js
创建一个名为
titles
的全局文件,而
Manager.js
如下所示

<script src="Manager.js"></script>
<script src="titles.js"></script>
$(document).ready ->
  console.log titles
然后输出有时是
标题
,有时是
未定义的
。为什么?因为

如果在初始化DOM后调用了
.ready()
,则传入的新处理程序将立即执行

当第一个JS文件运行时,DOM可能已经被初始化了!(实际上,如果浏览器缓存了页面的HTML,这种情况就会发生。)


因此,请保持简单。只需按正确的顺序加载脚本。记住,出于所有实际目的,浏览器会按顺序将脚本连接到一个JS文件中。

尝试一下CoffeeToaster:


通过提供
导入
指令,它将完全满足您的需求,这是
#哇,谢谢Trevor。很高兴知道没有魔法,我只需按正确的顺序加载脚本。我正在查看DocumentCloud网站的源代码作为参考,它似乎是他们的core.jst文件(使用全局JST对象)是最后一个加载的文件。我不清楚之前加载的类如何引用JST对象,因为我在自己的应用程序中看到这样做的错误。
#<< foldera/folderb/folderc/myfile
#<< another/package/myclass
class SomeClass extends another.package.MyClass