如何发布一个 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),使你的包能够被更广泛的使用。

侵权请联系,马上删除

相关推荐
2301_801074152 小时前
TypeScript异常处理
前端·javascript·typescript
下雪天的夏风5 小时前
TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错
前端·javascript·typescript
天下无贼!19 小时前
2024年最新版TypeScript学习笔记——泛型、接口、枚举、自定义类型等知识点
前端·javascript·vue.js·笔记·学习·typescript·html
Jorah3 天前
1. TypeScript基本语法
javascript·ubuntu·typescript
小白小白从不日白4 天前
TS axios封装
前端·typescript
aimmon4 天前
Superset二次开发之源码DependencyList.tsx 分析
前端·typescript·二次开发·bi·superset
下雪天的夏风5 天前
Vant 按需引入导致 Typescript,eslint 报错问题
前端·typescript·eslint
theMuseCatcher5 天前
Vue3+TypeScript+Vite+Less 开发 H5 项目(amfe-flexible + postcss-pxtorem)
typescript·less·postcss
Qiyandays5 天前
vue + Lodop 制作可视化设计页面 实现打印设计功能(四)
前端·vue.js·typescript
人工智能的苟富贵6 天前
微信小程序中的模块化、组件化开发:完整指南
微信小程序·小程序·typescript