RequireJS:如何处理浏览器和服务器之间共享的代码的不同模块依赖关系?

时间:2012-05-26 11:13:11

标签: javascript node.js browser requirejs

我在浏览器和服务器上都加载了requireJS模块,以实现一些共享功能。

但是,模块在每个环境中都有不同的依赖关系:

  • 在节点中,它需要fs模块才能加载文件
  • 在浏览器中,它需要JQuery AJAX或其他一些AJAX库才能将这些文件作为HTTP资源获取。

能够处理浏览器和服务器之间共享但在每个模块中具有不同依赖关系的模块的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

依赖关系不需要不同。相反,让您的模块将既不是模块作为依赖项。相反,您需要针对两种不同情况对模块进行参数化,并从服务器和浏览器特定代码传递正确的参数来处理这些情况。一种方法是在调用任何方法之前要求在模块上设置特定属性,并且此属性用于提供必要文件加载功能的对象:

mymodule.fileLoader = fswrapper;

mymodule.fileLoader = ajaxWrapper;

(显然,上面两个片段将分别出现在服务器和浏览器特定的代码中)。另一种方法是将相关对象传递给从模块导出的类的构造函数(如果这是模块的公开方式)或将其指定为创建对象的属性。 E.g。

var v = new MyClass(fswrapper);
//or
var v = new MyClass();
v.fileLoader = ajaxWrapper;

这些想法有很多变化,但重点是你应该从共享模块中抽象出文件系统的差异,而是传递一个处理相关环境访问的对象。