CommonJS模块的模式?

时间:2017-12-21 01:26:07

标签: javascript node-modules commonjs

我一直在做一些有趣的练习"升级你的编码" site,Exercism.io,他们使用CommonJS样式模块作为代码示例并使用Jasmine进行测试。我一直认为模块是一个我不想处理的麻烦,但在这些一口大小的块中,看起来它们在我的单页应用程序中开始使用会非常有用。因此,我一直在谷歌搜索并搜索Github使用CommonJS模块的一些好样本 - 但仍然没有找到一个详细解释主要模式是什么,以及它们如何不同的样本。例如,我提交的一个答案如下:

var HelloWorld = function () {};

HelloWorld.prototype.hello = function () {
  return 'Hello, World!'
};

module.exports = HelloWorld;

但另一个看起来像这样

var Bob = function () {
    this.hey = function (input) {
        input = input.split('');
        if (input.indexOf('!') >= 0) {return 'Whoa, chill out!'}
        if (input.indexOf('?') >= 0) {return 'Sure.'}           
        return 'Whatever.'
    };

}

module.exports = Bob;

具体来说,我想知道在父定义中嵌套一个函数与Bob hey()函数之间的区别是什么,而不是HelloWorld hello()使用 prototype <的方式/ strong>相反。

1 个答案:

答案 0 :(得分:2)

首先,您提供的两个函数作为示例彼此完全不同,并且具有不同的用途。

根据您所拥有的代码,您调用它们的方式也不正确。

对于您的Bob示例,您所做的只是为变量分配函数。要调用它,您只需执行Bob()。如果您执行Bob.hello(),则会收到错误。

另一方面,HelloWorld不仅仅是一个函数,嗯..因为你声明它是一个空函数,如果你HelloWorld()它会调用它。但是你定义了hello作为它的原型函数,你可以直接调用它,你必须做HelloWorld.prototype.hello()。我认为这些主要用于改变现有对象或函数的行为。

你在问什么是最有效的编写模块的方法,但实际上并没有正确的答案。所有模块都是一段代码,可以被其他文件导出和重用。无论你喜欢什么,它们都可以是函数,对象,简单变量!

所以基本上你可以做所有这些:

// moduleThatExportsANumber.js
module.exports = 1

// moduleThatExportsAnObject.js
module.exports = {}

// moduleThatExportsAFunction.js
module.exports = function () { return 'say somethign!'}

// main.js Lets call all the modules!
const number = require('./moduleThatExportsANumber)
const object = require('./moduleThatExportsAnObject)
const function = require('./moduleThatExportsAFunction)

console.log(number) // 1
console.log(object) // {}
console.log(function) // function () { return 'say somethign!'}
console.log(function()) //say somethign!

关于模块的全部内容只是简单地将文件写入文件,导出那些东西,在CommonJS的情况下通过module.exports = [whatever you are exporting]完成,然后导入,对于CommonJS是require('./filename')

现在......回到原来的问题,你的备忘单。不幸的是,我不知道任何CommonJS,here是一篇关于CommonJS模块系统的博客文章,here是一个你可能喜欢的JavaScript版本。