如何创建一个带有附加到对象的方法的 npm 包?

How to create a npm package with a method attached to the object?

我正在尝试创建一个 npm 包,可能需要像这样:

var Greeks = require('greek-mythology-data');
var gods = new Greeks('gods');
gods.sortByName();

但我只做到了这样的事情:

var Greeks = require('greek-mythology-data');
var gods = require('greek-mythology-data/data/gods.json');
gods = new Greeks(gods);
console.log(gods.sortByName());

到目前为止我有这个

var all = require('./data/greeks.json');
var demigods = require('./data/demigods.json');
var generalDeities = require('./data/general-deities.json');
var giants = require('./data/giants.json');
var gods = require('./data/gods.json');
var kings = require('./data/kings.json');
var primordialDeities = require('./data/general-deities.json');
var seaDeities = require('./data/sea-deities.json');
var titans = require('./data/titans.json');

function Greeks(collection) {
  this.collection = collection;

 /* return {
    all: all,
    demigods: demigods,
    generalDeities: generalDeities,
    giants: giants,
    gods: gods,
    kings: kings,
    primordialDeities: primordialDeities,
    seaDeities: seaDeities,
    titans: titans,
  }*/
}

Greeks.prototype.sortByName = function() {
  var compare = function(a, b) {
    if (a.name < b.name)
      return -1;
    if (a.name > b.name)
      return 1;
    return 0;
  };

  return this.collection.sort(compare);
};

module.exports = Greeks;

我觉得我现在的解决方案不是很方便。

我采取的方法正确吗?

为了兼容性,我也在 es5 中编写了它,但我应该将它移动到 ES6/ES2015 并使用 import/export 和 类 吗?

您可以在具有 Greeks 函数的同一文件中使用像这样的常规 module.exports 语法。

module.exports = {
    Greeks,
    gods,
    kings
    // ... all other objects
}

然后在你的主文件中像这样使用它

var GreekMyth = require('greek-mythology-data');
var gods = new GreekMyth.Greeks(GreekMyth.gods);
console.log(gods.sortByName());

可以改进事物的命名

您似乎在寻找

const collections = {
    all: all,
    demigods: demigods,
    generalDeities: generalDeities,
    giants: giants,
    gods: gods,
    kings: kings,
    primordialDeities: primordialDeities,
    seaDeities: seaDeities,
    titans: titans,
};
function Greeks(name) {
    this.collection = collections[name];
}

虽然直接在模块接口上公开集合可能比使用字符串引用它们更好。顺便说一句,在 ES6 中你应该能够将上面的内容简化为

import * as collections from './data';