草庐IT

从零到一发布 NPM 包

风逝老大 2023-04-27 原文

如果你负责前端的基础能力建设,发布各种功能/插件包犹如家常便饭,所以熟悉对 npm 包的发布与管理是非常有必要的,故此有了本篇总结文章。本篇文章一方面总结,一方面向社区贡献开箱即用的 npm 开发、编译、发布、调试模板,希望帮助到有需要的同学。

辛苦整理良久,还望手动点赞鼓励~
npm sdk 模板仓库为:https://github.com/fengshi123/npm-sdk
博客 github地址为:https://github.com/fengshi123/blog ,汇总了作者的所有博客,欢迎关注及 star ~

一、初始化 npm 包

1.1、初始化 npm 项目

根据以下命令能初始化一个 npm 包项目,命令交互过程中会让你填入 项目名称、版本、作者等信息,可以直接回车跳过(使用默认设置)

npm init --save

1.2、包权限管理

很多时候,一个项目包往往不只是你一个人在管理的,这时需要给其他一起维护的同学开通发布的权限,相关使用命令如下:

# 查看模块 owner, 其中 demo 为模块名称
$ npm owner ls demo

# 添加一个发布者, 其中 xxx 为要添加同学的 npm 账号
$ npm owner add xxx demo

# 删除一个发布者
$ npm owner rm xxx demo

1.3、发布版本

1.3.1、发布稳定版本

更新版本号共有以下选项(major | minor | patch | premajor | preminor | prepatch | prerelease) ,注意项目的git status 必须是clear,才能使用这些命令。

# major 主版本号,并且不向下兼容  1.0.0 -> 2.0.0
$ npm version major

# minor 次版本号,有新功能且向下兼容  1.0.0 -> 1.1.0
$ npm version minor

# patch 修订号,修复一些问题、优化等  1.0.0 -> 1.0.1
$ npm version patch

# premajor 预备主版本  1.0.0 -> 2.0.0-0
$ npm version premajor

# preminor 预备次版本  1.0.0 -> 1.1.0-0
$ npm version major

# prepatch 预备修订号版本  1.0.0 -> 1.0.1-0
$ npm version major

# prerelease 预发布版本  1.0.0 -> 1.0.0-0
$ npm version major

版本号更新后,我们就可以进行版本的发布

$ npm publish

1.3.2、预发布版本

很多时候一些新改动,并不能直接发布到稳定版本上(稳定版本的意思就是使用 npm install demo 即可下载的最新版本),这时可以发布一个 “预发布版本“,不会影响到稳定版本。

# 发布一个 prelease 版本,tag=beta
$ npm version prerelease
$ npm publish --tag beta

比如原来的版本号是 1.0.1,那么以上发布后的版本是 1.0.1-0,用户可以通过 npm install demo@beta  或者 npm install demo@1.0.1-0  来安装,用户通过 npm install demo 安装的还是 1.0.1 版本。

1.3.3、将 beta 版本设置为稳定版本

# 首先可以查看当前所有的最新版本,包括 prerelease 与稳定版本
$ npm dist-tag ls

# 设置 1.0.1-1 版本为稳定版本
$ npm dist-tag add demo@1.0.1-1 latest

这时候,latest 稳定版本已经是 1.0.1-1 了,用户可以直接通过 npm install demo 即可安装该版本。

1.3.4、将 beta 版本移除

# 将 beta 版本移除
$ npm dist-tag rm demo beta

1.3.5、将 tag 推送到 Git 远程仓库中

# 当我们发布完对应的版本,可以通过以下命令将版本号推送到远程仓库, 其中 xxx 为对应分支
$ git push origin xxx --tags

1.4、查看版本信息

可以通过 npm info 来查看模块的详细信息。

$ npm info

二、使用 typescript

2.1、安装 typescript 作为开发阶段的依赖项

$ npm i typescript -D

2.2、增加配置文件 tsconfig.json

在根目录新建 tsconfig.json,配置项具体的意义可以参考 ts 官方文档

{
    "version": "1.8.0",
    "compilerOptions": {
        "outDir": "build/compiled",
        "lib": [ "es6" ],
        "target": "es5",
        "module": "commonjs",
        "moduleResolution": "node",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "sourceMap": true,
        "noImplicitAny": true,
        "declaration": true
    },
    "exclude": [ "build", "node_modules" ]
}

2.3、安装 @types/node

安装 @types/node 让 node 的核心包具备类型提示

$ npm i @types/node -D

2.4、新建入口文件

在根目录新建 src 目录,用于存放所有的 TypeScript 源文件,然后在 src 下新建 index.ts 作为入口文件

// src/index.ts

console.log('hello npm-sdk!');

2.5、安装 ts-node-dev

在开发阶段为了能直接执行并且监听 ts 文件的变化,安装 ts-node-dev

$ npm i ts-node-dev -D

