当前位置: 首页 > 编程日记 > 正文

npm包开发测试与发布

NPM 包开发测试与发布

  • NPM 包开发测试与发布
    • 引言
    • 1. 开发步骤
      • 1.1. 项目创建
      • 1.2. 工具类功能实现
      • 1.3. ts文件编译
    • 2. npm包本地测试
      • 2.1. 将npm包文件引入项目
      • 2.2. npm包功能测试
    • 3. 发布
    • 4. 注意事项
    • 我的NPM包

NPM 包开发测试与发布

引言

在项目开发过程中,有时会遇到在多个项目中使用到具有相同或类似功能的工具方法,这时就需要将这些工具方法代码块在多个项目中分别定义,不方便统一管理。

针对以上情况,可以将这些公用的工具方法放入一个单独的项目中,打包发布到 NPM 上,在项目中通过npm包引用的方式使用工具方法。


下面简要记录一下 NPM 工具包开发、测试与发布流程。

1. 开发步骤

1.1. 项目创建

Step1: 首先创建一个空项目,使用 Webstorm或者VSCode 打开项目或者使用命令切换至项目根目录,创建 src 文件夹和 index.ts 文件。

其中 src 目录下存放工具类/工具方法的源码文件,index.ts 文件内容用于将工具类/工具方法导出,以便在其它模块导入使用。

Step2: 接着在项目中打开终端使用 git init 命令和 npm init 命令初始化项目的 git 信息和 npm 信息。

如果想将包发布成有作用域的包,使用如下命令:

npm init --scope=@my-username

也可以在使用 npm init 命令生成 package.json 文件后手动指定包名及其它信息。


下面进行工具类/工具方法的功能实现。

1.2. 工具类功能实现

Step1:src/ 目录下创建 ts 文件,在 ts 文件中编写使用到的工具类或者工具方法,编写完毕后使用 export 将类或者方法导出,以供其它模块使用。示例如下。

src/ArrayUtils.ts 文件内容如下:

/*** 检验参数是否为数组,如果是,则原样返回,否则返回空数组* @param arr*/
export function arrayCheck(arr: any): Array<any> {if (Object.prototype.toString.call(arr) === '[object Array]') {return arr;} else {return [];}
}export class ArrayUtils {static arrayCheck(arr: any): Array<any> {return arrayCheck(arr);}
}

Step2: 在 index.ts 文件中使用exportsrc/ 目录下编写好的 ts 文件内容全部导出。示例如下。

index.ts 文件内容

export * from './src/ArrayUtils';

其它工具类或工具方法文件,同理,在 src/ 目录下创建文件编写好代码后,使用 export 导出,在 index.ts 文件中使用 exportsrc/ 目录下工具类文件内的类和方法全部导出,供其它模块使用。

工具类代码编写完毕后,下面对代码进行编译。


1.3. ts文件编译

在项目终端执行 npm i typescript -D 命令安装 typescript 依赖。

在项目根目录下创建 tsconfig.json 文件,配置 ts 文件的编译选项。

配置示例如下:

{"compilerOptions": {"baseUrl": "./","module": "es6","target": "es2020","allowJs": false,"declaration": true,"outDir": "./dist","strict": true},"exclude": ["node_modules"],"include": ["index.ts","src/*"]
}

配置项含义:

  • baseUrl:模块解析的基准目录。
  • module:指定生成哪个模块系统的代码。【这里需要提前了解不同模块系统之间的异同】
  • target:指定ECMAScript目标版本。
  • declaration:生成相应的 .d.ts文件。
  • outDir:指定编译文件的输出路径。
  • include:指定需要编译的文件。
  • strict:启用所有严格类型检查选项。

更多配置选项信息,请查阅 TypeScript 配置选项

配置完成后,在终端使用tsc命令将需要编译的ts文件编译成对应的js文件和.d.ts文件。

执行编译命令后,会生成编译文件。项目文件结构如下:
在这里插入图片描述
编译完毕后,修改 package.json 文件中的 main 属性值,让其指向编译后的 index.js 文件。

{"name": "ts-utils","version": "1.0.0","description": "ts-utils","main": "./dist/index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"repository": {"url": ""},"author": "","license": "ISC","devDependencies": {"typescript": "^4.6.3"}
}

进行到这一步,下面就可以在本地进行NPM包的测试了。


2. npm包本地测试

