发布一个npm包

谢善
2023-12-01

1.npm 是什么?

npm是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

  • 允许用户从npm服务器下载别人编写的第三方包到本地使用。
  • 允许用户从npm服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到npm服务器供别人使用。

由于新版的Nodejs已经集成了npm,所以之前npm也一并安装好了。同样可以通过输入 npm -v 来测试是否成功安装。

2.创建一个node模块

1.初始化npm

新建一个 01-publish-npm 项目

`-- 01-publish-npm
    |-- 
    `-- 

在项目的根目录下执行:

npm init -y  # 初始化npm, -y 自动新建一个package.json文件

此时目录结构 :

`-- 01-publish-npm
    |-- 
    `-- package.json

修改一下 package.json 文件的name, author 和 description 配置

name version main author 必填

{
  "name": "js-common-util",
  "version": "1.0.0",
  "description": "发布一个npm包教程",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "liujun",
  "license": "ISC"
}

name 字段是指定发布包的名称,必须是小写和一个单词,并且可以包含连字符和下划线。

version 字段的形式必须是x.x。并遵循语义版本控制

main 字段当另一个应用程序需要您的模块时加载的文件的名称。默认名称是index.js

package.json更多配置说明

https://www.cnblogs.com/tzyy/p/5193811.html#_h1_4

2.新建node模块

新建一个 index.js 文件

此时目录结构 :

`-- 01-publish-npm
    |-- 01-发布npm包教程.md
    |-- index.js
    `-- package.json

编写 node 模块( index.js的代码 )

/**
 * 1.获取文件类型:后缀名(小写)
 * @param {*} url xxx.jpg / https://www.baidu.com/img/bd_logo1.png
 * @return { httpType: '', suffix: '.jpg' } / { httpType: 'http', suffix: '.png' }
 */
var getFileType = function(url) {
  var httpType = "";
  var suffix = "";
  if (url != null && url.length > 0) {
    var lasindex = url.lastIndexOf(".");
    if (/^(http:|https:)/.test(url)) {
      httpType = "http";
    }
    if (lasindex > -1) {
      suffix = url.substr(url.lastIndexOf(".")).toLowerCase();
    }
  }
  // 返回协议 和 后缀名(小写)
  return { httpType, suffix };
};
// console.log(getFileType('xxx.jpg'))
// console.log(getFileType('https://www.baidu.com/img/bd_logo1.png'))


/**
 * 2.随机生成不重复的id
 * @param {} randomLength 生成的长度(默认返回8个)
 */
var genNonDuplicateID = function(randomLength = 8) {
  var id =Math.random()
        .toString()
        // 8个随机数 + 时间戳
        .substr(2, randomLength) + Date.now()
  return id;
};
// console.log(genNonDuplicateID()) //  76717640 1578386034095


/**
 * 3.判断是否是合法的url
 */
var isUrl= function(path) {
  var Expression=/http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/;
  var objExp=new RegExp(Expression);
  if(objExp.test(path)==true){
    return true;
  }else{
    return false;
  }
}
// console.log(isUrl('https://www.baidu.com/img/bd_logo1.png?where=super&time=1578386034095')) // true
// console.log(isUrl('http:/www.baidu.com/img/bd_logo1.png?where=super&time=1578386034095')) // false

/**
 * 4.将url中的参数转成 Object 对象
 * @param {*} url https://www.baidu.com/img/bd_logo1.png?where=super&time=1578386034095
 * @return { where: 'super', time: '1578386034095' }
 */
