koa ts kick off 搭建项目的基本架子

news2024/11/27 1:39:09

koa ts kick off 使用ts开发koa项目的基本架子,便于平时随手调研一些技术

项目结构

├── src
│   ├── controller      //controller层
│   ├── service         //service层
│   ├── routes.ts       //路由
│   └── index.ts        //项目入口index.js
├── ecosystem.config.js //pm2配置
├── nodemon.json        //nodemon配置
├── package.json
└── tsconfig.json       // ts配置文件

项目构建步骤

初始化项目

npm init

按需输入信息,或者一直回车即可,信息可以后面再package.json中补充

安装typescript相关依赖

npm i ts-node typescript --save-dev
  1. ts-node: 可以在node中使用ts
  2. typescript: ts的包

配置tsconfig

先初始化ts配置文件,执行下面命令

npx tsc --init

执行完上述命令后生成tsconfig.json配置文件。
该项目将tsconfig配置为下面内容

{
  "include": ["./src"],   // 指定需要编译文件 否则默认当前目录下除了exclude之外的所有.ts, .d.ts,.tsx 文件
  "compilerOptions": {
    "module": "commonjs", // 指定生成哪个模块系统代码
    "declaration": false,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es6",
    "sourceMap": false,       // 用于debug   
    "outDir": "./dist",       //重定向输出目录
    "baseUrl": "./"
  },
  "exclude": ["node_modules"] // 不编译某些文件
}

有关ts的详细内容推荐: ts学习好资料
关于tsconfig的完整参数文档:
中文文档
英文文档

安装koa等基础功能包

npm i koa koa-router koa-body koa-parameter koa-static @types/node
  1. koa:koa功能包
  2. koa-router:koa路由
  3. koa-body: 解析post等请求中body参数
  4. koa-parameter: 校验请求中的基本参数
  5. koa-static: 静态文件服务
  6. @types/node: 包含node包中大部分的定义

项目基本内容

安装项目结构,分别建立各自文件夹,这里使用一个controller 和一个service

入口文件

src/index.ts

import * as Koa from 'koa';
import * as path from 'path';
import * as koaStatic from "koa-static";
import { koaBody } from 'koa-body';
import * as parameter from 'koa-parameter';
import globalExceptionHandler from './middleware/exceptions';
import router from './router';

// koa应用
const app = new Koa();
// 注册中间件
// 全局捕获错误
app.use(globalExceptionHandler);
// 静态文件服务 public 文件夹下文件可对外访问
app.use(koaStatic(path.join(__dirname, 'public')));
// 解析body 参数
app.use(koaBody());
// 验证入参
app.use(parameter(app));
// 注册路由
app.use(router.routes());
// 如果请求了不被允许的方法 比如说只实现了 get 这时候请求了post 就会告诉客户端一些信息
app.use(router.allowedMethods());
app.listen(3009, () => console.log('程序已经在3009端口启动'));

路由

src/router中内容用于应用中的路由注册

import * as Router from 'koa-router';
import HelloController from './controller/hello';

const router = new Router();
router.get('/hello', HelloController.hello);
router.post('/sayHey', HelloController.sayHey);

export default router;

中间件

src/middleware/exceptions.ts 中间件用于全局兜底使用捕获异常


// global exception handler
const globalExceptionHandler = async (ctx, next) => {
  try {
    await next();
  } catch (error) {
    ctx.body = {
      errMsg: error.message,
      state: false
    };
    ctx.status = 200; // http 响应码
  }
};

export default globalExceptionHandler;

controller层

src/controller/hello.ts 一个简单的controller层

import HelloService from '../service//hello';
class HelloController {
  private service: HelloService = new HelloService();

  hello = async ctx => {
    const params = ctx.request.query;
    console.log(`接受到的参数为, name:${params.name}`);
    ctx.body = await this.service.hello();
  };

