关闭

使用 Typescript 开发 Nodejs 命令行工具

时间: 2020-10-08阅读: 73标签: Typescript

本文记录了搭建基于 TypeScript 的 Nodejs 命令行开发环境的全过程。


为何使用TypeScript

首先,对于编写类库或者工具而言,使用 TypeScript 的最大好处就是其提供了类型机制,可以避免我们犯一些低级错误。

其次,配合编辑器(如 VS Code),TypeScript 能提供强大的代码提示功能,我们不需要记忆很多API的具体使用,在编写代码时编辑器会自动进行提示。比如引入了 http 之后,输入 http. 就会提示可以使用的各个方法和属性,并给出详细的说明。

同是微软旗下,VS Code 具有非常强大便利的功能,强烈推荐使用 VS Code 进行 TypeScript 和 Nodejs 开发。

最后,使用 TypeScript 是大势所趋,很多大公司都在推 TypeScript,使用 TypeScript 开发,可以让我们对 TS 使用更加熟练。


初始化工程

建立命令行工具,需要先创建一个 npm 包。下文将使用 npm 工具来完成包的初始化和依赖的安装。

首先创建一个文件夹,然后运行初始化命令:

mkdir ts-node-demo && cd ts-node-demo
npm init

控制台会出现一系列提示, 按照需求输入即可,然后一路回车,完成之后输入 yes 。

package name: (typescript-cli) 
version: (1.0.0) 
description: a cli in typescript
entry point: (index.js) 
test command: 
git repository: 
keywords: CLI,TypeScript
author: YourName
license: (ISC) MIT

初始化之后本地文件夹会出现一个 package.json 文件。我们的 npm 包就已经初始化完成了。为了避免误发布,我们在 package.json 中做一个更改:

- private: false,
+ private: true,


初始化 Git

在当前目录下运行:

git init

然后在当前目录创建 .gitignore 文件,指定忽略 node_modules 文件夹:

node_modules/
lib/

引入 Node 类型

既然是开发 Nodejs 程序,为了获得合适的类型校验和代码提示,我们需要引入 Nodejs 的类型文件:

npm i -D @types/node


引入 typescript

npm i typescript

然后需要初始化 tsconfig 文件。

./node_modules/.bin/tsc --init

上述命令会在当前文件夹下面创建一个 tsconfig 文件,用来指导 TypeScript 进行编译。 在里面有非常多的配置项,并且有非常详细的解释,我们做两个更改来适配我们的项目:

+ "sourceMap": true,
+ "outDir": "lib",

上述配置指定生成 sourceMap 文件,并将 TypeScript 的编译结果输出到 ./lib 文件夹.

然后在与 compilerOptions 平级的地方增加选项:

"compilerOptions": {
    ...
},
+ "include": [
+    "src/**/*"
+ ]

这表示我们只会编译 src 目录下的 .ts 文件。


编写代码

在当前目录下创建 src 文件夹,并创建 index.ts:

mkdir src && echo "console.log('Your cli is running.');" > src/index.ts

然后运行:

./node_modules/.bin/tsc 

可以发现在文件夹下出现了 lib/ 目录,里面就是 index.ts 编译之后的 js 文件。


创建运行脚本

每次编译都需要引用 node_modules 里面的 tsc 命令,有些繁琐,有三种方法可以解决:

全局安装 typescript 包:

npm i typescript -g

就可以直接使用 tsc 命令了。

使用 npx 执行 npx 是 npm 提供的命令,其会自动下载对应的包并执行.

npx tsc

创建 npm 脚本 在 package.json 中的 script 中增加一行脚本:

"script": {
+    "build": "tsc"
}

这里我们采用第3种方法,写入脚本后可以执行:

npm run build

也会成功进行编译。


注册命令

开发 Nodejs 命令行工具,就是提供一个可以直接调用的命令,而不是使用下面这种方式执行文件:

node lib/index.js

我们想要的效果是执行一个命令就能调用我们的 js 文件。

首先在当前文件夹创建文件 bin/node-cli-demo :

mkdir bin && touch bin/node-cli-demo.js

然后在文件中写入以下内容:

#!/usr/bin/env node
require('../lib/index.js');

npm 包注册的命令需要在 package.json 中进行声明,增加如下内容:

{
    "name": "typescript-cli",
    "version": "0.0.1",
+   "bin": {
+       "node-cli-demo": "./bin/node-cli-demo.js"
+   },
}

这表示当执行 node-cli-demo 这个命令时就去执行我们的 ./bin/node-cli-demo.js 文件。

最后在当前目录调用 npm link ,这条命令会把我们本地注册的命令放到 Nodejs 安装目录的 bin 文件夹下。在安装 Nodejs 时系统将该文件夹添加到命令查找的路径中。所以我们就可以直接使用我们刚刚注册的命令:

node-cli-demo
// Your cli is running.


自动监听文件变动

我们希望每次更改了 .ts 文件之后,不必手动执行 npm run build 就能看到最新的效果,可以使用 typescript 的 --watch 选项,在 package.json 中的 script 中增加 start 命令:

{
    "script": {
+       "start": "tsc --watch"
    }
}

在当前目录下运行命令:

npm start

然后对 src/index.ts 文件做一些更改,另开一个控制台窗口,运行 node-cli-demo,会发现打印的内容已经更新了。 这样我们在开发时就只需要关注代码编写,而不用考虑编译的问题了。

接下来我们就可以在 src 文件里面写我们的具体代码了!

注: 本文的 demo 代码可以在 github 上查看。为了避免创建很多仓库,我将其放到了一个仓库的子目录里面。


总结

使用 TypeScript 开发 Nodejs 命令行的流程如下:

安装 typescript 并进行配置;

