3

我在这方面看到了很多帖子和文章。其中一些是,
开发模块化 Backbonejs 应用程序
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 规则?

4

1 回答 1

5

我们填充是因为像 jQuery 和 Backbone 这样的模块在 RequireJS 模型中不起作用。没有define(定义它们的声明,因此必须填充它们才能像真正的 Require 模块一样直接工作。

是的,您所说的(只是将它们转储到全局名称空间中)有效,您没有违反任何“规则”。当您添加一个脚本标签时,它所做的只是将代码转储到全局命名空间中——因此您的所有模块实际上都可以访问上例中的 Backbone 和 jQuery。

但是它有三个缺点:

  • 我们使用 Require 获得的一件事是我们的依赖项是显式的,每次模块需要我们知道的东西时 - 所以我们的依赖项管理更加清晰(例如,我们知道哪些模块依赖于 jQuery,哪些不依赖 - 所以我们知道在没有 jQuery 的新项目中使用哪些是安全的)。

  • 另一件事是我们在代码中保持一致,我们一直以完全相同的方式声明每个依赖项并以完全相同的方式使用它。RequireJS shims 让我们继续像 jQuery 或 Backbone 这样的库所做的那样。

  • 由于隐含的依赖关系,如果你想重用你的代码——在你的 RequireJS 模块之后包括 jQuery将是一个运行时错误,这并不总是容易理解,不像 Require 它会告诉你它不能加载模块 jQuery (并且没有定义像 $ 这样的东西,或者更糟糕的是“[Object object] 不是函数”或类似的东西。

于 2013-08-31T07:30:23.850 回答