使用 Koa + TS + ESLlint 搭建node服务器的过程详解


Posted in NodeJs onMay 30, 2022

初始化项目

使用 Koa + TS + ESLlint 搭建node服务器的过程详解

环境准备

与之前使用JavaScript 开发后台不同,区别如下:

  • 自动编译运行的插件由nodemon替换为ts-node-dev
  • TypeScript环境下,需要使用到ES6模块化规范。而非CommonJS规则。
  • 使用TypeScript语法进行开发,再开发结束后,需要进行编译打包为JavaScript去运行。

安装环境

yarn global add ts-node-dev typescript

ts-node-dev:与nodemon功能类似,在修改代码之后,保存即可生效,无需手动重启。

# 例如
ts-node-dev src/app.ts

# 如果想要监听文件的改变需要加上 --respawn 参数
ts-node-dev --respaswn src/app.ts

# 使用简短的别名
tsnd --respawn src/app.ts

初始化 tsconfig.json

# 生成tsconfig.json
tsc --init

修改tsconfig.json如下:

{
	"compilerOptions": {
		"target": "esnext", // 目标语言版本
		"module": "commonjs", // 指定生成代码的模板标准
		"sourceMap": true,
		"outDir": "./dist",
		"rootDir": "./src", // 指定输出目录, 默认是dist文件夹
		"strict": true,
		"esModuleInterop": true,
		"allowSyntheticDefaultImports": true,
		"skipLibCheck": true,
		"forceConsistentCasingInFileNames": true
	},
	// 需要编译的的文件和目录
	"include": ["src"],
	"exclude": ["node_modules", "dist", "public"]
}

简单搭建 Koa 服务器

# 依赖安装
yarn add koa
yarn add typescript -D
# 依赖注解
yarn add @types/koa -D

app.ts中实例化一个服务器。

import Koa, { DefaultContext, DefaultState, Context } from 'Koa'
const app: Koa<DefaultState, DefaultContext> = new Koa()
app.use(async (ctx: Context) => {
	ctx.body = 'coderlzw'
})
app.listen(3000, () => {
	console.log('服务启动成功,running http://127.0.0.1:3000')
})

package.json中添加调试脚本:

"scripts": {
  "dev": "ts-node-dev --respawn app.ts"
}

启动服务:

使用 Koa + TS + ESLlint 搭建node服务器的过程详解

现在,我们使用KoaTypeScript搭建了一个简单的服务器,我们http://127.0.0.1:3000便可以再浏览器中看到”coderlzw“

完整项目搭建

依赖安装

# 依赖安装
yarn add koa koa-router koa-cors koa-bodyparser dotenv
yarn add ts-node-dev npm-run-all typescript -D
# 依赖注解
yarn add @types/koa @types/koa-bodyparser @types/koa-router  @types/koa-cors -D

