2017-05-19 23 views
0

当我带领你完成引发我的问题的过程时,忍受着我。JavaScript类是否可以接受节点模块?

我工作在一个节点应用CLI和我使用对象使用该模式来封装我的业务逻辑:

// my-project/lib/widget/myobject.js 

var MyObject = function(x) { 
    this.x = x; 
}; 

MyObject.prototype.getX = function() { 
    return this.x; 
}; 

module.exports = MyObject; 

我还测试这些对象:

// my-project/test/lib/widget/myobject.spec.js 

var MyObject = require('../../../lib/widget/myobject.js'); 

describe('MyObject', function() { 
    ... 
}); 

有一次,我对我选择的命名和目录结构感到不满。在重写相对路径时,我发现自己在几个spec文件中对这些父目录引用(..)进行了枯燥的计数。我认为必须有一种更简单的方法来引用包含这些对象定义的根目录。

我发现here的建议之一,建议“将特定于应用程序的模块放入node_modules中”。

现在,据我了解模块,他们是我从npm下载并在我的项目中使用的软件包。当我打电话给require时,它们包含一个有用的东西库,其中包含一个导出给我的API。这不是我如何查看专门为我的应用程序的内部使用而构建的简单单一用途类。

如果你一直坚持到目前为止,谢谢!这里是我的问题:

如何让我的应用程序的内部更“模块化”,以便正确遵循Node模块系统的意图,同时保持面向对象?

+0

在处理对象的节点中,我通常只是从资产文件夹中存储和导入它们。这很大程度上取决于偏好,构建工具和部署,这超出了我的专业知识范围。 node_modules方法或多或少只是一个资产文件夹,您可以在其中导入静态资产,并且可以正常工作(但我不建议将npm资源与您自己构建的资产混合)。 –

+0

你说得对,它就像是一个静态的资产文件夹,但它具有作为Node查找模块的默认位置的额外好处。这对我来说是平局。我会使用require('myobject')而不是require('../../../ lib/widget/myobject.js')。我的理解正是你刚才提到的:将公共模块与私有模块混合在一起。这就是我的问题。我基本上在问:“我是这么做的吗?还是有其他一些会使这些对象更有意义的惯例?”混合感觉真的很烂。 – jkeeler

回答

0

我不知道如何适合这对生产或你打算分发模块,但在你的主文件,你可以补充一点:

process.env.NODE_PATH = __dirname; 
require('module').Module._initPaths(); 

这将让你总是需要相对于文件夹模块包含你的主文件。即如果你有一个文件:

library/some_file.js 

然后tests/some_other_file.js你可能只是做:

require('library/some_file'); 

或者,你可以在你的主文件里加入一种替代方案:

global.__base = __dirname + '/'; 

和那么在你的其他模块需要使用:

var MyObject = require(__base + 'my-project/lib/widget/myobject'); 
+0

是的!我也发现了这些解决方案。我立即打折了NODE_PATH解决方案,因为我提供的链接中有一条语句:“node和browserify都支持,但不鼓励使用$ NODE_PATH。” – jkeeler

+0

(纠正我,如果我错了。)我也不认为这个解决方案与我的测试跑步者。由于spec文件只需要带有类定义的js文件,所以我不会从main.js获得路径。 – jkeeler

相关问题