当前位置: 首页 > news >正文

使用 TypeScript 开发并发布一个 npm 包(完整指南)

本教程将一步步教你从零开发、打包并发布一个 TypeScript 工具库到 npm。以日期时间格式化工具为例,涵盖项目初始化、Vite 打包、类型声明输出、npm 配置、实际发布等完整流程,适合开发者直接套用。


文章目录

    • 📁 项目结构预览
    • 🧱 初始化项目
    • ✍️ 编写功能模块
    • ⚙️ 配置 TypeScript
    • 🔧 配置 Vite 打包
    • 📦 配置 package.json
    • 📖 添加 README.md(简略)
    • 使用示例
    • 🧠 发布后的版本管理建议


📁 项目结构预览

ts-date-utils/
├── dist/                     # 构建产物输出目录
│   ├── types/                # 类型声明文件输出目录
│   ├── ts-date-utils.es.js  # ES 模块
│   └── ts-date-utils.umd.js # UMD 模块
├── src/
│   └── index.ts              # 工具函数主入口
├── package.json              # 项目和发布配置
├── tsconfig.json             # TypeScript 配置
├── vite.config.ts            # Vite 打包配置
├── README.md                 # 包文档说明
└── .gitignore

🧱 初始化项目

mkdir ts-date-utils && cd ts-date-utils
npm init -y
npm install typescript vite -D
npx tsc --init
npm install @types/node -D

✍️ 编写功能模块

src/index.ts

export function formatDate(date: Date, format: string = 'YYYY-MM-DD HH:mm:ss'): string {const map: Record<string, string> = {'YYYY': date.getFullYear().toString(),'MM': (date.getMonth() + 1).toString().padStart(2, '0'),'DD': date.getDate().toString().padStart(2, '0'),'HH': date.getHours().toString().padStart(2, '0'),'mm': date.getMinutes().toString().padStart(2, '0'),'ss': date.getSeconds().toString().padStart(2, '0')};return format.replace(/YYYY|MM|DD|HH|mm|ss/g, m => map[m]);
}export function formatTimestamp(timestamp: number, format: string = 'YYYY-MM-DD HH:mm:ss'): string {return formatDate(new Date(timestamp), format);
}export function now(format: string = 'YYYY-MM-DD HH:mm:ss'): string {return formatDate(new Date(), format);
}export function parseDateString(str: string): Date {return new Date(str.replace(/-/g, '/'));
}export function isValidDate(val: unknown): val is Date {return val instanceof Date && !isNaN(val.getTime());
}

⚙️ 配置 TypeScript

tsconfig.json

{"compilerOptions": {"target": "ES2020","module": "ESNext","lib": ["ES2020", "DOM", "DOM.Iterable"],"moduleResolution": "node","esModuleInterop": true,"declaration": true,"declarationDir": "dist/types","emitDeclarationOnly": true,"outDir": "dist","skipLibCheck": true,"isolatedModules": true,"moduleDetection": "force","strict": true,"noUnusedLocals": true,"noUnusedParameters": true,"noFallthroughCasesInSwitch": true,"noUncheckedSideEffectImports": true,"types": ["node"]},"include": ["src"]
}

🔧 配置 Vite 打包

vite.config.ts

import { defineConfig } from 'vite';
import { resolve } from 'path';export default defineConfig({build: {lib: {entry: resolve(__dirname, 'src/index.ts'),name: 'TsDateUtils',fileName: (format) => `ts-date-utils.${format}.js`,formats: ['es', 'umd']},rollupOptions: {external: [],output: {globals: {}}}}
});

📦 配置 package.json

{"name": "kaze-ts-date-utils","version": "1.0.0","description": "A simple and flexible TypeScript date formatting library","main": "dist/ts-date-utils.umd.js","module": "dist/ts-date-utils.es.js","types": "dist/types/index.d.ts","files": ["dist","README.md"],"scripts": {"build": "vite build && tsc --emitDeclarationOnly","prepublishOnly": "npm run build"},"keywords": ["date","format","typescript","utils","time"],"author": "kaze","license": "MIT","devDependencies": {"@types/node": "^20.0.0","typescript": "^5.0.0","vite": "^5.0.0"}
}

📖 添加 README.md(简略)

# ts-date-utils> A simple and flexible TypeScript date formatting utility.## 安装
```bash
npm install kaze-ts-date-utils

使用示例

import { formatDate, now } from 'kaze-ts-date-utils';
console.log(now());
console.log(formatDate(new Date(), 'YYYY/MM/DD HH:mm'));

---## 🚀 发布到 npm1. 登录 npm(只需一次)
```bash
npm login
  1. 打包构建
npm run build
  1. 发布
npm publish

注意:版本号每次发布必须递增。


🧠 发布后的版本管理建议

  • bugfix / 小改动 → npm version patch
  • 新功能 → npm version minor
  • 有破坏性改动 → npm version major

发布更新:

npm version patch && npm publish

✅ 恭喜你,现在你已经掌握了完整的 TypeScript npm 包开发与发布流程!

相关文章:

  • springmvc从请求到响应的流程分析
  • Node.js 事件循环和线程池任务完整指南​
  • 【Hive入门】Hive函数:内置函数与UDF开发
  • 计算机视觉与深度学习 | 双目立体匹配算法理论+Opencv实践+matlab实践
  • Mixture-of-Experts(MoE)原理与在DeepSeek中的应用
  • 61.微服务保姆教程 (四) Gateway---SpringCloud微服务网关组件
  • 【计算机视觉】目标检测:深度解析YOLOv9:下一代实时目标检测架构的创新与实战
  • 探索微服务入口:Spring Cloud Gateway 实战指南
  • 基于tabula对pdf中多个excel进行识别并转换成word中的优化(五)
  • Next框架学习篇 ✅
  • leetcode day37 474
  • ACTF2025 - WEB Excellent-Site
  • docker desktop汉化
  • docker排查OOM Killer
  • 第10次:电商项目配置开发环境
  • Ubuntu 20.04 安装 ROS 2 Foxy Fitzroy
  • CSS的三大特性:层叠、继承与优先级
  • 实现使用Lucene对某个信息内容进行高频词提取并输出
  • Python爬虫学习路径与实战指南 03
  • SpringBoot+Mybatis通过自定义注解实现字段加密存储
  • 外交部亚洲司司长刘劲松向菲方严肃交涉
  • 新疆维吾尔自治区原质量技术监督局局长刘新胜接受审查调查
  • 君亭酒店:2024年营业收入约6.76亿元, “酒店行业传统增长模式面临巨大挑战”
  • 日月谭天丨赖清德强推“脱中入北”是把台湾带向死路
  • 古籍新书·2025年春季|中国土司制度史料集成
  • 现场|西岸美术馆与蓬皮杜启动新五年合作,新展今开幕