在 package.json 中声明命令并使用 npm link 将其链接到全局命令中;

使用 tsc --watch 自动监听文件变动并重新编译;

运行注册过的命令,查看效果。


配置ESLint

使用 ESLint 校验我们的代码,可以避免一些低级错误。而 TypeScript 现在推荐采用 ESLint 来检查代码。我们可以为我们的工程配置 ESLint。

安装依赖

首先安装依赖:

npm i -D eslint @typescript-eslint/parser  @typescript-eslint/eslint-plugin

@typescript-eslint/parser 是用来解析 TypeScript 代码的,类似于 @babel/parser;

@typescript-eslint/eslint-plugin 是 ESLint 插件,用来配置具体的检查规则。

设置配置

在根目录下创建 .eslintrc, 写入以下内容:

{
    "root": true,
    "parser": "@typescript-eslint/parser",
    "plugins": [
        "@typescript-eslint"
    ],
    "extends": [
        "eslint:recommended",
        "plugin:@typescript-eslint/eslint-recommended",
        "plugin:@typescript-eslint/recommended"
    ],
    "rules": {
        "no-console": "error"
    },
    // set eslint env
    "env": {
        "node": true
    }
}

root: true 表示当前目录就是寻找 ESLint 的最终配置,这样 ESLint 就不会再往上层寻找配置;

parse 指定了使用 @typescript-eslint/parser 来解析我们的 TypeScript 代码;

plugins 指定使用的 ESLint 插件;

extends 指定了额外使用的规则配置。插件指定了一系列自定义的规则配置,只有在 extends 中指定才会生效。

rules 中可以扩展我们自己的规则。

env 中可以指定我们代码运行的环境,这样就可以自动判断某些代码是不是有错误。比如上述配置了 node: true ,我们在使用 require 的时候就不会报错了。

运行校验命令

在 package.json 的 script 中写入:

{
    "script": {
        "lint": "eslint ./src --ext .ts"
    }
}

上述命令指定了对 ./src 目录下扩展名为 .ts 的文件进行校验。

然后运行 npm run lint,会发现控制台出现报错,我们的 ESLint 已经生效了。

配置 VSCode 的 ESLint 插件,编辑器在开发时就会自动提示有问题的代码,帮助我们编写符合规范的代码。

忽略某些文件

我们可以指定某些目录下的文件不进行校验,在当前目录下创建 .eslintignore ,类似 .gitignore,然后在里面写入需要忽略的目录或文件:

node_modules

至此,ESLint 也配置完成了!

以上就是搭建 Nodejs 命令行的 TypeScript 开发环境的全部内容了,希望能帮到大家~

来自:https://zhuqingguang.github.io/2020/11/07/nodejs-cli-with-typescript/


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/9831

关闭

TypeScript基础以及在Vue中的应用

TypeScript推出已经很长时间了,在Angular项目中开发比较普遍,随着Vue 3.0的即将推出,TypeScript在Vue项目中使用也即将成为很大的趋势,笔者也是最近才开始研究如何在Vue项目中使用TypeScript进行项目的开发。

为什么程序员如此热爱TypeScript ?

Python 是我的谋生工具,我很喜欢它。尽管我对这门语言有一些 批评的地方,但我还是强烈推荐给任何开始从事数据科学的人。反正在这个领域中,比较有经验的人往往都是 Python 的布道师。

TypeScript 中的类型保护

如上所示,getSmallPet 函数中,既可以返回 Fish 类型的对象,又可以返回 Bird 类型的对象。由于返回的对象类型不确定,所以使用联合类型对象共有的方法时,一切正常,但是使用联合类型对象各自独有的方法时,ts 会报错。

TypeScript高级用法详解

作为一门强大的静态类型检查工具,如今在许多中大型应用程序以及流行的JS库中均能看到TypeScript的身影。JS作为一门弱类型语言,在我们写代码的过程中稍不留神便会修改掉变量的类型,从而导致一些出乎意料的运行时错误

在 React 中使用 Typescript

用 Typescript 写 React 可比写 Vue 舒服太多了,React 对 ts 的支持可谓天生搭档,如果要用 ts 重构项目,不像 Vue 对项目破坏性极大,React 可以相对轻松的实现重构

TypeScript 中的顶级类型:any 和 unknown

在 TypeScript中,any 和 unknown 是包含所有值的类型。在本文中,我们将会研究它们是怎样工作的。any 和 unknown 在 TypeScript 中是所谓的顶部类型。

抛弃 JS,使用 TypeScript

最近几个月我已经全面抛弃 JavaScript,完全使用 TypeScript 进行前端开发(只在上课的时候用到 JS)。先说优点:bug 显著减少,之前会遇到的 xxx 为空的问题几乎不会出

10个帮助你捕获更多Bug的TypeScript建议

有一个对TypeScript常见的误解是:一个变量只要标注了类型,那么它总是会检查自己的数据类型是否与我们的预期一致。与该误解相呼应的想法会认为:对一个从后端返回的对象进行类型标注可以在代码运行时执行检查来确保对象类型的正确性。

Typescript 进阶

这是一篇自己总结的 Typescript type相关的进阶文章,适合有一定ts基础,并在type编写方面感到迷惑、感到绝望的同学,也给那些入门Typescript已久,却无法更上一层楼的童鞋一个方向

谷歌为何会选用TypeScript?

谷歌在很早之前就张开双臂拥抱 Web 应用程序,Gmail 已经发布 14 年了。当时,JavaScript 的世界是疯狂的。Gmail 工程师不得不为 IE 糟糕的垃圾回收算法捏一把汗,他们需要手动将字符串文字从 for 循环中提取出来,以避免 GC 停顿

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!