dotenv是一个零依赖的模块,它能将环境变量中的变量从.env文件加载到process.env中。

  • 在根目录下创建.env文件

    HOST=localhost
    PORT=3000
  • *.js/*.ts中使用

    import dotenv from 'dotenv'
    dotenv.config()
    const { PORT, HOST } = process.env

npm-run-all是一个批量执行npm脚本的工具。

构建目录结构

service
├─ package.json
├─ ?src
│   ├─ ?app
│   ├─ ?config
│   ├─ ?constants
│   ├─ ?controller
│   ├─ ?main.ts
│   ├─ ?middleware
│   ├─ ?router
│   ├─ ?service
│   └─ ?utils
├─ .env
├─ tsconfig.json
└─ yarn.lock

使用 Koa + TS + ESLlint 搭建node服务器的过程详解

修改 package.json

{
	"script": {
		"dev": "tsnd --respawn src/main.ts",
		"build": "npm-run-all resetFolder compile",
		"compile": "tsc", // 编译typescript
		"resetFolder": "rimraf dist/*" // 清空dist文件夹
	}
}

当我们在开发环境的时候,只需要执行yarn dev即可成功启动服务。

当我们执行编译打包的时候,根据tsconfig.json中的配置输出到指定的目录。

使用 Koa + TS + ESLlint 搭建node服务器的过程详解

在项目部署后,我们只需要运行dist/main.js文件即可启动服务。

使用 Koa + TS + ESLlint 搭建node服务器的过程详解

代码规范

eslint

官网: eslint.bootcss.com

eslint能够帮助我们规范编码,比如字符串使用哪种引号,代码结尾是否要有分号等等。

  • 安装依赖包

    yarn add eslint -D
  • 使用如下命令初始化eslint配置,会在项目更目录生成.eslintrc.js配置文件。

    eslint --init

    使用 Koa + TS + ESLlint 搭建node服务器的过程详解

接着我们在命令行执行:npx eslint src/** --fix,执行eslint提供的代码的自动修复。

使用 Koa + TS + ESLlint 搭建node服务器的过程详解

修改package.json,添加运行脚本。

"scripts": {
    "lint": "eslint src/** --fix",		// 使用eslint规则格式化代码
 }

现在我们可以通过命令来处理代码风格问题,但是我们更加希望在保存的时候自动处理代码分格,这时候就需要使用到vscode编辑器的插件ESLint,通过此插件和vscode编辑器配置便可以实现保存的时候自动格式化代码。

// vscode 配置自动格式化
"editor.codeActionsOnSave": {
    "source.fixAll": true
 }

现在我们通过如上的配置,在保存的时候就会自动处理代码风格问题。

prettier

前面所提到的eslint主要做两件事情,一是修复代码质量,二是修改代码分格。

如果你不喜欢eslint自带的格式化方式,就可以使用prettier来格式化代码分格。

官网: prettier.io/

yarn add prettier -D
复制代码

在项目更目录下配置.prettierrc

{
	"useTabs": false,
	"tabWidth": 2,
	"printWidth": 100,
	"singleQuote": true,
	"trailingComma": "none",
	"bracketSpacing": true,
	"semi": false
}

在项目更目录运行如下命令,格式化项目所有文件。

npx prettier --write .

但是当我们执行完后,会发现eslint又报错了。这是因为eslintprettier的冲突所导致的。这时候我们需要关闭prettiereslint格式所产生的冲突。

yarn add eslint-config-prettier -D

然后在.eslintrc.js加入perttier扩展,配置后冲突的问题就解决了,代码分格就由prettier来处理。

extends: ['standard', 'prettier']

现在我们希望在保存的时候按照prettier的代码分格格式化代码。eslint-plugin-prettier

yarn add eslint-plugin-prettier -D

eslintrc.js的最终配置如下:

module.exports = {
	env: {
		browser: true,
		es2021: true
	},
	extends: ['standard', 'plugin:prettier/recommended'], // 修改此处
	parser: '@typescript-eslint/parser',
	parserOptions: {
		ecmaVersion: 'latest',
		sourceType: 'module'
	},
	plugins: ['@typescript-eslint'],
	rules: {
		camelcase: 0 // 驼峰命名
	}
}

最后,实现了一个小案例:gitee.com/coderlzw/ko…

到此这篇关于使用 Koa + TS + ESLlint 搭建node服务器的文章就介绍到这了!

NodeJs 相关文章推荐
基于 Docker 开发 NodeJS 应用
Jul 30 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 NodeJs
浅谈Node的内存泄露问题
May 06 #NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 #NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 #NodeJs
Node.js实现爬取网站图片的示例代码
NodeJs使用webpack打包项目的方法详解
Feb 28 #NodeJs
node快速搭建后台的实现步骤
nodejs利用readline提示输入内容实例代码
You might like
动态新闻发布的实现及其技巧
2006/10/09 PHP
PHP冒泡算法详解(递归实现)
2014/11/10 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
2013/01/17 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
JS中递归函数
2016/06/17 Javascript
js实现交通灯效果
2017/01/13 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
Python 通配符删除文件的实例
2018/04/24 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
台湾最大网路书店:博客来
2018/03/18 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
党员廉洁自律承诺书
2014/05/26 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
党员先进事迹材料
2014/12/19 职场文书
2015年办公室文员工作总结
2015/04/24 职场文书
公司员工管理制度
2015/08/04 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
TV动画《史上最强大魔王转生为村民A》番宣CM公布
2022/04/01 日漫