  sayHey = async ctx => {
    const params = ctx.request.body;
    ctx.verifyParams({
      // 登录信息
      loginUrl: { type: 'string', required: true },
    });
    ctx.body = `接受到的数据, name:${params.name} age: ${params.age}`;
  };

}
export default new HelloController();

service层

src/service/hello.ts 一个简单的service层

export default class HelloService {
  hello = () => {
    return 'hello koa ts world ~';
  };
}

配置eslint

现在一般使用eslint来校验ts即可,无需再使用tslint。两者基本重复,tslint也不再维护了,推荐使用eslint即可

安装eslint

npm i eslint --save-dev

初始化eslint配置文件

npx eslint --init

执行上面命令后,会有一些列的交互式问题,按需选择即可。会自动下载对应的npm包并在本地生成.eslintrc.json配置文件
在这里插入图片描述

安装一个解析器

@typescript-eslint/parser

配置.eslintrc.json

这里将其配置为如下内容

{
  "root": true,
  "parser": "@typescript-eslint/parser",
  "plugins": [
    "@typescript-eslint"
  ],
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended"
  ],
  "rules": { 
    "semi": [2, "always"],
    "no-console": 1 // 如果有console,会抛出错误
  }
}

eslintignore.json

touch .eslintignore

忽略不需要eslint校验的文件配置内容如下:

node_modules
dist
ecosystem.config.js

nodemon

一个很不错的工具包,可以监听本地文件服务的变化,自动重启服务,代替node命令

安装

npm i nodemon --save-dev

配置文件

在根目录下新建nodemon.json文件,修改内容如下:

{
  "watch": ["src"],   // 监听src文件夹
  "ext": "ts",        // 监听ts文件
  "exec": "ts-node src/index.ts", // 变化之后执行该命令
  "ignore": ["./src/public"]      // 忽略那些命令
}

上述配置是监听src文件夹中

配置script脚本

在package.json文件中新增一个dev命令,表开发时使用

"dev": "nodemon",

当执行 npm run dev / yarn dev 时,会根据nodemon.json配置文件执行命令

pm2

在生产环境使用pm2来守护应用进程

安装

npm i pm2 --save-dev

配置文件

npx pm2 init

执行上述命令生成pm2配置文件ecosystem.config.js, 将其修改为如下内容:

// pm2 配置文件,可运行 pm2 init生成该配置文件
const { name } = require('./package.json');
const path = require('path');

module.exports = {
  apps: [
    // 数组中每一项都是运行在pm2中的一个应用
    {
      // pm2中应用程序的名称
      name,
      // 应用的入口文件
      script: path.resolve(__dirname, './dist/index.js'),
      // 该应用创建的实例,可以根据服务器的cpu数量来设置实例,以充分利用机器性能.仅在cluster模式有效,默认为fork;
      // instances: require('os').cpus().length,
      instances: 1,
      // 发生异常的情况下自动重启
      autorestart: true,
      // 是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件
      watch: true,
      env_production: {
        NODE_ENV: 'production',
        PORT: 8080
      },
    }
  ]
};

配置script命令

在package.json中我们配置如下脚本

"scripts": {
    "dev": "nodemon", // 开发调式时使用
    "dev:dist": " nodemon dist/index.js", // 调试构建出的dist包
    "build": "rm -rf dist && tsc",  // 构建生产包
    "cp": "cp -r src/public dist/public", // tsc 只会讲src中ts文件编译成js到dist中,public静态资源文件单独cp过去
    "start": "npm run build && npm run cp && npx pm2 start ecosystem.config.js --env production", // 生产环境运行
    "restart": "npx pm2 restart ecosystem.config.js --env production",  //生产环境重启
    "stop": "npx pm2 stop ecosystem.config.js",     // 停止生产环境应用进程
    "delete": "npx pm2 delete ecosystem.config.js", // 删除生产环境应用进程
    "lint": "eslint . --ext .ts",                   // eslint校验项目代码规范
    "lint:fix": "eslint . --ext .ts --fix",         // eslint校验 & 修复项目代码规范
    "test": "echo \"Error: no test specified\" && exit 1"
  },

