发布于 2024 年 10 月 21 日,星期一
它涵盖了从初始化项目、编写代码、配置package.json、发布到NPM仓库,到版本管理、依赖处理等各个环节的详细步骤和技巧。通过深入剖析NPM发包的本质,博客旨在帮助前端开发者更好地理解和掌握NPM发包的全过程,提升发包效率和质量。
package.json
的四个字段:main, module, bowser, types(或 typings)
.main, module
import { useEffect } from 'React'
import useTools from 'useTools'
{
"name": "foo",
"main": "./dist/index.js"
}
CJS
和 ESM
模块时,可以再添加一个 module
字段用于优先指定 ESM
模块的解析入口。main
字段不代表着只有 CJS
模块独有,只是 ESM
模块会优先解析 module
字段。{
"name": "foo",
"main": "./dist/index.cjs.js",
"module": "./dist/index.esm.js"
}
{
"main": "./lib/index.js",
"browser": "./lib/browser.js"
}
// 在当前配置下,浏览器环境下会使用 browser.js,在 Node.js 环境下会使用 index.js
exports
字段,如下:{
"exports": {
"browser": "./browser.js",
"node": "./index.js"
}
}
types
或 typings
字段,该字段的类型文件会再用户导入相应的 NPM 包时自动加载,为用户提供类型提示。{
"name": "foo",
"main": "./dist/index.cjs.js",
"module": "./dist/index.esm.js",
"types": "./dist/index.d.ts"
}
对 ESM 和 CJS 模块使用 Bundleless 模式,只在需要 UMD 模块时使用 Bundle 模式。
{
"type": "module",
"exports": {
".": {
"import": "./dist/esm/index.js",
"require": "./dist/cjs/index.js"
}
}
}
使用 exports
字段允许用户按需引入模块。
{
"exports": {
".": "./index.js",
"./utils": "./utils.js"
}
}
// package.json
{
"name": "my-data-lib",
"main": "./dist/cjs/index.js",
"module": "./dist/esm/index.js",
"exports": {
".": {
"require": "./dist/cjs/index.js",
"import": "./dist/esm/index.js"
}
}
}
使用 publishConfig
分离开发和发布时的入口文件。
{
"main": "src/index.js",
"publishConfig": {
"main": "dist/index.js"
}
}
官网https://semver.org/lang/zh-CN/
使用语义化版本管理。
npm version patch(修订号) # 1.0.0 -> 1.0.1
npm version minor(次版本号) # 1.0.1 -> 1.1.0
npm version major(主版本号) # 1.1.0 -> 2.0.0
latest
: 最新线上版本alpha
: 内部测试版本beta
: 公开测试版本rc
: 发行候选版本
1.0.0-alpha.0
和 1.0.0-beta.1
和 1.0.0-rc.1
pnpm install xxx@beta
或 pnpm install xxx@alpha
使用 dist-tag 标识不同的发布状态。
npm publish --tag beta
npm install mypackage@beta
确保构建环境纯净,提高发布效率。
# .github/workflows/publish.yml
name: Publish Package
on:
release:
types: [created]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: "14"
- run: npm ci
- run: npm test
- run: npm run build
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}