npm发布前端工具库
前言
白浪费了那么多有用的代码.jpg
避免今后用到相同的代码却要在不同的仓库里反复找实现 我决定把公用的代码抽出来 方便以后能用(方便脑子短路的时候找不到合适的代码)
成果:
https://www.npmjs.com/package/zlinni_common_pkg?activeTab=readme
编写代码
首先 GitHub 建一个仓库,我写的是 zlinni_common_pkg 之后添加一个 README,然后导出
clone 仓库后,npm init 出现 packgejson(稍后看)
新建一个 src 文件夹
新建一点代码 zlinniTool.ts
1 | export const sayHi = (): string => { |
包的规则
打开我们的 pkgjson
这是我写的规则 附加注释
1 | { |
关于包名查重
- 直接去网站搜
- 执行命令
npm view 包名
如果找不到 就不重复
包的构建
构建包体我们用到了 tsup 这个工具
是一款快速构建 ts 包体的工具
命令tsup <入口js> --minify
--minify
可以缩小打包体积
然后就可以写在packagejson
的build
里面
执行npm run build
就可以进行构建
就会看到打包出了一个dist
文件,里面有zlinniTool.js
和zlinniTool.mjs
两个文件
分为两种 一种是单独写一个tsup
工具配置tsup.config.ts
一种是直接在packgejson
里面写
首先前者这里比较关键的是1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28import { defineConfig } from 'tsup'
export default defineConfig({
// 入口文件 或者可以使用 entryPoints 底层是 esbuild
entry: ['src/zlinniTool.ts'],
// 打包类型 支持以下几种 'cjs' | 'esm' | 'iife'
format: ["cjs", "esm"],
// 生成类型文件 xxx.d.ts
dts: true,
// 代码分割 默认 esm 模式支持 如果 cjs 需要代码分割的话就需要配置为 true
splitting: false,
// sourcemap
sourcemap: false,
// 每次打包先删除 dist
clean: true,
// outExtension({format}){
// return {
// js:`.${format}.js`
// }
// }
});
dts
先写为false
后者则是直接写进去 推荐前者包的发布
上 npm 网站注册一个账号https://www.npmjs.com/
然后控制台npm login
登录自己的账号npm publish
发布
去网站上查看是否存在自己的包体 存在则成功去除无用的内容
当我们在网站上浏览的时候 会发现有dist
目录,src
目录等
实际上 对于包体的使用者来说 是不需要src
目录的 也就是不需要真实的代码
打个比方 前端打包出来的dist
目录 是可以直接给到运维去构建的 他们也不需要关注我们的真实代码 只要dist
能跑就行
同时 上传了src
目录也增加了我们包体的体积
修改方式如下:
打开packgejson
增加一行然后我们1
"files": ["/dist","/README.md","/package.json"]// 只上传这些信息 很重要
npm publish
发现不行 这是因为我们没有修改版本号
我们只做了点小修改 所以把版本号改为1.0.1
即可
发布之后就会看到只剩下这些东西了
dts
在自己的项目中执行 npm install zlinni_common_pkg
获取到相关的依赖后 引入文件
会发现没有类型提示 这是为什么呢? 因为没有写 dts
dts
引入方法 tsup.config.ts
中 dts
设置为 true
dts: true
然后继续 build
发现缺少了内容 typescript
因为 tsup
虽然处理 ts
但是对于 ts
的生成还是需要 typescript
的支持
所以我们要安装一下 ts
1
npm i typescript -D
再次 build
发现 build
成功了
打开 dist
目录 找到了 zlinniTool.d.ts
这个就是函数的类型文件
再次 publish
在对应的项目中执行npm update zlinni_common_pkg
进行更新 就找得到类型声明了
一些问题
如果没有对 tsconfig
进行配置,那么可能输出的时候会缺少 module
的识别
添加代码 tsconfig.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
"compilerOptions": {
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost",
"ES6",
"ES2015",
"ES2015.Promise",
"ES2015.Generator"
]
},
}
CICD?
Git 上传之后自动触发 npm publish