.gitignore

配置提交git时忽略的文件

node_modules
dist

运行

// 安装依赖
npm i

// 开发调式
npm run dev

// 生产
npm run start

项目地址

github地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【图像配准】多图配准/不同特征提取算法/匹配器比较测试

前言 本文首先完成之前专栏前置博文未完成的多图配准拼接任务&#xff0c;其次对不同特征提取器/匹配器效率进行进一步实验探究。 各类算法原理简述 看到有博文[1]指出&#xff0c;在速度方面SIFT<SURF<BRISK<FREAK<ORB&#xff0c;在对有较大模糊的图像配准时&…

04 react css上下浮动动画效果

react css上下浮动动画效果html原生实现上下浮动react 实现上下浮动思路分析实现步骤1.引入useRef2.在所属组件内定义—个变量3.在按钮上添加事件4.定义点击事件对window.scrollTo()进行了解&#xff1a;在react中实现效果图&#xff1a;html原生实现上下浮动 我们有一个导向箭…

【分享】订阅金蝶KIS集简云连接器同步OA付款审批数据至金蝶KIS

方案简介 集简云基于钉钉连接平台完成与钉钉的深度融合&#xff0c;实现钉钉OA审批与数百款办公应用软件&#xff08;如金蝶KIS、用友等&#xff09;的数据互通&#xff0c;让钉钉的OA审批流程与企业内部应用软件的采购、付款、报销、收款、人事管理、售后工单、立项申请等环节…

【2023面试秘籍】 测试工程师的简历该怎么写?

作为软件测试的垂直领域深耕者&#xff0c;面试或者被面试都是常有的事&#xff0c;可是不管是啥&#xff0c;总和简历有着理不清的关系&#xff0c;面试官要通过简历了解面试者的基本信息、过往经历等&#xff0c;面试者希望通过简历把自己最好的一面体现给面试官&#xff0c;…

【Java 面试合集】重写以及重载有什么区别能简单说说嘛

重写以及重载有什么区别能简单说说嘛 前述 这是一道非常基础的面试题&#xff0c;我们在回答的过程中一定要逐一横向比较。 从方法的 修饰符&#xff0c;返回值&#xff0c;方法名&#xff0c;含义&#xff0c;参数等方面进行逐一分析来比较不同。 话不多话&#xff0c;看下…

什么样的台灯适合学生做作业的?开学季,适合孩子写作业的台灯

学生在做作业时&#xff0c;是离不开台灯的&#xff0c;在台灯下学习三四个小时&#xff0c;如果台灯质量不好&#xff0c;那对视力造成很大影响&#xff0c;研究表明&#xff0c;儿童在过亮或者过暗的环境中长时间学习&#xff0c;会导致视力下降等&#xff0c;那么什么样的台…

瀚博半导体载天VA1 加速卡安装过程

背景&#xff1a; 想用 瀚博半导体载天VA1 加速卡 代替 NVIDIA 显卡跑深度学习模型 感谢瀚博的周工帮助解答。 正文&#xff1a; 小心拔出 NVIDIA 显卡&#xff0c;在PCIe 接口插上瀚博半导体载天VA1加速卡&#xff0c;如图&#xff1a; 这时显示屏连接主板的集成显卡 卸载…

cookie和Session的作用和比较

目录 什么是cookie cookie的工作原理 什么是session Session的工作原理 为什么会有session和cookie cookie和session如何配合工作 cookie和Session作用 什么是会话 什么是cookie cookie是web服务器端向我们客户端发送的一块小文件&#xff0c;该文件是干嘛的呢&#xf…

Java基础知识疑难点

1. 基础 1.1. 正确使用 equals 方法1.2. 整型包装类值的比较1.3. BigDecimal 1.3.1. BigDecimal 的用处1.3.2. BigDecimal 的大小比较1.3.3. BigDecimal 保留几位小数1.3.4. BigDecimal 的使用注意事项1.3.5. 总结 1.4. 基本数据类型与包装数据类型的使用标准 2. 集合 2.1. Arr…

Docker-用Jenkins发版Java项目-(1)Docke安装Jenkins

文章目录前言环境背景操作流程docker安装及jenkins软件安装jenkins配置登录配置安装插件及创建账号前言 学海无涯&#xff0c;旅“途”漫漫&#xff0c;“途”中小记&#xff0c;如有错误&#xff0c;敬请指出&#xff0c;在此拜谢&#xff01; 最近新购得了M2的MAC&#xff0c…

LeetCode刷题--- 138. 复制带随机指针的链表(哈希表+迭代)

文章目录一、编程题&#xff1a;430. 扁平化多级双向链表&#xff08;双指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;二、解题思路1. 题目分析2. 方法1&#xff08;哈希表&#xff09;思路&#xff1a;复杂度分析&…

备考 PMP 考试时需要着重注意什么?

PMP考试难度并不是很大。科学备考一定没有问题的&#xff5e;这里在和大家说说2023年PMP的考试时间&#xff1a;3月、5月、8月、11月&#xff08;其中3月不开启新报名&#xff09;需要注意的地方还是蛮多的。我就根据自己考试的经验和大家分享一下在考试整个过程中注意啥&#…

2023年广西最新建筑施工焊工(建筑特种作业)模拟试题及答案

百分百题库提供特种工&#xff08;焊工&#xff09;考试试题、特种工&#xff08;焊工&#xff09;考试预测题、特种工&#xff08;焊工&#xff09;考试真题、特种工&#xff08;焊工&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻…

【nodejs】nodejs入门核心知识(命令行使用、内置模块、node 模块化开发)

&#x1f4bb; nodejs入门核心知识(命令行使用、内置模块、node 模块化开发) &#x1f3e0;专栏&#xff1a;JavaScript &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享…

(1分钟突击面试) 高斯牛顿、LM、Dogleg后端优化算法

高斯牛顿法 LM法 DogLeg方法编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;知识点&#xff1a;高斯牛顿是线搜索方法 LM方法是信赖域方法。编辑切换为居中添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;这个就是JTJ是…

React设计原理—1框架原理

阅读前须知 本文是笔者学习卡颂的《React设计原理》的读书笔记&#xff0c;对书中有价值内容以Q&A方式进行呈现&#xff0c;同时结合了自己的理解&#x1f914;阅读时推荐先看问题&#xff0c;想想自己的答案&#xff0c;再和答案比对一下本文属于前端框架科普&#xff0c;…

68. Python的相对路径

68. Python的相对路径 文章目录68. Python的相对路径1. 知识回顾2. 什么是相对路径3. 相对路径的语法4. 查看相对路径的方法5. 写出所有txt文件的相对路径5.1 同目录5.2 上级目录6. 用相对路径读取txt文件6.1 读取旅游.txt6.2 读取旅游经费.txt6.3 读取笔记.txt和new.txt6.4 读…

微服务调用组件Feign

目录 JAVA 项目中如何实现接口调用&#xff1f; Httpclient Okhttp HttpURLConnection RestTemplate WebClient 什么是Feign 优势 Spring Cloud Alibaba快速整合OpenFeign 引入依赖 编写调用接口FeignClient注解 调用端在启动类上添加EnableFeignClients注解 发起调…

【送书活动】学Vue核心技术和uni-app跨平台实战项目就来看看这本书

本节目录1、书籍介绍2、推荐理由2.1 有充足的配套资源图书页内展示。2.2 PPT示例代码讲解演示2.3 内容由浅入深&#xff0c;渐进式学习3、参与方式1、书籍介绍 本书共分为14个章节&#xff0c;包括Vue.js核心基础、Vue.js高级进阶、Axios发送HTTP请求&#xff0c;Vuex状态管理…

牛客 面试必刷TOP101 题解(3、二叉树)

23 二叉树的前序遍历 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/ #include <vector> class Solution { public:vector<int> ans;void show(TreeNode…