发布npm包

269 阅读3分钟

上一篇介绍了rollup的打包项目juejin.cn/post/735793… 本文介绍最简单的npm发包流程,使用pnpm的monorepo管理包工程,使用changesets来发布包,打包工具为rollup

创建项目目录

mkdir hong-coding

package.json初始化并修改

pnpm init

添加文件pnpm-workspace.yaml,添加packages文件夹,monorepo项目都在这个文件夹下创建

# pnpm-workspace.yaml
packages:
  - "packages/*"

安装changesets rollup rollup-plugin-typescript2

pnpm add @changesets/cli rollup rollup-plugin-typescript2 -D -w

初始化changesets

npx changeset init 生成配置文件

{
  "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json",
  "changelog": "@changesets/cli/changelog", // 更新日志生成函数的加载地址
  "commit": true,  // 自动提交version的改动
  "fixed": [],     // 捆绑发布的包
  "linked": [],    // 设定版本保持一致的包
  "access": "public", // 公开,如果你想阻止一个包被发布到npm,在包的package.json中设置private: true (可选值:restricted,不公开)
  "baseBranch": "master",  // 主分支名
  "updateInternalDependencies": "patch", // 是否主动更新package的依赖,patch、minor
  "ignore": []  // 指定不发布的包
}

修改package.json,注意name为自己的项目名,只需修改scripts

{
  "name": "hong-coding",
  "version": "0.0.1",
  "description": "",
  "scripts": {
    "build": "pnpm -r run build",
    "changeset": "changeset",
    "vp": "changeset version",
    "release": "pnpm build && pnpm release:only",
    "release:only": "changeset publish --registry=https://registry.npmjs.com/"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@changesets/cli": "^2.27.1",
    "@rollup/plugin-commonjs": "^25.0.7",
    "rollup": "^4.14.2",
    "rollup-plugin-typescript2": "^0.36.0"
  }
}

.gitignore,顺便说一下这个文件的创建,内容根据自己的需要填写(这里也是copy的其他项目里的,不想更改了)

node_modules
coverage
.nyc_output
.DS_Store
*.log
.vscode
.idea
dist
compiled
.awcache
.rpt2_cache
docs
/lib
/dist
packages/**/lib

创建monorepo下的项目

cd packages

mkdir e-tabs

pnpm init

修改package.json,注意发布共有包需要修改publishConfig,指明发布包的文件files,注意main指向打包后的入口文件

{
  "name": "@hong-coding/e-tabs",
  "version": "0.0.1",
  "description": "",
  "main": "dist/index.js",
  "scripts": {
    "serve": "rollup -c -w",
    "build": "rollup -c"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "files": ["dist"],
  "publishConfig": {
      "access": "public"
  }
}

创建rollup.config.mjs、tsconfig.json

import { defineConfig } from "rollup";
import typescript from "rollup-plugin-typescript2";
import path from "path";
import {fileURLToPath} from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

export default defineConfig([
  {
    input: "src/index.ts", //入口文件
    output: [
      {
        file: path.resolve(__dirname, "dist/main.js"),
        format: "cjs",
        name: "main.cjs",
        // exports: "named" // 以免与cjs混淆 https://rollupjs.org/guide/en/#outputexports
      },
      {
        file: path.resolve(__dirname, "./dist/main.umd.js"),
        format: "umd", // 打包成UMD模块
        name: "Hello" // 打包成UMD模式,需提供name
      },
      {
        file: path.resolve(__dirname, "./dist/main.iife.js"),
        name: "Hello",
        format: "iife" // iife 表示立即执行函数
      }
    ],
    plugins: [
      typescript(),
    ]
  },
]);

{
    "compilerOptions": {
        "target": "ES2019",
        "lib": ["dom", "dom.iterable", "esnext"],
        "allowJs": false,
        "skipLibCheck": true,
        "esModuleInterop": true,
        "strict": true,
        "module": "ESNext",
        "moduleResolution": "node",
        "forceConsistentCasingInFileNames": true,
        "resolveJsonModule": true,
        "isolatedModules": false,
        "allowSyntheticDefaultImports": true,
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "noImplicitThis": false,
        "noImplicitAny": false,
        "declaration": true,
        "baseUrl": "./",
        "outDir": "./dist",
        "rootDir": "./src",
        "paths": {
            "@/*": ["./src/*"],
        }
    },
    "include": ["./src/**/*"],
    "exclude": ["../../node_modules/**/*"]
}

在e-tabs中创建src/index.ts文件

const Hello = () => {
  console.log('Hello, world!')
}

export default Hello;

在e-tabs中创建exemple/index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script type="text/javascript" src="../dist/main.umd.js"></script>
  </body>
</html>

回到项目根目录发布包

pnpm relesae(第一次发包直接执行)

将项目加入到变更集中

pnpm changeset add (之后执行pnpm changeset是一样的)

image.png

image.png

直接敲两次回车则默认是PATCH

PATCH 是指补丁版本号,一般用于 bug fix 以及修复安全性问题等 MINOR 是指副版本号,用于小功能的改善 MAJOR 是指主版本号,通常在重大更新的时候才会需要更新主版本号

需要提升版本

pnpm vp

发布前需要有npm的账号并登录

npm login

如有遇到以下问题

参考:www.yuque.com/xianzhixing… 《npm ERR! code ETIMEDOUT》

image.png image.png