在 package.json 中定义一个启动脚本

"scripts": {
    "start": "ts-node-dev --respawn --transpile-only src/index.ts"
}

这样我们就可以实时进行编译,如下所示

三、使用 eslint 校验

3.1、安装 eslint

$ npm i eslint -D

3.2、eslint 初始化

$ ./node_modules/.bin/eslint --init

根据交互命令提示对应生成配置文件如下所示,可以根据团队的代码风格进行对应的配置 .eslintrc.js

module.exports = {
  env: {
    browser: true,
    es2021: true
  },
  extends: [
    'standard'
  ],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 13,
    sourceType: 'module'
  },
  plugins: [
    '@typescript-eslint'
  ],
  rules: {
  }
}

3.3、添加忽略文件 .eslintignore

node_modules/

3.4、script 命令配置

可以通过在 package.json 中配置对应的校验命令和修复命令,如下所示

  "scripts": {
    "lint": "eslint --ext .ts .",
    "lint:fix":"eslint --fix --ext .ts ."
  },

3.5、提交校验

利用 commitlint 和 husky 工具进行代码提交时拦截验证,安装如下

$ npm i @commitlint/cli @commitlint/config-conventional husky lint-staged --D

在 package.json 中进行对应的配置,当 commit 代码时,如果代码中存在 eslint 错误,那么就会进行报错提示

  "husky":{
    "hooks":{
      "pre-commit":"lint-staged",
      "commit-msg":"commitlint -e $HUSKY_GIT_PARAMS"
    },
    "lint-staged":{
      ".ts":[
        "eslint --fix"
      ]
    },
    "commitlint":{
      "extends":[
        "@commitlint/config-conventional"
      ]
    }
  },

四、编译

我们可以增加对应的 typescript 编译命令,如下所示

"scripts": {
  "build:cjs": "tsc --outDir lib",
  "build:es": "tsc -m esNext --outDir esm",
  "build": "rd /s /q lib esm && npm run build:cjs && npm run build:es",
},

配置对应的入口地址,其中 module 和 main 的区别是,module 主要在 tree shaking 时会用到。

  "main": "lib/index.js",
  "module": "esm/index.js",

五、本地调试

可以通过 npm link 在正式项目中进行调试,在我们的包目录中安装完发布的线上包后,可以执行以下命令将当前项目 node_modules 底下安装的对应包关联到本地全局 npm 目录的 node_modules 目录下,命令如下

$ npm link npm-sdk@1.0.1-0

执行命令如下所示

然后在对应的 npm sdk 目录下进行关联

$ npm link

// 关联成功后如下所示
D:\nvm\npm\node_modules\npm-sdk -> F:\all_project\npm-sdk

到这里,通过以上两个步骤的关联,将项目中使用到的 sdk 包,关联到该 sdk 包对应的开发目录,我们就可以在本地对 sdk 包进行调试。

六、总结

本文从 npm 各种常用命令、到 sdk 中使用 typescript、以及使用 eslint 强校验、再到编译/本地调试,从零到一演示如何搭建发布一个 NPM 包,NPM SDK 模板仓库为:https://github.com/fengshi123/npm-sdk,有需要的同学可以直接 clone 进行使用。
博客 github地址为:https://github.com/fengshi123/blog ,汇总了作者的所有博客,欢迎关注及 star ~

