发布于 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.1npm version minor(次版本号) # 1.0.1 -> 1.1.0npm 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 betanpm install mypackage@beta
确保构建环境纯净,提高发布效率。
# .github/workflows/publish.ymlname: Publish Packageon: 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}}