var parseQueryString = function(url) {
  if (isUrl(url)) {
    var searchurl = url.split("?");
    url = searchurl.length > 1 ? "?" + searchurl[1] : searchurl[0];
  }
  var reg_url = /^\?([\w\W]+)$/;
  var reg_para = /([^&=]+)=([\w\W]*?)(&|$|#)/g,
    arr_url = reg_url.exec(url),
    ret = {};
  if (arr_url && arr_url[1]) {
    var str_para = arr_url[1],
      result;
    while ((result = reg_para.exec(str_para)) != null) {
      ret[result[1]] = result[2];
    }
  }
  return ret;
};
// console.log(parseQueryString('https://www.baidu.com/img/bd_logo1.png?where=super&time=1578386034095'))

module.exports = {
  getFileType,
  genNonDuplicateID,
  isUrl,
  parseQueryString
}

node 模块更多说明

3.把node模块发布到npm服务器

1.注册npm账号

注册地址 : https://www.npmjs.com/signup (注册后要在邮箱验证)

官方文档教程:https://docs.npmjs.com/creating-a-new-npm-user-account

2.发布node模块

1.登录npm

进入项目的根目录执行:npm login

PS F:\blog\npm\01-publish-npm> npm login
Username:
Username: liujunb
Password:
Email: (this IS public) liujun2son@163.com
Logged in as liujunb on http://registry.npmjs.org/.

如果是: Logged in as liujunb on https://registry.npm.taobao.org/.

需要执行:npm config set registry http://registry.npmjs.org

2.执行发布命令

PS F:\blog\npm\01-publish-npm> npm publish
npm notice
npm notice package: js-pub-npm-util@1.0.0
npm notice === Tarball Contents ===
npm notice 260B  package.json
npm notice 2.4kB index.js
npm notice === Tarball Details ===
npm notice name:          js-pub-npm-util
npm notice version:       1.0.0
npm notice package size:  2.2 kB
npm notice unpacked size: 6.8 kB
npm notice shasum:        a45300189535edd7d32ba1f10d2d516d6f2704e0
npm notice integrity:     sha512-6Md4FG5KSJL3M[...]iAUTd8bBssRfg==
npm notice total files:   2
npm notice
+ js-pub-npm-util@1.0.0
  • 对于私有包和unscoped未限定作用域的包,使用npm发布: npm publish
  • 对于scoped 限定作用域的公共包: npm publish --access public

发布过程会把整个目录发布,不想发布的内容模块,
可以通过 .gitignore.npmignore 文件忽略

3.查看是否已发布成功

发布成功之后可以去 npm 官网查看是否已经存在( https://www.npmjs.com/package/已发布的包名 )

npm 发布更多说明

发布unscoped 和 scoped包

4.如何使用已发布的npm模块?

新建一个 test 项目

`-- test 
    |--
    `-- 

在项目根目录执行:

npm init -y
npm install js-pub-npm-util

此时项目的目录结构:

`-- test
    |-- 
    |-- node_modules
    |   `-- js-pub-npm-util
    |       |-- index.js
    |       `-- package.json
    |-- package-lock.json
    `-- package.json

node_modules -> js-pub-npm-util -> index.js 中的代码和提交的代码一模一样

在项目根目录新建 index.js 文件

var commonUtils = require('js-pub-npm-util')
console.log(commonUtils.genNonDuplicateID())

在本项目根目录执行 node index.js 发现代码已经执行。( 该模块不支持在浏览器中使用,浏览器不兼容module.exports模块化 )

注意:

当本项目需要安装多个 node 模块时,跟模块的安装顺序无关

1. require () 引入的仅仅是第一层 node_modules的库,不会引入node_modules 中 node_modules 的库

var commonUtils = require('js-pub-npm-util')

2. 如果本项目依赖js-pub-npm-util库,本项目的第三方库也引用了js-pub-npm-util 库?

  1. 如果js-pub-npm-util 库 版本号相同,第一层node_modules只存在一个js-pub-npm-util 库,

    第三方库虽然也同时依赖,但是它的node_modules不会存在js-pub-npm-util

  2. 如果版本号不相同,第一层node_modules只存在一个js-pub-npm-util库,

    第三方库的node_modules也存在一个js-pub-npm-util库,它们版本号不一样

3. 如果本项目安装第三方库时,如果第三方库有依赖其它库。

  1. 如果第三方库依赖的库在本项目没用使用,默认会把第三方库和其依赖的库安装在第一层node_modules

  2. 如果第三方库依赖的库在本项目也有使用并且版本号一样,默认会把第三方库和其依赖的库安装在第一层node_modules

  3. 如果第三方库依赖的库在本项目也有使用并且版本号不一样,默认会把第三方库安装在第一层node_modules中,第三方库依赖的库安装在第三方库的node_modules

4. 其实第三方库之间也可以随意使用本项目中第一层 node_modules 的库

5.更新node模块并发布

1.更新 package.json 文件 中的版本号

2.重新执行:

npm login
npm publish

6.删除已发布的npm包

npm unpublish xxxxxx --force

更多的 npm 命令:

ActionCLI command
Log in to npmnpm login
Change profile settings (including your password)npm profile set
Change 2FA modes for your user accountnpm profile enable-2fa auth-only
Disable 2FA for your user accountnpm profile disable-2fa
Create tokensnpm token create
Revoke tokensnpm token revoke
Publish packagesnpm publish
Unpublish packagesnpm unpublish
Deprecate packagesnpm deprecate
Change package visibilitynpm access public/restricted
Change user and team package accessnpm access grant/revoke
Change package 2FA requirementsN/A
 类似资料: