这是一个完整的noob问题,但无论如何我都要问它
我几天前开始玩backbone.js,我真的很着迷。当我接手“ToDo”时,我开始研究自己的项目。来自Java世界,我更喜欢将所有内容保存在尽可能多的单独文件中。因此,我将模型视图和路由器拆分为单独的文件,分成单独的文件夹。
当我尝试将这些fiels合并到一个applciation.js文件中时出现了问题。再次,来自Java世界,我喜欢自动化的东西,甚至更多,当我可以使用像ant这样的熟悉的工具来为我的javascript项目设置构建过程时。
我有一个示例ant构建模板,它以任意顺序连接和缩小所有文件。完成后,我尝试运行我的JS应用程序,毫不奇怪,它失败了一堆错误。我的许多模型和视图都尝试相互扩展,其他模型和视图则依赖于它们作为组件。如果它们没有按照正确的顺序定义,那么应用程序就会尝试执行extend
的{{1}}
我之前知道JavaScript的顺序非常重要,但不知怎的,我留下的印象是,如果所有脚本都在一个文件中,那么JS解析器将首先加载所有内容,然后尝试执行无论要执行什么。好吧,我的假设是错的。
可以按照我想要的特定顺序列出所有文件,但是我真的需要采取这样一个原始步骤吗?不幸的是,经过几个小时的研究,我找不到更好的东西。
是否真的可以以任意顺序连接相互依赖的JS文件,而不会发生冲突?我想,最大的问题是实际调用了undefined
函数,而不是每个脚本只是定义和对象文字
那么,解决方案是什么?
UPDATE :我刚看到Sproutcore有自己的构建器。如果SC大致类似于BB,那么在创建和扩展实体的方式中,SC构建器如何工作而不会发生冲突?
答案 0 :(得分:0)
您的“假设”仅适用于var
形式的function name(a,b) {}
语句和函数。这两个被提升到脚本的顶部(或它们所在的功能块)并首先被评估。
如果您的文件依赖于首先加载的其他文件,那么当您将它们连接起来时,它们必须按照最终文件中的顺序排列。
答案 1 :(得分:0)
看看requirejs。设置需要一些时间,但它可以帮助您解决问题 This article应该有助于实施。
答案 2 :(得分:0)
有很多方法可以做到这一点,但这是我的食谱。我在开发文件前面添加一个数字,从没有依赖关系的数字开始(基础“类”,将依赖于其他模型的模型,然后使用这些模型的视图,然后调用这些视图的路由器等)。
然后我使用uglify-js(作为node.js库提供,使用npm install uglify-js
安装)来缩小我在一个文件中的所有js(如果你使用node.js,请不要知道你的问题虽然服务器端。然后我cat *.js | uglifyjs -o min/myfile.min.js
。这将把我所有.js文件的内容(因为我的前缀而尊重依赖关系的顺序)发送到uglify,这将缩小它并将其保存到单个文件中。
由于我也像自动化一样,我在Makefile中设置了这个,但我想可以使用Ant(不太熟悉它)来完成。 Makefile的相关部分如下所示:
TARGET_MIN_FILE = public/js/min/myfile.min.js
JS = $(shell echo public/js/*.js)
public/js/min/myfile.min.js: $(JS)
cat $(JS) | uglifyjs -o $(TARGET_MIN_FILE)
clean:
rm -f $(TARGET_MIN_FILE)
.PHONY: clean
另一方面,如果你选择异步模块定义(AMD)格式,你可以要求()你的模块,它将以正确的顺序为你管理依赖加载(参见Require.js了解更多信息),如TheShelfishMeme所述。