4

所以我一直在玩 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 函数。

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

服务地点

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 中常见/正确的做法是什么,是否有任何公认的规则?
4

3 回答 3

0

Browserify 允许您使用模块进行编程,仅此而已。它本身并不是真正的 DI 容器或服务定位器,尽管您可以让它像一个一样工作。

所以这样做非常好:

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

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

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

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

于 2013-12-01T15:24:05.790 回答
0

rewire库为 Node.js 提供模块注入。在这个 Github 问题中讨论并提出了几个解决方案来支持 browserify。

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

var myModule = rewire("../lib/myModule.js");
myModule.__set__("fs", fsMock); // set private variable
于 2015-02-04T14:12:59.343 回答
0

使用Browserify ,这样您就可以像 node.js 一样从浏览器中请求 npm 包。然后你可以使用Wea​​ther.js或 require 它,然后以你喜欢的任何方式注入它。

于 2015-06-27T13:17:03.070 回答