以下NPM包开发项目称为 项目A ,引用npm包的测试项目称为 项目B

2.1. 将npm包文件引入项目

两种测试方式,具体介绍如下:

第一种:使用npm link命令关联依赖包使用

a. 在 项目A 的根目录下使用 npm link 命令将 npm包模块注册到全局,在全局的node_modules目录下会出现当前包所在项目的快捷方式引用。

E:\PersonalProject\ts-utils>npm link
audited 1 package in 1.121s
found 0 vulnerabilitiesC:\Users\zhang\AppData\Roaming\npm\node_modules\ts-utils -> E:\PersonalProject\ts-utilsE:\PersonalProject\ts-utils>

b. 在 项目B 的根目录下使用 npm link package-name 命令将包关联到项目中,然后正常使用即可。

E:\PersonalProject\tsom-login>npm link ts-utils
E:\PersonalProject\tsom-login\node_modules\ts-utils -> C:\Users\zhang\AppData\Roaming\npm\node_modules\ts-utils -> E:\PersonalProject\ts-utilsE:\PersonalProject\tsom-login>

注意:项目Bpackage.json 文件中加入依赖包,例如在dependencies项中加入以下依赖:

"ts-utils": "1.0.0"

此处的包名和版本号对应 npm 包中 package.json 中定义的包名和版本号。

提示图标 如果不加此依赖项,会出现包无法引入,报错的情况。

测试没问题后,在 项目A 的根目录下使用 npm unlink 命令解除项目与全局的关联。在 项目B 的根目录下使用 npm unlink package-name 命令解除项目与本地npm包的关联。

第二种:复制 npm包 整个文件夹到 项目Bnode_modules 目录下,在 package.json 中添加依赖项。

2.2. npm包功能测试

支持直接使用方法名称调用对应方法

import { arrayCheck } from 'ts-utils';console.log(arrayCheck(undefined));     // []
console.log(arrayCheck([]));            // []

也可以使用类名.方法名调用

import { ArrayUtils } from 'ts-utils';console.log('arrayCheck ==? ', ArrayUtils.arrayCheck(undefined));   // []
console.log('arrayCheck ==? ', ArrayUtils.arrayCheck([1, 2, 3]));   // [1, 2, 3]

3. 发布

使用 npm login 命令,输入用户名密码登录npm。

使用 npm publish 命令发布。

如果 npm 包作为有作用域的包进行发布,请使用如下命令:

npm publish --access public

4. 注意事项

发布之前到 npm 网站上确定一下 npm 包名是否已被其它用户使用,如果被占用,请更换。

可以将包名换成类似 @scope/package-name 的形式,将其作为一个有范围的公共包进行发布。


我的NPM包

@zhg-x/ts-utilshttps://www.npmjs.com/package/@zhg-x/ts-utils


相关文章:

Jquery php 点击td变成input,修改后失去焦点发送数据

