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

Javascript RequireJS:如何处理浏览器和服务器之间共享代码的不同模块依赖关系?,javascript,node.js,browser,requirejs,Javascript,Node.js,Browser,Requirejs,我在浏览器和服务器上都加载了一个requireJS模块,以实现一些共享功能 但是,模块在每个环境中具有不同的依赖关系: 在节点中,需要fs模块才能加载文件 在浏览器中,需要jqueryajax或其他AJAX库才能将这些文件作为HTTP资源获取 处理在浏览器和服务器之间共享的模块的最佳方法是什么,但这些模块在每个模块中都有不同的依赖项?依赖项不需要不同。相反,使您的模块都没有模块作为依赖项。相反,您需要为两种不同的情况对模块进行参数化,并从服务器和浏览器特定的代码中传递正确的参数来处理这些情况

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

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

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

处理在浏览器和服务器之间共享的模块的最佳方法是什么,但这些模块在每个模块中都有不同的依赖项?

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

mymodule.fileLoader = fswrapper;

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

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

这些想法有很多不同之处,但关键是您应该将文件系统的差异从共享模块中抽象出来,并将一个对象传递给它,以处理对所讨论环境的访问。

谢谢!这正是我最终所做的(在我问过之后不久,我自己解决了这个问题,但忘了更新答案)。它工作得很好!
var v = new MyClass(fswrapper);
//or
var v = new MyClass();
v.fileLoader = ajaxWrapper;