如何创建 Node.js 模块

作者选择了 开放式互联网 / 自由言论基金作为 写给捐赠计划的一部分接受捐款。

介绍

在 Node.js 中,一个 module 是外部应用程序可以使用的 JavaScript 函数和对象的集合,描述一个代码作为一个模块的描述不太指代码是什么,更指它所做的事情 - 任何 Node.js 文件或文件集合可以被视为一个模块,如果其函数和数据可以用于外部程序。

因为模块提供了在许多更大的程序中可以被再利用的功能单元,它们使您能够创建具有复杂度的松散组合的应用程序,并打开了您与其他开发者共享代码的门. 能够写入导出有用函数和数据的模块, 您就可以为更广泛的Node. 这使得创建模块成为Node.js开发者的基本技能.

在本教程中,您将创建一个 Node.js 模块,该模块建议 Web 开发人员应该在设计中使用什么颜色。您将通过将颜色存储为数组来开发该模块,并提供一个功能来随机检索一个。

前提条件

  • 联合国 您需要安装在您的开发环境上的 Node.js 和 npm 。 此教程使用101.7. 要在 macOS 或 Ubuntu 18.04 上安装此功能,请遵循 [如何在 macOS (https://andsky.com/tech/tutorials/how-to-install-node-js-and-create-a-local-development-environment-on-macos 上安装节点并创建本地开发环境] (https://andsky.com/tech/tutorials/how-to-install-node-js-on-ubuntu-18-04) 或 [如何在 Ubuntu 18.04 (https://andsky.com/tech/tutorials/how-to-install-node-js-on-ubuntu-18-04 上安装节点.js] 的 ** 部分使用 PPA** 。 通过安装节点.js,您也会安装npm;此教程使用6.11.3版本.
  • 联合国 您也应该熟悉 package.json 文件,使用 npm 命令的经验也是有益的。 为了获得这种经验,遵循如何使用带有npm和pack.json的节点js模块,特别是步骤1——创建`package.json' 文件
  • 联合国 这也将有助于对节点(Read-Evaluate-Print-Loop)感到自在.js REPL(读取评价-Print-Loop). 你会用这个测试你的模块。 如果您需要这方面的更多信息,请阅读我们关于如何使用节点.js REPL的指南。 .

第1步:创建一个模块

此步骤将引导您创建您的第一个 Node.js 模块. 您的模块将包含一系列颜色,并提供一个函数以随机获取一个。

首先,您将决定您将在模块中存储的颜色数据。每个颜色将是一个包含人类易于识别的名称属性的对象,以及一个包含 HTML 颜色代码的字符串的代码属性。HTML 颜色代码是六位数的六位数数字,允许您在网页上改变元素的颜色。您可以通过阅读本文阅读更多关于 HTML 颜色代码的信息。

然后,您将决定您希望在模块中支持哪些颜色。您的模块将包含一个名为allColors的数组,该数组将包含六种颜色。

在您的终端中,创建一个名为颜色的新文件夹,并进入它:

1mkdir colors
2cd colors

初始化 npm 以便其他程序可以在教程中稍后导入此模块:

1npm init -y

如果这是你想要发布到 npm 的模块,你会用相关数据来回答所有这些提示,如在 如何使用 Node.js 模块与 npm 和 package.json中解释)。

在这种情况下,你的输出将是:

 1[secondary_label Output]
 2{
 3  "name": "colors",
 4  "version": "1.0.0",
 5  "description": "",
 6  "main": "index.js",
 7  "scripts": {
 8    "test": "echo \"Error: no test specified\" && exit 1"
 9  },
10  "keywords": [],
11  "author": "",
12  "license": "ISC"
13}

现在,打开一个命令行文本编辑器,如nano,并创建一个新的文件,作为您的模块的入口点:

1nano index.js

你的模块会做一些事情. 首先,你会定义一个‘颜色’(https://andsky.com/tech/tutorials/understanding-classes-in-javascript)。你的‘颜色’类将以其名称和HTML代码进行实例化。

1[label ~/colors/index.js]
2class Color {
3  constructor(name, code) {
4    this.name = name;
5    this.code = code;
6  }
7}

现在你已经有了颜色的数据结构了,可以将一些实例添加到你的模块中,然后在你的文件中写下以下突出的 array:

 1[label ~/colors/index.js]
 2class Color {
 3  constructor(name, code) {
 4    this.name = name;
 5    this.code = code;
 6  }
 7}
 8
 9const allColors = [
10  new Color('brightred', '#E74C3C'),
11  new Color('soothingpurple', '#9B59B6'),
12  new Color('skyblue', '#5DADE2'),
13  new Color('leafygreen', '#48C9B0'),
14  new Color('sunkissedyellow', '#F4D03F'),
15  new Color('groovygray', '#D7DBDD'),
16];

最后,输入一个 函数,随机从您刚刚创建的 allColors 系列中选择一个项目:

 1[label ~/colors/index.js]
 2class Color {
 3  constructor(name, code) {
 4    this.name = name;
 5    this.code = code;
 6  }
 7}
 8
 9const allColors = [
10  new Color('brightred', '#E74C3C'),
11  new Color('soothingpurple', '#9B59B6'),
12  new Color('skyblue', '#5DADE2'),
13  new Color('leafygreen', '#48C9B0'),
14  new Color('sunkissedyellow', '#F4D03F'),
15  new Color('groovygray', '#D7DBDD'),
16];
17
18exports.getRandomColor = () => {
19  return allColors[Math.floor(Math.random() * allColors.length)];
20}
21
22exports.allColors = allColors;

导出关键字是指每个 Node.js 模块中可用的全球对象。在其他 Node.js 模块导入时,模块的导出对象中存储的所有函数和对象都被曝光。

当其他模块导入此模块时,allColorsgetRandomColor()都将被曝光并可用于。

保存和退出文件。

到目前为止,您已经创建了一个包含一系列颜色和一个随机返回的函数的模块,您还导出了该模块和函数,以便外部程序可以使用它们。

步骤 2 — 使用 REPL 测试您的模块

在构建一个完整的应用程序之前,请花一点时间确认您的模块正在工作. 在此步骤中,您将使用 REPL 来加载颜色模块. 在 REPL 中,您将拨打getRandomColor()函数,看看它是否像您预期的那样表现。

在同一个文件夹中启动 Node.js REPL:

1node

当 REPL 启动时,您将看到>提示,这意味着您可以输入 JavaScript 代码,将立即进行评估。如果您想了解更多信息,请遵循我们的指南 使用 REPL

首先,输入以下内容:

1colors = require('./index');

在此命令中,‘require()’在其输入点上加载了‘colors’模块. 当您按下‘ENTER’时,您将获得:

 1[secondary_label Output]
 2{
 3  getRandomColor: [Function],
 4  allColors: [
 5    Color { name: 'brightred', code: '#E74C3C' },
 6    Color { name: 'soothingpurple', code: '#9B59B6' },
 7    Color { name: 'skyblue', code: '#5DADE2' },
 8    Color { name: 'leafygreen', code: '#48C9B0' },
 9    Color { name: 'sunkissedyellow', code: '#F4D03F' },
10    Color { name: 'groovygray', code: '#D7DBDD' }
11  ]
12}

REPL向我们展示了颜色的值,即从index.js文件中导入的所有函数和对象.当您使用要求关键字时,Node.js会返回模块的导出对象内的所有内容。

请记住,您在颜色模块中添加了getRandomColor()allColors导出

在提示中,测试getRandomColor()函数:

1colors.getRandomColor();

您将被提示使用随机颜色:

1[secondary_label Output]
2Color { name: 'groovygray', code: '#D7DBDD' }

由于索引是随机的,您的输出可能会有所不同. 现在您已确认颜色模块正在工作,请退出 Node.js REPL:

1.exit

这会让你回到你的终端命令行。

您刚刚确认您的模块使用 REPL 按照预期工作,接下来,您将应用这些概念,并将模块加载到应用程序中,就像您在实际项目中一样。

步骤3 — 将您的本地模块保存为依赖

在 REPL 中测试您的模块时,您使用 relative path 导入了该模块,这意味着您使用了 index.js 文件的位置与工作目录有关,以获取其内容。虽然这样做,通常是更好的编程体验,以其名称导入模块,以便在变更背景时导入不会被打破。

颜色文件夹之外设置一个新的 Node.js 模块. 首先,转到以前的目录并创建一个新的文件夹:

1cd ..
2mkdir really-large-application

现在进入你的新项目:

1cd really-large-application

颜色模块一样,用npm初始化您的文件夹:

1npm init -y

将生成以下package.json:

 1[secondary_label Output]
 2{
 3  "name": "really-large-application",
 4  "version": "1.0.0",
 5  "description": "",
 6  "main": "index.js",
 7  "scripts": {
 8    "test": "echo \"Error: no test specified\" && exit 1"
 9  },
10  "keywords": [],
11  "author": "",
12  "license": "ISC"
13}

现在,安装您的颜色模块,并使用保存旗帜,以便它被记录在您的package.json文件中:

1npm install --save ../colors

您刚刚在新项目中安装了色彩模块,打开package.json文件以查看新的本地依赖:

1nano package.json

您将发现已添加了以下突出的行:

 1[label ~/really-large-application/package.json]
 2{
 3  "name": "really-large-application",
 4  "version": "1.0.0",
 5  "description": "",
 6  "main": "index.js",
 7  "scripts": {
 8    "test": "echo \"Error: no test specified\" && exit 1"
 9  },
10  "keywords": [],
11  "author": "",
12  "license": "ISC",
13  "dependencies": {
14    "colors": "file:../colors"
15  }
16}

离开文件。

颜色模块被复制到你的node_modules目录,请用以下命令检查它:

1ls node_modules

这将产生以下产出:

1[secondary_label Output]
2colors

在这个新程序中使用已安装的本地模块重新打开文本编辑器并创建另一个JavaScript文件:

1nano index.js

您的程序将首先导入颜色模块,然后使用该模块提供的getRandomColor()函数随机选择一种颜色,最后,它将向控制台打印一个信息,告诉用户使用哪种颜色。

在 index.js 中输入以下代码:

1[label ~/really-large-application/index.js]
2const colors = require('colors');
3
4const chosenColor = colors.getRandomColor();
5console.log(`You should use ${chosenColor.name} on your website. It's HTML code is ${chosenColor.code}`);

保存和退出此文件。

您的应用程序现在会告诉用户网站组件的随机颜色选项。

运行此脚本与:

1node index.js

您的输出将类似于:

1[secondary_label Output]
2You should use leafygreen on your website. It's HTML code is #48C9B0

您现在已经成功安装了颜色模块,可以像您项目中使用的任何其他 npm 包一样管理它,但是,如果您在本地颜色模块中添加了更多的颜色和功能,则需要在应用程序中运行npm 更新,才能使用新选项。

步骤4 — 链接本地模块

如果您的本地模块正在开发中,那么不断更新包可能很累。 替代方案是将模块链接起来。 链接一个模块,确保对模块的任何更新立即反映在使用该模块的应用程序中。

在此步骤中,您将将颜色模块链接到您的应用程序,您还将修改颜色模块,并确认其最新的更改在应用程序中工作,而无需重新安装或升级。

首先,卸载本地模块:

1npm un colors

npm 通过使用 symbolic links (或 symlinks) 链接模块,这些链接是指向计算机中的文件或目录的引用。

  1. 创建一个 global link 到模块. npm 将创建一个 symlink 到您的全球 node_modules 目录和您的模块目录之间。 全球 node_modules 目录是您在安装所有全系统的 npm 包的位置(您安装的任何包具有 -g 旗帜)。

首先,通过返回颜色文件夹并使用链接命令创建全球链接:

1cd ../colors
2sudo npm link

一旦完成,你的壳将输出:

1[secondary_label Output]
2/usr/local/lib/node_modules/colors -> /home/sammy/colors

您刚刚在您的node_modules文件夹中创建了一个 symlink 到您的色彩目录。

返回真正的大型应用程序文件夹并链接包:

1cd ../really-large-application
2sudo npm link colors

您将收到类似于以下的输出:

1[secondary_label Output]
2/home/sammy/really-large-application/node_modules/colors -> /usr/local/lib/node_modules/colors -> /home/sammy/colors

<$>[注] :如果你想输入少一点,可以使用ln而不是link

正如输出显示的那样,您刚刚从真正的大型应用程序的本地node_modules目录创建了一个 symlink 到您的全球node_modules中的色彩 symlink,它指向与色彩模块的实际目录。

链接过程已经完成. 运行您的文件以确保它仍然工作:

1node index.js

您的输出将类似于:

1[secondary_label Output]
2You should use sunkissedyellow on your website. It's HTML code is #F4D03F

您的程序功能不受影响. 接下来,测试是否立即应用更新. 在文本编辑器中,在颜色模块中重新打开index.js文件:

1cd ../colors
2nano index.js

现在添加一个函数,选择最佳的蓝色颜色。它不需要参数,并且总是返回allColors数组的第三个项目。

 1[label ~/colors/index.js]
 2class Color {
 3  constructor(name, code) {
 4    this.name = name;
 5    this.code = code;
 6  }
 7}
 8
 9const allColors = [
10  new Color('brightred', '#E74C3C'),
11  new Color('soothingpurple', '#9B59B6'),
12  new Color('skyblue', '#5DADE2'),
13  new Color('leafygreen', '#48C9B0'),
14  new Color('sunkissedyellow', '#F4D03F'),
15  new Color('groovygray', '#D7DBDD'),
16];
17
18exports.getRandomColor = () => {
19        return allColors[Math.floor(Math.random() * allColors.length)];
20        }
21
22exports.allColors = allColors;
23
24exports.getBlue = () => {
25  return allColors[2];
26}

保存并退出文件,然后在真正的大型应用程序文件夹中重新打开index.js文件:

1cd ../really-large-application
2nano index.js

调用新创建的 getBlue() 函数,并打印颜色属性的句子. 将这些陈述添加到文件的末尾:

1[label ~/really-large-application/index.js]
2const colors = require('colors');
3
4const chosenColor = colors.getRandomColor();
5console.log(`You should use ${chosenColor.name} on your website. It's HTML code is ${chosenColor.code}`);
6
7const favoriteColor = colors.getBlue();
8console.log(`My favorite color is ${favoriteColor.name}/${favoriteColor.code}, btw`);

保存和退出文件。

代码现在使用新创建的 getBlue() 函数。

1node index.js

你会得到这样的输出:

1[secondary_label Output]
2You should use brightred on your website. It's HTML code is #E74C3C
3My favorite color is skyblue/#5DADE2, btw

您的脚本能够在颜色模块中使用最新的功能,而无需运行npm更新

当您写出更大,更复杂的应用程序时,考虑如何将相关代码组合成模块,以及如何设置这些模块. 如果您的模块只能被一个程序使用,它可以留在同一个工程内,并通过相对路径被引用. 如果您的模块日后会被单独共享或存在于一个与您现在所研究的项目截然不同的位置,安装或连接可能更可行. 正在积极开发的模块也受益于连接的自动更新。 如果模块没有在积极开发中,使用`npm安装'可能是比较容易的选择.

结论

在本教程中,您了解到 Node.js 模块是一个具有其他程序可使用的函数和对象的 JavaScript 文件,然后您创建了一个模块,并将您的函数和对象附加到全球导出对象,以使它们可用于外部程序。

现在你知道如何创建模块,想想你想写的程序类型,并将其分解成各种组件,保持每个独特的活动和数据集在自己的模块中。你写模块的实践越多,你在学习旅程中写质量的Node.js程序的能力就越好。

Published At
Categories with 技术
comments powered by Disqus