如何发布一个 TypeScript npm 包?

原文链接:blog.liblab.com/typescript-...

发布一个 npm 包不难,成功配置你的 TypeScript 项目才难。你的包能够适配大多数项目嘛?有输入提示和自动补全嘛?能够支持 ES 模块和 CommonJs 模块导入嘛?

在读了这篇文章之后,你会理解如何去让你的 TypeScript 在任何(大多数) JavaScript 和 TypeScript 项目中更适用,包括浏览器环境。

创建一个 TypeScript 项目

如果你已经创建了一个 TypeScript 项目,你可以跳过这个步骤或者对比一下不同点。

让我们创建一个 Node.js 项目并添加 TypeScript 依赖

js 复制代码
npm init -y
npm install typescript --save-dev

创建一个入口文件

js 复制代码
mkdir src
touch src/index.ts

目前 Node.js 和浏览器原生都不支持 TypeScript,所以我们需要用 tsc(TypeScript 编译器)去编译我们的TS代码,并生成JS代码。添加tsconfig.json文件到我们项目中

js 复制代码
npx tsc --init

如果你现在使用npx tsc,它会在.ts文件的同级目录下生成一份编译过得.js文件(不期望这样)。让我们做一些配置,让它生成的更好。添加下面几行到 tsconfig.json

js 复制代码
{
    "compilerOptions": {  
    // ... 其他参数
    "rootDir": "./src", // 在哪里找我们的代码
    "outDir": "./dist", // 把编译好的 js 放在那里
}

添加一个build脚本在package.json

json 复制代码
{
    "script":{
        "build": "tsc"
    }
}

现在执行npm run build , 会生成dist目录,里面包含了编译好的.js文件。如果你使用了 Git,记得把你的dist添加到 .gitignore

最佳实践

我们现在把我们的TS编译成了JS,如果你发布到 npm 上,这个包只能使用在一些 JS 项目中使用。还有一个问题是默认的 target 配置是 "es2016",但是现代浏览器只支持到 "es2015"。让我们来修改一下配置。

首先,我们修改target为 "es2015"。 esModuleInterop 默认是true。我们保留它以便于适配 ES 模块方式的引入。

我们使用 TypeScript 的主要原因就是类型支持!但是以我们现在的构建,目前还不支持。设置 declaration 为 true。它会生成声明文件 .d.ts.js 文件旁边。凭借这一点,你的包可以在 TS 项目中使用,并且还有类型提示。

我们还可以添加 declarationMap 这个会生成源映射(.d.ts.map)文件,在类型文件(.d.ts)和 TS 源码之间产生映射关系。这意味着我们在代码编辑器中可以直接使用 "Go To definition" 去到 TS 源码而不是编译后的 JS 文件。

与此同时,sourceMap 会帮我们添加 sourceMap 文件(.js.map), 这个文件会帮助我们在工具调试的时候映射 JS 到 TS 对应的源码。

使用 declarationMap 或者 sourceMap 需要我们上传我们的源码到 npm 中

最终的 tsconfig.json 文件

json 复制代码
{  
    "compilerOptions": {  
    "target": "es2015",  
    "module": "commonjs",  
    "strict": true,  
    "esModuleInterop": true,  
    "rootDir": "./src",  
    "outDir": "./dist",  
    "sourceMap": true,  
    "declaration": true,  
    "declarationMap": true,  
    }  
}

package.json

在用户引入的时候我们需要指定入口文件,将main设置为dist/index.js。除了这个,我们也需要指定我们的声明文件,在这个例子中是 dist/index.d.ts。我们还需要声明那个文件要发布,如果我们使用了sourceMapdeclarationMap,我们也需要上传src

最终的package.json文件

js 复制代码
{
    "name": "the-greatest-sdk", // 包名
    "version": "1.0.3", // 包版本
    "main": "dist/index.js",
    "types": "dist/index.d.ts",
    "scripts": {
        "build": "tsc"
    },
    "keywords": [], 
    "author": "", 
    "license": "ISC",
    "files": [
        "dist",
        "src"
    ],
    "devDependencies": {
        "ts-node": "^10.9.1",
        "typescript": "^5.0.4"
    }
}

发布到npm

发布到 npm 一点不难,建议大家可以看下官方文档,这里也有几个步骤:

  1. 确定有 package.json 文件
  2. 构建项目(npm run build 如果你用的是上面的例子)
  3. 如果你还没有npm账号,需要认证(npm login
  4. 执行 npm publish 命令

注意:如果你要更新你的包,需要修改你的版本 version 参数在你上传之前。

还有更复杂的和更推荐的发布方式,比如使用 GitHub 的一些方式,特别是开源包,但这超出了本文的范围。

总结

通过这些方法,你的 TypeScript 包会提供更好的类型提示以及模块支持(ES/CommonJS),使你的包能够被更广泛的使用。

侵权请联系,马上删除

相关推荐
子兮曰16 小时前
TypeScript 7.0 RC 深度解读:Go 重写完成,10 倍提速,编译器的「奇点时刻」
前端·后端·typescript
BAIGAOa17 小时前
不止 React:我开源了一个框架无关的终端键盘引擎,Vue/Svelte 都能用
typescript
小蚂蚁i17 小时前
把 TypeScript 内置工具类型彻底搞懂,顺便自己封几个好用的
前端·typescript
爸爸61918 小时前
07 ArkTS 基础类型与接口定义:从 TypeScript 到鸿蒙的类型升级
javascript·华为·typescript·harmonyos·鸿蒙系统
妙码生花2 天前
从 PHP 到 AI + Golang,程序员自救转型手记(二十六):icon 组件封装
前端·vue.js·typescript
PBitW2 天前
为什么vite中TS报错,可以继续运行?Webpack不行?💡
前端·typescript
敖行客 Allthinker2 天前
前端调试实战:DevTools调试工具 + 二分定位Bug法全总结
前端·typescript·chrome devtools
不瘦80斤不改名2 天前
HalfCart:基于LBS的1\.5km本地拼单系统全栈实践与踩坑复盘
python·docker·typescript·pycharm
濮水大叔3 天前
在大型 Vue 项目中,如何有效管理复杂的状态?“散装版” vs “套装版”
前端·vue.js·typescript
谷哥的小弟4 天前
TypeScript数组类型
javascript·typescript