如何使用JS(浏览器端)中的“require”和依赖注入,服务位置



所以我一直在玩JS和browserify,以允许将我的JS拆分为较小的文件块。它工作得很好,但是,我仍然不知道如何正确使用require功能。

对我来说,它充当服务定位器,因为它查找要加载的正确"文件"并返回对象。(例如在 PHP 中,require在某种程度上将文件加载到内存中,但不会construct)。

例:

var Foo = function() {
    console.log("I'm the Foo object");
};
module.exports = Foo;

然后,要使用它,我将执行以下操作:

var Foo = require('foo');

var foo = new Foo();

请注意,导出的函数不是构造的。

我本可以做到:

var foo = require('foo')();

这些方法对我来说似乎都不对(我可能是错的)。

  • 1)这样做很常见吗?还是应该导出执行的函数?

无论如何,这个介绍是了解我应该如何使用require函数。

例如,如果我有一个 Foo 对象,它依赖于 Bar,我有两种方法可以做:

服务地点

var Foo = function() {
   var Bar = require('bar')();
   Bar.doSomethingAwesome();
};
module.exports = Foo;

或者我可以做:

依赖注入

var Foo = function(bar) { 
   bar.doSomethingAwesome();
};
module.exports = Foo;
// And at a latter time
var foo = require('foo')(require('bar')); /// eurk

我显然知道这是两件不同的事情,有不同的目的。

  • 2)但是我想知道在JS中常见的/正确的方法是什么,是否有任何普遍认可的规则?

Browserify允许你用模块编程,没有更多。它本身并不是真正的 DI 容器或服务定位器,尽管您可能可以使其像一个容器或服务定位器一样工作。

所以这样做是完全可以的:

var Foo = require('foo');
var foo = new Foo();

在这种情况下,只需将所有 require 调用放在文件的顶部是有意义的,就像在 C# 中使用 using 或在 Java 中对import所做的那样。我个人不会分散require电话,因为对可读性没有多大帮助。

您还可以导出不再需要更新的实例,只要它适合您想要执行的操作(在这种情况下module.exports = Foo()会导致单例)。

另请参阅此相关问题:使用 RequireJS 进行依赖注入

rewire库为 Node.js 提供模块注入。在这个Github问题中已经讨论并提出了一些解决方案来支持浏览器化。

项目自述文件中的使用示例:

var myModule = rewire("../lib/myModule.js");
myModule.__set__("fs", fsMock); // set private variable

使用 Browserify,这样你就可以像 node 一样从浏览器中要求 npm 包。然后你可以使用天气.js或者要求它,然后以任何你喜欢的方式注入它。

最新更新