有关从零到一发布 NPM 包的更多相关文章

  1. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  2. ruby - Ruby gems 的问题(损坏?)试图让指南针在 npm 中工作 - 2

    我不是Ruby专家,但想弄清楚发生了什么,因为我试图让指南针在节点应用程序中工作,但我的Ruby似乎坏了。打字:ruby--version让我:ruby2.1.1p76(2014-02-24revision45161)[x86_64-darwin13.0]我安装了Homebrew,之前遇到过Ruby版本的问题,但它似乎已安装并且可以正常工作。但是,当我使用gem输入请求时,出现此错误:$gem-hErrorloadingRubyGemsplugin"/Users/user_dir/.rvm/gems/ruby-2.1.1@global/gems/executable-hooks-1.3

  3. ruby - npm link 的 Ruby 类似物是什么? - 2

    如果您是Nodejs项目的源代码,则命令npmlink会以这样一种方式安装它:您所做的任何更改都适用于所有地方,而无需重新安装。npmlinkisdesignedtoinstalladevelopmentpackageandseethechangesinrealtimewithouthavingtokeepre-installingit.https://www.npmjs.org/doc/misc/npm-developers.html#link-packages是否有Ruby项目的类似物? 最佳答案 Ruby的等价物是在Gemfi

  4. 从零开始学习Linux运维,成为IT领域翘楚(二) - 2

    文章目录🔥Linux系统目录结构🔥Linux用户和用户组🔥Linux用户管理🔥Linux系统目录结构文件系统组织结构⭐ /lib系统开机所需要最基本的动态链接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。⭐ /lost+found一般情况下是空的,当系统非法关机后,这里就存放了一些文件。⭐ /etc所有系统管理所需要的配置文件和子目录my.conf⭐ /usr用户的很多应用程序和文件都放在这个目录下。⭐ /bin是Binary的缩写,这个目录存放着经常使用的命令⭐ /sbin(usr/sbin、/usr/local/sbin)sbin就是peruse

  5. ruby-on-rails - rails heroku - 如何安装需要 'npm install ...' 的 javascript 依赖项 - 2

    我正在将我的Rails应用程序部署到heroku。我想使用一些javascript库,它们希望我们像这样安装npm依赖项:npminstallabc因此,在本地我可以安装npm和执行“npminstallabc”。不确定如何在heroku中与我的Rails应用程序一起使用。 最佳答案 使用Heroku的多重构建方法:UsingMultipleBuildpacksforanApp通过先安装NodeJS,再安装Ruby,Heroku将在Ruby中发生任何事情之前安装您的Node依赖项。herokubuildpacks:setheroku

  6. ruby-on-rails - Node/NPM 依赖于 Ruby on Rails 引擎 gem Assets 管道 - 2

    我正在构建一个打包在gem中的RubyonRails引擎,但无法弄清楚如何确保加载NPM依赖项。在常规Rails应用程序中,您可以安装NPM,然后使用npminstall命令将包放入node_modules基本目录中。然后在您的application.rb中使用以下行将node_modules添加到Assets管道:config.assets.paths但是,就我而言,我正在构建一个Rails引擎以作为gem加载。.gemspec文件允许您的gem将其他Ruby依赖项加载到主机应用程序中,但我不知道如何对Node依赖项执行相同的操作。在我的引擎中注意它需要某些NPM模块才能工作以便它们

  7. 从零开始编写Web自动化测试脚本(六)--鼠标、键盘操作 - 2

    第一章Selenium+WebDriver环境搭建第二章Selenium定位方式第三章元素常用属性第四章自动化中的三种等待第五章自动化浏览器设置及句柄、窗口切换操作第六章鼠标、键盘操作第七章javascript在自动化中的应用第八章unittest&断言第九章ddt数据驱动第十章测试框架搭建过程Python+Selenium+BeautifulReport文章目录一、鼠标操作二、键盘操作一、鼠标操作1、在web测试中,鼠标的操作包含在ActionChains类中,经常用到的有单击、双击、右击、拖动等操作。2、在使用鼠标操作前需要先导入ActionChains类包:fromselenium.we

  8. ruby - 在 npm 项目中安装 ruby​​ gems - 2

    我有一个依赖于ruby​​gem的node.js项目。是否有可能以某种方式创建一个安装过程,以简单的方式安装gem依赖项?理想情况下,当我这样做时npminstall要安装npm依赖项,如果还安装了所需的ruby​​gem,那就太好了。两者之间有某种桥梁吗?如果没有,是否有人对此进行了调查并找到了建议的最佳做法或在这些情况下解决问题? 最佳答案 理论上,npm-scripts提供在npminstall期间运行脚本的工具。例如,您可以将这些行添加到您的package.json:{"scripts":{"preinstall":"/us

  9. 从零开始系列(1)—— Anaconda + PyCharm + PyTorch(GPU) + 虚拟环境(全步骤,多图警告) - 2

    Anaconda+PyCharm+PyTorch(GPU)+虚拟环境声明一、安装Anaconda二、安装PyCharm三、创建虚拟环境并安装PyTorch四、关联虚拟环境五、致谢声明感谢姜小敏同学对我的支持、鼓励和鞭策!默认你的电脑上已经装有GPU,如果没有GPU,可以正常的进行各种下载安装操作,但是最终结果会有所不同。一、安装Anaconda首先,进入Anaconda官网,单击Download按钮,稍微等待即可下载安装包。下载好之后,双击打开安装包,进行一系列安装操作。建议安装路径全英文,并且一定要记住安装地址。此处不勾选第二项,因此之后需要人为配置环境变量。没啥用,不用勾选,就是跳出两个打

  10. javascript - 如何在 npm 项目中找到 node-gyp 依赖项(..或任何依赖项) - 2

    我正在经历难以想象的挫败感,试图让一个项目运行(即通过调用'npminstall'),但它总是被node-gyp绊倒。我在Windows上,所以我需要安装python和类似VisualStudio的东西。长话短说...我不想依赖像VisualStudio这样的烂摊子,所以我想看看这个node-gyp是否可以以某种方式成为可选的,或者被删除的。现在,如果我打开我的package.json文件,我会找到这些依赖项。"devDependencies":{"autoprefixer-stylus":"^0.7.1","browser-sync":"^2.8.2","gulp":"^3.9.0"

随机推荐