使用自己的Node.js模块

时间:2018-07-14 12:36:54

标签: javascript node.js

我正在尝试在node.js中创建自己的模块,以后可以使用。

出于学习目的,不幸的是,我不知道如何正确使用它,因此创建了一个javaScript类来实践这种东西。

我的课:

class Taschenrechner {
 let plus = (param1, param2) => {
   return param1 + param2;
  }

 let minus = (param1, param2) => {
   return param1 - param2;
  }  

 let mal = (param1, param2) => {
   return param1 * param2;
  }

 let geteilt = (param1, param2) => {
   return param1 / param2;
  }

 let potenz = (param1, param2) => {
   return param1 ** param2;
  }
}

所以只需说说我想导出所有这些功能,以便可以像这样使用它们:

let calculator = require("taschenrechner");
calculator.add(4, 4);

类似的东西...(我仍然是菜鸟,如你所见:D)

官方节点模块使用类似.exports的东西,我是否可以/也应该将其用于自己的代码?

3 个答案:

答案 0 :(得分:5)

let中不允许使用

class。使用Babel和ES.next class fields,可能是:

class Taschenrechner {
  static plus = (param1, param2) => {
   return param1 + param2;
  }
  ...
}

在ES6中,可能是:

class Taschenrechner {}
Taschenrechner.plus = (param1, param2) => {
  return param1 + param2;
}
...

Taschenrechner在这里仅充当命名空间。 Taschenrechner不应该是一个类,因为它不使用可以从中受益的状态或其他类特征。

模块应该在JS中充当名称空间。对于CommonJS模块,它应该是:

exports.plus = (param1, param2) => {
  return param1 + param2;
};
...

使用ES模块:

export const plus = (param1, param2) => {
  return param1 + param2;
};
...

答案 1 :(得分:3)

如果要使用class,则不会在其中使用let。这不是定义类的方法。但是我不认为您还是要使用类,因为您必须实例化一个类,这里​​没有必要。最好只定义一个对象。

是的,您只需要使用module.exports来创建您的模块。像这样:

const Taschenrechner = {
  plus: (param1, param2) => {
    return param1 + param2;
  },
  minus: (param1, param2) => {
    return param1 - param2;
  }
};

module.exports = Taschenrechner;

但是,要加载模块:除非您实际上是通过npm加载模块,否则必须包含某种路径。像这样:

let calculator = require("./taschenrechner");
calculator.plus(4, 4);

注意,假设您不需要.js。但是您需要使用类似./的东西(也就是说,它与调用它的脚本位于同一目录中)。或一些等效的相对或绝对路径。

答案 2 :(得分:2)

如果只需要模块名称(require("taschenrechner")),NodeJS就会在node_modules目录中搜索该模块。因此,这是一种导入在npm registry中发布的私有或公共NodeJS包(库)的机制。

如果要这样做,请参阅NPM文档中的“如何Publish & Update a Package”。 How to Create Node.js Modules部分介绍了如何定义模块。

如果您不想发布您的软件包,则可以始终使用.exports机制来要求您的模块。只需在模块(文件)名称前写一个路径。如果文件位于同一目录中,则示例:require("./taschenrechner")