npm发布静态文件包流程

1 阅读1分钟

背景

需要项目既支持开发环境编译,也支持npm发布,默认package.json文件是开发环境的配置

新建发布的package.json文件

特别注意main、exports、publishConfig、files配置

// package.publish.json
{
  "name": "@md/plugin-core",
  "version": "2.5.0",
  "type": "module",
  "author": {
    "name": "modo",
    "email": "modou@md.com",
    "url": ""
  },
  "main": "./dist/all/md-omni-sdk.js",
  "exports": {
    ".": {
      "import": "./dist/all/md-omni-sdk.js"
    },
    "./im-user-sdk-umd": {
      "default": "./dist/im-user-sdk/md-omni-sdk.js"
    },
    "./im-user-sdk-es": {
      "default": "./dist/im-user-sdk/md-omni-sdk-es.js"
    },
    "./im-agent-sdk-umd": {
      "default": "./dist/im-agent-sdk/md-omni-sdk.js"
    },
    "./im-agent-sdk-es": {
      "default": "./dist/im-agent-sdk/md-omni-sdk-es.js"
    },
    "./im-user-sdk/*": "./dist/im-user-sdk/*",
    "./im-agent-sdk/*": "./dist/im-agent-sdk/*"
  },
  "publishConfig": {
    "access": "restricted",
    "registry": "https://registry.npmmirror.com/",
    "tag": "latest"
  },
  "files": ["dist"],
  "scripts": {
    "prepare:publish": "node scripts/prepare-publish.cjs",
    "postpublish": "node scripts/restore-dev.cjs"
  },
  "keywords": ["vite", "typescript"],
  "license": "MIT",
  "homepage": "http://xxxx/plugin-core",
  "repository": {
    "type": "git",
    "url": "git+http://xxxx/plugin-core.git"
  }
}

替换发布文件

const fs = require('fs')
const path = require('path')

console.log('准备发布配置...')

// 读取开发版 package.json
const devPackage = require('../package.json')
// 读取发布版 package.json
const publishPackage = require('../package.publish.json')

// 备份当前的 package.json
fs.copyFileSync(
  path.join(__dirname, '../package.json'),
  path.join(__dirname, '../package.json.backup')
)

// 更新版本号(如果需要)
publishPackage.version = devPackage.version

// 写入发布版 package.json
fs.writeFileSync(
  path.join(__dirname, '../package.json'),
  JSON.stringify(publishPackage, null, 2)
)

console.log('✅ 已切换到发布配置')

发布npm包

pnpm publish

还原package文件

const fs = require('fs')
const path = require('path')

console.log('恢复开发配置...')

// 恢复备份的 package.json
const backupPath = path.join(__dirname, '../package.json.backup')
if (fs.existsSync(backupPath)) {
  fs.copyFileSync(backupPath, path.join(__dirname, '../package.json'))
  fs.unlinkSync(backupPath)
  console.log('✅ 已恢复开发配置')
} else {
  console.log('⚠️  未找到备份文件,尝试从 package.publish.json 恢复')
  // 如果没有备份,可以从 package.publish.json 创建基础版本
  const publishPackage = require('../package.publish.json')
  const devPackage = {
    name: publishPackage.name,
    version: publishPackage.version,
    private: true,
    scripts: {
      'prepare:publish': 'node scripts/prepare-publish.js',
      postpublish: 'node scripts/restore-dev.js',
    },
    devDependencies: {},
  }

  fs.writeFileSync(
    path.join(__dirname, '../package.json'),
    JSON.stringify(devPackage, null, 2)
  )
  console.log('✅ 已创建默认开发配置')
}