我在这个领域看到很多帖子和文章。其中一些是,
Developing Modular Backbonejs Applications
TodoMVC with requireJS
Stack Overflow post with most upvotes
对我来说,模块化jquery,backbonejs和其他库是没有问题的。我的问题是我为什么要这样做?因为在每个js文件中我们将使用jquery和backbonejs并在每个文件上添加以下代码对我来说似乎是额外的负担。
define([
'jquery',
'underscore',
'backbone',
'myFile1', 'myFile1'
], function ($, _, Backbone, module1, module2) {
为什么我不应该在包含requireJS之前将它们直接包含在html文件中?
<script src="../lib/client/jquery.js"></script>
<script src="../lib/client/underscore.js"></script>
<script src="../lib/client/backbone.js"></script>
<script data-main="client/main" src="../lib/client/require.js"></script>
在这种情况下,我不需要在每个js文件上定义jquery或backbonejs。我可以单独模块化我自己的js文件,如下所示。
define([
'myFile1', 'myFile1'
], function (module1, module2) {
这种方法的缺点是什么?这是正确的方法吗?我是否打破了任何requirejs规则?
答案 0 :(得分:5)
我们是因为像jQuery和Backbone这样的模块在RequireJS模型中不起作用。没有define(
语句定义它们所以它们必须被填充以便像直接使用真正的需求模块一样工作。
是的,你所说的(只是将它们转储到全局命名空间中)起作用,你不会违反任何“规则”。当你添加一个脚本标签时,它所做的就是将代码转储到全局命名空间中 - 所以你的所有模块实际上都可以在上面的例子中访问Backbone和jQuery。
但它有三个缺点:
我们通过Require获得的一件事是我们的依赖关系显式,每次模块需要我们知道的东西时 - 所以我们的依赖关系管理要清楚得多(我们知道哪些模块依赖于jQuery以及什么不依赖jQuery - 所以我们知道在没有jQuery的新项目中哪些模块是安全的。)
另一件事是我们在代码中保持一致,我们始终以完全相同的方式声明每个依赖关系并以完全相同的方式使用它。 RequireJS shims让我们继续表现得像jQuery或Backbone这样的库。
由于隐式依赖,如果你想重用你的代码 - 包括jQuery 之后你的RequireJS模块将是一个运行时错误,这并不总是很容易理解,不像Require这会告诉你它无法加载模块jQuery(而不是像$定义的那样,甚至更糟的是“[对象]不是一个函数”或类似的东西。