2021-07-12-带着问题看源码3-NodeRed的节点模块如何被加载与使用

NodeRed中的节点模块由一个个软件包组成,NodeRed使用了Node的包管理。

1. 包管理#

包管理器又称软件包管理系统,它是在电脑中自动安装、配制、卸载和升级软件包的工具组合,在各种系统软件和应用软件的安装管理中均有广泛应用。

通常在代码管理平台,追踪代码修正与版本的迭代;包管理平台负责安装包的管理与维护。

1.1. 包管理的意义#

  1. 将功能模块化,封装为可以复用的按规则配置的模块
  2. 相同的东西不必重复去造轮子
  3. 开源的包管理可以从中学习开发思想
  4. 私有的包管理平台可以在一定区域内使用,既保证了复用,也保证了隐私与安全
  5. 开发者可以从软件包的分发中获取分成,进一步促进包平台的发展

1.2. CommonJS#

CommonJS 是以在浏览器环境之外构建 javaScript 生态系统为目标而产生的写一套规范,主要是为了解决 javaScript 的作用域问题而定义的模块形式,可以使每个模块它自身的命名空间中执行,该规范的主要内容是,模块必须通过 module.exports 导出对外的变量或者接口,通过 require() 来导入其他模块的输出到当前模块的作用域中;目前在服务器和桌面环境中,node.js 遵循的是 CommonJS 的规范;CommonJS包规范包括包结构和包描述文件。

1.3. NPM#

NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具。开发者将开发好的软件包发布到公有、私有registry,即可通过工具来安装、升级、删除软件包。

2. NodeRed中的节点模块管理使用#

NodeRed节点对应于npm的包,同样通过npm 相关指令进行安装卸载等。

2.1. 节点模块的开发#

  1. 官方节点开发说明
    Creating Nodes

    2.2. 节点模块的安装#

    NodeRed支持多种方式的节点模块安装:
  2. 从操作系统进入到nodered目录,使用npm install 指令安装模块。
  3. 通过NodeRed网页,右上脚菜单=》节点管理 =》节点/安装界面,选择要安装的节点模块,进行联网安装
  4. 通过NodeRed网页上传tgz包安装(NodeRed版本要求>=1.2)

    2.3. 节点模块的卸载#

  5. 从操作系统进入到nodered目录,使用npm remove 指令卸载模块。
  6. 通过NodeRed网页,右上脚菜单=》节点管理 =》节点/安装界面,选择要卸载的节点模块,进行卸载

    2.4. 节点模块的更新#

  7. 从操作系统进入到nodered目录,使用 npm update 指令更新模块及所依赖的包。
  8. 通过NodeRed网页,右上脚菜单=》节点管理 =》节点/安装界面,选择要更新的节点模块,当有模块更新时,界面会提示最新的节点模块版本号,更新即可。

3. 功能实现的参与者#

npm命令#

  1. 换npm源

    1
    2
    3
    npm config set registry https://registry.npmjs.org/
    npm config set registry https://registry.npm.taobao.org
    npm config get registry
  2. npm发布

    1
    npm login
  3. npm删除

    1
    npm unpublish --force xxxx
  4. npm安装

    1
    npm install -g xxxx --registry=https://registry.npm.taobao.org
  5. 更改npm安装目录

    1
    2
    npm config set prefix D:\npm\npmglobal
    npm config set cache D:\npm\npmglobal-cache --global
  6. npm私有仓库 verdaccio

npm私有仓库verdaccio在docker环境下的配置

child_process#

原文链接
在node中我们常常需要在主进程之外新建一个子进程来提高程序的运行效率,这时就需要使用到node中的child_process模块。child_process 模块提供了衍生子进程的功能,在默认情况下,父进程和子进程之间会建立stdin,stdout,stderr三个管道,数据能够以非阻塞的方式流动。

  • child_process 子进程
  • 子进程使用场景
  • 计算密集型系统
  • 前端构建工具利用多核 CPU 并行计算,提升构建效率,如webpack
  • 进程管理工具,如:PM2 中部分功能
  • 注意
    有些程序会缓存I/O,导致数据不能够及时更新,但是不会阻塞node
    child_process 提供了一些同步和异步的方法来替代child_process.spawn和child_process.spawnSync

4. 功能分阶段描述#

installer:packages/node_modules/@node-red/registry/lib/installer.js
registry_registry:packages/node_modules/@node-red/registry/lib/registry.js
registry:packages/node_modules/@node-red/registry/lib/index.js
child_process:

%% 配置
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#FFFFFF'}}}%%
sequenceDiagram
autonumber

%%实现
title: NodeRed中的节点模块管理-初始阶段

participant 其他
participant installer
其他 -->> installer: checkPrereq 验证当前npm运行环境(判断Node.js版本)
%% 配置
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#FFFFFF'}}}%%
sequenceDiagram
autonumber

%%实现
title: NodeRed中的节点模块管理-运行阶段

participant 其他
participant installer

其他 -->> installer: installModule,安装模块的指定版本
installer -->> registry_registry: 查找是否有已注册的模块(以确定是更新还是安装)
installer -->> child_process: 执行npm指令,npm ["install","--no-audit","--no-update-notifier","--no-fund","--save","--save-prefix=~","--production","node-red-contrib-actionflows@2.0.4"] 
installer-->>registry:addModule,更新内存中的模块并向registry注册模块

其他 -->> installer: uninstallModule,删除模块
installer -->> registry_registry: removeModule,删除内存中模块及节点模板
installer -->> child_process: 执行npm指令,npm ['remove','--no-audit','--no-update-notifier','--no-fund','--save',module] 

其他 -->> installer: installTarball, 安装tgz包,获取Tar包信息,验证Tar包
installer -->> installModule: 走模块安装流程

5. 功能使用场景#

  1. 与其他模块关系
    模块较独立,依赖library模块,提供节点模块的维护:安装、删除、更新;与NodeRed-client通讯。

  2. 接口

名称 功能
checkPrereq 验证当前npm运行环境(判断Node.js版本)
installModule 安装模块的指定版本
uninstallModule 删除模块

2021-07-12-带着问题看源码3-NodeRed的节点模块如何被加载与使用

https://blog.buqia.fun/2022/02/17/2021-07-12-带着问题看源码3-NodeRed的节点模块如何被加载与使用/

作者

lxmuyu

发布于

2022-02-17

更新于

2022-03-11

许可协议