requireJS:如何为整个网站构建Javascript?

时间:2011-02-28 13:39:10

标签: javascript module requirejs

我有3000多行javascript,我需要进入合理/可维护的结构。我选择使用requireJS,因为有些人推荐给我。我有一堆在整个应用程序中使用的变量,需要随处可用。我还有一堆需要随处可用的功能。除了这两个依赖项之外,大多数代码都可以分成它们自己的模块。

我无法理解如何管理我的主变量,以便如果一个代码模块对变量进行更改,其余JS模块将会看到更改。我想我需要看到一些示例演示了如何使用requireJS来扩展文档中的示例。

如果有人是经验丰富的requireJS用户,我很乐意听取您的提示!

4 个答案:

答案 0 :(得分:5)

RequireJS的重点是避免使用这些全局变量和全局函数。

你不能将这些全局变量包装到一个模块中,然后在其他模块中依赖它吗?

例如,RequireJS模块化Dojo可能类似于:

dojo/cache module
dojo/string module (requires dojo/cache)
dojo/date module (requires dojo/string)
dojo/cookie module (requires dojo/string)
           :
           :
dojo module (requires everything above, make them all into sub-objects, say, e.g. dojo.cache, dojo.string, dojo.date etc.)

user module #1 (requires dojo)
user module #2 (maybe only requiring dojo/string)

答案 1 :(得分:3)

RequireJS为封装模块提供了更好的选择,但它根本不会改变Javascript本身。作为转换策略,您仍然可以在功能块内定义全局变量。根据包含这些定义的模块,将确保它在依赖模块之前运行。

下一步是将这些方法分配给窗口以外的对象,然后通过从RequireJS模块依赖项收到的变量使用该对象。

希望在您完成此操作时,您可能会对清洁解决方案有所了解。我将单个文件项目重构(并且仍然是)为几个文件,包括可选的插件,尽管我在将RequireJS添加到混合之前完成了大部分工作。

答案 2 :(得分:2)

请参阅RequireJS文档:

  

如果模块具有依赖关系,则第一个参数应该是依赖项名称数组,第二个参数应该是定义函数。 ...依赖项将作为函数参数

传递给定义函数
define(["./cart", "./inventory"], function(cart, inventory) {
        // ...
        return { ... };
    }
);

所以我认为您可以像所有其他模块一样定义()您的主模块,并使子模块依赖于该主模块。然后将模块对象作为参数传递给子模块的定义函数。您不必使用全局变量。

答案 3 :(得分:0)

如果要在模块之间共享信息,请将信息附加到模块对象,让其他模块依赖该模块,并检查其属性。

如果您有现有代码,则可以在清理时分配给window.x以提供全局x