所以我一直在玩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或者要求它,然后以任何你喜欢的方式注入它。