返回

充分利用 TypeScript 构建自己的命令行工具

前端

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 语法、自动化测试以及持续集成。我希望这个教程对你有所帮助。