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