充分利用 TypeScript 构建自己的命令行工具
2023-12-16 11:36:58
TypeScript 构建命令行工具快速指南
前言
命令行工具在很多时候都非常有用,比如在代码重构时、或当我们希望简化一些日常任务时,或者希望与其他工具配合完成某个工作时,一个好的命令行工具就能快速地帮我们解决问题,还能提高工作效率。
最近,TJ 发布了 node-prune 进行对 node_modules 里冗余文件的清理,但项目由 TypeScript 编写,在执行 npm install 时,依赖包会被复制到 node_modules 中,而当项目处于开发阶段时,修改依赖包中的源代码,这些修改并不会体现在 node_modules 中的依赖包里,若手动安装的话,整个安装过程会非常缓慢,于是就想快速开发一个小工具,能同时安装多个依赖包,还能让依赖包处于一个可编辑的状态。于是想到了用 Typescript 构建命令行工具,我们可以快速地用强大的 TypeScript 类型系统、async/await 语法来开发这些工具。
本篇小教程里,我将会一步步演示使用 TypeScript 构建一个命令行工具,利用 async/await 进行非阻塞操作,利用 mocha 自动化测试以及 travis-ci 进行持续集成。
项目搭建
首先,创建一个新的 TypeScript 项目。我通常使用以下命令:
mkdir my-cli-tool
cd my-cli-tool
npm init -y
然后,安装必要的依赖包:
npm install typescript @types/node
接下来,在项目中创建一个 src 目录,并在其中创建一个 index.ts 文件。我们将把所有的 TypeScript 代码都放在这里。
最后,在项目根目录下创建一个 tsconfig.json 文件,内容如下:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"outDir": "build"
},
"include": [
"src"
]
}
开发命令行工具
现在,我们就可以开始开发我们的命令行工具了。首先,让我们在 index.ts 文件中定义一个简单的函数:
function helloWorld() {
console.log("Hello, world!");
}
然后,在 package.json 文件中添加以下脚本:
{
"scripts": {
"start": "ts-node src/index.ts"
}
}
现在,我们可以通过运行以下命令来运行我们的命令行工具:
npm start
这将输出 "Hello, world!" 到控制台。
使用 async/await 进行非阻塞操作
现在,我们来演示一下如何使用 async/await 语法来进行非阻塞操作。我们首先需要在 package.json 文件中添加一个依赖包:
npm install --save-dev @types/node-fetch
然后,我们在 index.ts 文件中添加以下代码:
async function getRepos() {
const response = await fetch("https://api.github.com/users/octocat/repos");
const data = await response.json();
console.log(data);
}
这段代码使用 async/await 语法来获取 GitHub 用户的仓库列表。它首先使用 fetch 函数来发送一个请求到 GitHub API,然后使用 await 来等待响应。接下来,它使用 json() 方法来将响应解析为 JSON 对象,最后将数据输出到控制台。
编写自动化测试
现在,我们来编写一些自动化测试来确保我们的命令行工具能够正常工作。首先,我们需要在 package.json 文件中添加一个依赖包:
npm install --save-dev mocha
然后,我们在项目中创建一个 test 目录,并在其中创建一个 index.test.ts 文件。我们将把所有的测试代码都放在这里。
接下来,我们在 index.test.ts 文件中添加以下代码:
describe("helloWorld", () => {
it("should print Hello, world!", () => {
const output = helloWorld();
expect(output).to.equal("Hello, world!");
});
});
这段代码使用 Mocha 来测试 helloWorld() 函数。它首先使用 describe() 函数来创建一个测试套件,然后使用 it() 函数来创建一个测试用例。接下来,它使用 expect() 函数来断言 helloWorld() 函数的输出应该等于 "Hello, world!"。
进行持续集成
最后,我们来演示一下如何使用 Travis CI 来进行持续集成。首先,我们需要在 Travis CI 上创建一个项目。
然后,我们需要在项目根目录下创建一个 .travis.yml 文件,内容如下:
language: node_js
node_js:
- "10"
script:
- npm test
这段代码告诉 Travis CI 使用 Node.js 10 来运行我们的测试。
现在,当我们每次提交代码到 GitHub 时,Travis CI 就会自动运行我们的测试,并让我们知道测试是否通过。
总结
至此,我们已经完成了使用 TypeScript 构建一个命令行工具的教程。我们学习了如何使用 TypeScript 的类型系统、async/await 语法、自动化测试以及持续集成。我希望这个教程对你有所帮助。