html部分 <Td><?php echo $row[bigclassid]?></Td> <td height"25" width"241" class"bigclassname"><?php echo $row[bigclassname]?></a></td> Js部分 <script> /**//* * 说明&#xff1…

美元加息怎么“剪羊毛”

我国为什么把美元储备看的如此重要? 我国需要一定的美元储备&#xff0c;不敢把美元随便花出去!1998年亚洲金融危机&#xff0c;东南亚国家为什么抵抗不过对冲基金&#xff0c;就是因为他们手里的美元储备太少&#xff0c;如果你手里美元多&#xff0c;就可以放出美元&#xf…

浅谈企业IT应用的访问方式之:乱想

近来手上的几大块事情&#xff0c;算是大头朝下了。后面可能更多是跟公司的最终用户打交道&#xff0c;一套完整的应用服务体系&#xff0c;不光只是服务器平台的搭建。更重要的是如何让用户觉得确实给他们带来了帮助。 在非洲的一段经历让我们严重认识到一点&#xff0c;其…

java中的基本用法

java中的基本用法 关键字&#xff1a;专门用途的字符串 所有java关键字都是小写英文标识符 java常量 java变量 ■ 作用域&#xff1a;起作用的区域■ 使用前必须先声明&#xff0c;在赋值。使用变量名访问这块区域java程序执行过程 java变量的分类 ■ 局部变量■ 成员变量■…

JavaScript中双叹号(!!)和单叹号(!)

转自&#xff1a;JavaScript中双叹号(!!)作用 经常看到这样的例子&#xff1a; var a&#xff1b; var b!!a; a默认是undefined。!a是true&#xff0c;!!a则是false&#xff0c;所以b的值是false&#xff0c;而不再是undefined&#xff0c;也非其它值&#xff0c;主要是为后续判…

git 初次push

1、本地仓库与远程仓库第一次同步时&#xff0c;一直同步不上 最后 git status ,发现有两个文件没提交 提交后再push即可 2、如果不行&#xff0c;再看一下其他情况 转载于:https://www.cnblogs.com/sanhao/p/10681919.html

简单是可靠的先决条件

2010年4月编程语言排名&#xff0c;C语言重回第1宝座&#xff0c;不禁令人感叹C语言的生命力。 记得有人在几年前发表了一篇C语言已经死了&#xff0c;5个需要忘却它的理由&#xff0c;其后有人发表驳“C语言已经死了”&#xff0c;又有人发表也驳"驳C语言已经死了" …

帮朋友招聘赴北京微软ASP.NET开发工程师

职位要求&#xff1a;1. 3年以上ASP.NET开发经验。2. 有过大型门户网站开发经验。3. 精通ASP.NET WEB开发、Ajax技术&#xff0c;有良好的代码编写习惯。4. 能够熟练运用MVC框架。有意向的朋友可以将简历发到我邮箱&#xff1a;fanmenglifemicrosoftservices.com.cn转载于:http…

xx.xib: error: Illegal Configuration: Safe Area Layout Guide before iOS 9.0报错问题解决

之前是用xcode8.3.3创建的工程最近升级到Xcode9.0 遇见了这个问题 在Xcode 9.0以上 新建xib文件会报错 xx.xib: error: Illegal Configuration: Safe Area Layout Guide before iOS 9.0 是因为在iOS 11上安全距离的变化引起的解决办法如下图&#xff1a;&#xff08;以UITableV…

LuoguP2617 Dynamic Rankings (动态主席树学习理解)

题目地址 题目链接 题解 动态主席树的板子题。动态主席树其实和静态的有很大差别&#xff0c;虽然同样是n个根&#xff0c;但是节点并不能共用&#xff0c;每个根节点表示bit上的一段区间。 所以其实是个树套树的东西来着&#xff0c;外层是bit&#xff0c;内层是主席树。 然后…

Flash气泡回弹效果

好久没有碰过Flash了&#xff0c;今天温习一下AS3.0&#xff0c;做了一个回弹效果&#xff0c;气泡回弹本想着怎么可以定义气泡的不同颜色&#xff0c;这样可以做出更绚丽的效果&#xff0c;或者更进步一&#xff0c;气泡和气泡直接回弹&#xff0c;想了老半天没有想出来&#…

数据库连接的代码

数据库连接前的准备 数据库连接的jar包 数据库连接的java代码&#xff1a; package com.it.util;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;public class Dbutil {private String jdbcName"com.mysql.jdbc.Driver"…

windows建立PPPoE服务器

windows建立PPPoE服务器1.下载RASPPPOE&#xff08;0.99版&#xff09;2.安装RASPPPOE协议本地连接-->属性-->常规-->安装-->协议-->添加-->从磁盘安装-->浏览-->“找到自己RASPPOE所在的目录下的那个winpppoe.inf”-->打开-->继续……………即可…

使用 Azure CLI 管理 Azure 虚拟网络和 Linux 虚拟机

Azure 虚拟机使用 Azure 网络进行内部和外部网络通信。 本教程将指导读者部署两个虚拟机&#xff0c;并为这些 VM 配置 Azure 网络。 本教程中的示例假设 VM 将要托管包含数据库后端的 Web 应用程序&#xff0c;但本教程并不介绍如何部署应用程序。 本教程介绍如何执行下列操作…

面向对象的内存分析

注意&#xff1a;成员属性是有默认的初始值。数据类型 默认的初始值int 0float 0.0fdouble 0.0char String null引用数据类型 …

ModuleNotFoundError: No module named ‘qcloud_cos‘

是腾讯云提供的一个Python SDK,用于与腾讯云对象存储(COS)服务进行交互。使用pip安装qcloud_cos报以下错误。这个错误表示Python无法找到名为。

java常见的四个运行时期的异常

空指针异常 数组越界异常 类型转换异常 无效参数异常

ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效

ASP.NET请求验证功能可以给我提供应用程序的安全保证&#xff0c;避免站点受到XSS的攻击。但是在一些情况下&#xff0c;我们需要禁用这个功能&#xff0c;比如我们需要使用HtmlEditor来让用户输入一些HTML文本&#xff0c;这时候ASP.NET 2.0允许我们可以通过在web.config设置v…

[CTO札记]从技术走向商业的3级转变

思想原创&#xff1a;老刀。

[Ubuntu] 安装/卸载 声卡驱动

卸载sudo apt-get --purge remove linux-sound-base alsa-base alsa-utils安装sudo apt-get install linux-sound-base alsa-base alsa-utils 可以这样来处理声卡驱动突然出现异常的情况。 转载于:https://www.cnblogs.com/davidhhuan/archive/2010/04/21/1716941.html

java异常类 Object类

1.Object类 Object类是所有类的父类,是最顶层的父类.当一个类没有直接继承其它父类时,这个类的直接父类就是Object类.class Person {...}等价于class Person extends Object {...} Object 里的equals方法: boolean equals(Object obj):判断当前对象与obj对象的地址是否一样,…

『TensorFlow』卷积层、池化层详解

一、前向计算和反向传播数学过程讲解 这里讲解的是平均池化层&#xff0c;最大池化层见本文第三小节 二、测试代码 数据和上面完全一致&#xff0c;自行打印验证即可。 1、前向传播 import tensorflow as tf import numpy as np# 输入张量为33的二维矩阵 M np.array([[[1], [-…

个人计算机用户隐私保护全接触(2)

在第一部分中&#xff0c;我们已经详细讨论了有关如何加固系统和应用数据加密来保护用户隐私的方式&#xff0c;现在&#xff0c;就跟雪源梅香一起了解其它保护用户隐私的方法。1、清除计算机当中的用户操作痕迹我们应当在使用完计算机后&#xff0c;对操作所产的痕迹进行全面清…

java日期相关的类正则表达式

常用的API Date、Math、DateFormat、Calendar、正则表达式 Data类 public class DateDeom {public static void main(String[] args) {//创建日期类的对象Date datenew Date();// 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。long timedate.getTim…

M_Map画南海水深地形图

数据来自Etopo1全球地形和水深数据。 其分为两个版本&#xff0c;Ice Surface和Bedrock&#xff0c;两个版本基本一致。不同之处在于在处理南极洲和Greenland地形时&#xff0c;前者给出的是加上冰盖层之后的高程&#xff0c;后者给出的是岩床的高程。 在每个子版本下又有多种数…

blackberry Jvm error 104 错误(Device Simulator)

把模拟器目录下的这个文件 **-fs.dmp 删掉或者搬个家就成啦&#xff0c;然后重启模拟器 每次启动它都会生成这个文件&#xff0c;具体原因还待研究 8300 GSM GPRS EDGE8310 8300 GPS8320 8300 Wi-Fi8330 8310 CDMA Ev-DO Video Recording (!)转载于:https://www.c…

关于Map的key值的问题

HashMap<StringBuffer,String> strmap new HashMap<>();StringBuffer snew StringBuffer("1");strmap.put(s,"1");s.append("2");System.out.println(strmap.get("1")); null 与之前研究的value值的问题一样&#xff0c;…

田志刚:要你共享,但不告诉你共享什么

案例所述的问题很典型&#xff0c;是国内各类机构做知识管理的一个典型&#xff1a;我需要你共享&#xff0c;但不告诉你共享什么。问题是&#xff0c;我也不知道你该共享什么。这样的结果就是共享出来的东西都没用也都有用&#xff0c;因为你根本没有标准&#xff0c;所以我说…

Oracle Data Guard 理论知识

RAC&#xff0c; Data Gurad&#xff0c; Stream 是Oracle 高可用性体系中的三种工具&#xff0c;每个工具即可以独立应用&#xff0c;也可以相互配合。 他们各自的侧重点不同&#xff0c;适用场景也不同。 RAC 它的强项在于解决单点故障和负载均衡&#xff0c;因此RAC 方案常用…

JavaScript脚本文件学习总结

javaScript 学习总结 什么是JavaScript和javaScript的特点 是一种解释型脚本语言&#xff08;代码不进行预编译&#xff09;&#xff0c;不需要进行编译&#xff0c;直接嵌套在HTML页面&#xff0c;将静态的页面转变成支持用户交互的动态页面。 文件类型是.js 特点 解释性&…