🌕 部署与发布
至此,所有的 axios 重构的代码编写和单元测试都完成了。这已经是一个几乎成熟可供使用的 TypeScript 库了。
在目前,并不是所有人都会使用 TypeScript 开发,仍然有大量的 JavaScript 用户,它们是不能直接引用 TypeScript 代码的,因此我们需要先对源码做编译和打包,然后再发布。
如果要将这个包发布到 npm 源,需要注册账号,并且在终端使用
npm login登录。
# 编译与打包
利用 rollup (opens new window) 来打包
它是一个非常著名的编译打包工具,Vue.js 也是利用 rollup 编译打包的。相比 webpack,它非常适合去编译和打包一些 JS 库。
由于使用
typescript-library-starter初始化我们的项目,我们已经拥有了 rollup 打包的相关配置和相关插件的安装。
对生成的 rollup.config.ts 做小小的修改:
- 将
libraryName修改为项目名称; input修改为src/index.ts。
input: 表示打包入口文件。output:表示输出的目标文件,它是一个对象数组,可以指定输出的格式,比如umd格式、es模式等。external:外部依赖,可以不被打包进去。watch:监听文件的变化,重新编译,只有在编译的时候开启--watch才生效。plugins:- 编译过程中使用的插件,其中
rollup-plugin-typescript2就是用来编译 TypeScript 文件,useTsconfigDeclarationDir表示使用tsconfig.json文件中定义的declarationDir。更多插件可以查阅文档。
修改 package.json ,确保一下:
"main": "dist/axios-typescript.umd.js",
"module": "dist/axios-typescript.es5.js",
"typings": "dist/types/axios-typescript.d.ts",
2
3
为项目名称。
然后在在控制台执行 npm run build ,会编译输出 dist 目录,其中 :
lib目录是单个.ts文件编译后的.js文件。types目录是所有.ts文件编译后生产的.d.ts声明文件。axios.es5.js是编译后生成的 es 模式的入口文件,用在package.json的module字段,axios.umd.js文件是编译后生成的umd模式的入口文件,用在package.json的main字段。
# 自定义部署
由于
semantic-release插件过于黑盒也略微重量,自己编写自动化部署脚本更加灵活意义更大。
首先修改 package.json :
需要为这个包命名一个 npm 中没有被占用的名字。可以使用
npm view搜索包名是否存在。
如果要关联这个发布的包对应的仓库,可以配置 repository 字段。
添加两个 npm scripts :
{
"prepub": "npm run test:prod && npm run build",
"pub": "sh release.sh"
}
2
3
4
- 当运行
npm run pub的时候,会优先执行prepub脚本,在prepub中运行了test:prod和build2 个脚本。&&符号表示前面一个命令执行成功后才会执行后面的任务。npm run test:prod实际上运行了npm run lint && npm run test -- --no-cache。 先运行lint去校验的源码和测试文件是否遵循tslint规范,再运行test去跑测试。npm run build实际上运行了tsc --module commonjs、rollup -c rollup.config.ts和typedoc --out docs --target es6 --theme minimal --mode file src。先运行tsc去编译的TypeScript文件,dist/lib和dist/types下的文件就是该命令产生的,然后运行rollup去构建axios.umd.js及axios.es.js,最后运行typedoc去构建项目的文档。- 运行完
prepub后就会再运行pub命令,实际上执行了sh release.sh命令。
# 编写部署脚本
创建文件 release.sh :
#!/usr/bin/env sh
set -e
echo "Enter release version: "
read VERSION
read -p "Releasing $VERSION - are you sure? (y/n)" -n 1 -r
echo # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
echo "Releasing $VERSION ..."
# commit
git add -A
git commit -m "[build] $VERSION"
npm version $VERSION --message "[release] $VERSION"
git push origin master
# publish
npm publish
fi
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env sh用来表示它是一个 shell 脚本。
set -e告诉脚本如果执行结果不为 true 则退出。
read VERSION表示从标准输入读取值,并赋值给$VERSION变量。
read -p "Releasing $VERSION - are you sure? (y/n)" -n 1 -r,其中read -p表示给出提示符,后面接着Releasing $VERSION - are you sure? (y/n)提示符;-n 1表示限定最多可以有 1 个字符可以作为有效读入;-r表示禁止反斜线的转义功能。因为read并没有指定变量名,那么默认这个输入读取值会赋值给$REPLY变量。
if [[ $REPLY =~ ^[Yy]$ ]]表示 shell 脚本中的流程控制语句,判断$REPLY是不是大小写的y,如果满足,则走到后面的then逻辑。
git add -A表示把代码所有变化提交到暂存区。
git commit -m "[build] $VERSION"表示提交代码,提交注释是[build] $VERSION。
npm version $VERSION --message "[release] $VERSION"是修改package.json中的version字段到$VERSION,并且提交一条修改记录,提交注释是[release] $VERSION。
git push origin master是把代码发布到主干分支。
npm publish是把仓库发布到npm上,我们会把dist目录下的代码都发布到npm上,因为我们在package.json中配置的是files是["dist"]
