Răsfoiți Sursa

增加ts基础

zhusiqing 4 ani în urmă
părinte
comite
b9e6eea582

+ 5 - 3
package.json

@@ -4,8 +4,8 @@
   "main": "index.js",
   "license": "MIT",
   "scripts": {
-    "dev": "cross-env NODE_ENV=dev nodemon src/app.js",
-    "start": "cross-env NODE_ENV=prod node src/app.js"
+    "dev": "cross-env NODE_ENV=dev nodemon -e ts --exec ts-node src/app.ts",
+    "start": "cross-env NODE_ENV=prod tsc"
   },
   "dependencies": {
     "@koa/router": "^9.4.0",
@@ -21,6 +21,8 @@
   },
   "devDependencies": {
     "@types/koa": "^2.11.4",
-    "@types/node": "^14.11.2"
+    "@types/node": "^14.11.2",
+    "ts-node": "^9.0.0",
+    "typescript": "^4.0.3"
   }
 }

+ 1 - 1
src/app.ts

@@ -1,7 +1,7 @@
 import Koa = require('koa');
 import Router = require('@koa/router');
 // 美化控制台
-import consola = require('consola');
+import consola = require('consola/dist/consola');
 // 解析post的body体
 import bodyParser = require('koa-bodyparser');
 // 部分安全相关

+ 2 - 2
src/config.ts

@@ -1,7 +1,7 @@
-const path = require('path');
+import path = require('path');
 const env = process.env.NODE_ENV;
 
-module.exports = {
+export = {
   port: 9900,
   redis: {
     host: '10.203.169.158',

+ 5 - 3
src/controllers/index.ts

@@ -1,5 +1,7 @@
-const services = require('../services');
-const controller = {};
+import services = require('../services');
+
+interface Controller { home: Function, code: Function }
+const controller = {} as Controller;
 
 controller.home = async ctx => {
   ctx.body = 'home';
@@ -19,4 +21,4 @@ controller.code = async ctx => {
   ctx.body = ctx.$response(body);
 };
 
-module.exports = controller;
+export = controller;

+ 2 - 2
src/middlewares/limit.ts

@@ -1,5 +1,5 @@
-const config = require('../config');
-module.exports = () => {
+import config = require('../config');
+export = () => {
   return async (ctx, next) => {
     const ip = ctx.ip;
     const key = `client_ip_limit_${ip}`;

+ 4 - 3
src/middlewares/logs.ts

@@ -3,10 +3,11 @@
  * @type Function
  * @param options
  */
-const { middlewareLog } = require('../utils/logger');
+// import { middlewareLog } = require('../utils/logger');
+import logger = require('../utils/logger');
 
-module.exports = () => {
-  const loggerMiddleware = middlewareLog();
+export = () => {
+  const loggerMiddleware = logger.middlewareLog();
   return async(ctx, next) => {
     // 静态文件不处理
     const isApi = /^\/api/.test(ctx.url);

+ 6 - 5
src/middlewares/redis.ts

@@ -1,7 +1,7 @@
-const redis = require('redis');
-const { promisify } = require('util');
-const consola = require('consola');
-const config = require('../config');
+import redis = require('redis');
+import util = require('util');
+import consola = require('consola/dist/consola');
+import config = require('../config');
 
 // 创建redis连接
 const client = redis.createClient({
@@ -31,6 +31,7 @@ client.on('end', () => {
 });
 
 // redis查询和设置await/async化
+const promisify = util.promisify
 const getClient = promisify(client.get).bind(client);
 const setClient = promisify(client.set).bind(client);
 const setexClient = promisify(client.setex).bind(client);
@@ -40,7 +41,7 @@ client.setex('test', 30, '111111');
 // send_sms_verify_code_sms_
 // 18339012129
 
-module.exports = () => {
+export = () => {
   return async (ctx, next) => {
     ctx.$redis = { set: setClient, get: getClient, setex: setexClient };
     await next();

+ 2 - 2
src/middlewares/response.ts

@@ -1,5 +1,5 @@
-const response = require('../utils/response');
-module.exports = () => {
+import response = require('../utils/response');
+export = () => {
   return async(ctx, next) => {
     ctx.$response = response;
     await next();

+ 1 - 1
src/services/index.ts

@@ -1,4 +1,4 @@
-module.exports.code = async (ctx, params) => {
+export const code = async (ctx, params) => {
   const code = await ctx.$redis.get(`send_sms_verify_code_sms_${params.phone}`);
   return code || 'no code';
 };

+ 5 - 0
src/typings/index.d.ts

@@ -0,0 +1,5 @@
+import { Consola } from "consola";
+
+declare module consola {
+  export var success: Function
+}

+ 29 - 13
src/utils/logger.ts

@@ -1,7 +1,8 @@
-const log4js = require('log4js');
-const path = require('path');
+// import log4js = require('log4js');
+import log4js = require('log4js');
+import path = require('path');
 
-const config = require('../config');
+import config = require('../config');
 
 // 输出配置
 const output = (ctx, message = '', commonInfo = {}) => {
@@ -11,7 +12,12 @@ const output = (ctx, message = '', commonInfo = {}) => {
     origin, // 获取URL的来源,包括 protocol 和 host。
     originalUrl // 获取请求原始URL。
   } = ctx.request;
-  const client = {
+  interface client {
+    originalUrl: string,
+    userAgent: string,
+    query?: string
+  }
+  const client: client = {
     originalUrl,
     userAgent: headers['user-agent']
   };
@@ -51,7 +57,17 @@ const { env, appLogLevel, dir, serverIp } = opt;
  * 展示方式为文件类型 dateFile
  * 日志输出的文件名 s-yyyy-MM-dd.log
  */
-const appenders = {
+interface appenders {
+  [log: string]: {
+    type: string,
+    filename?: string,
+    pattern?: string,
+    alwaysIncludePattern?: boolean,
+    serverIp?: string,
+    layout: object
+  }
+}
+const appenders: appenders = {
   log: {
     // 按日期进行输出log
     type: 'dateFile',
@@ -99,9 +115,9 @@ log4js.configure({
   pm2InstanceVar: 'INSTANCE_ID'
 });
 // 初始化log4js
-const logger = log4js.getLogger('log');
+export const logger = log4js.getLogger('log');
 
-const middlewareLog = () => {
+export const middlewareLog = () => {
   // koa上下文存放的log输出方法
   const contextLogger = {};
 
@@ -114,8 +130,12 @@ const middlewareLog = () => {
     ctx.$log = contextLogger;
     await next();
     if (ctx.response && ctx.status < 400) {
-      const commonInfo = {
-        serverIp
+      interface commonInfo {
+        serverIp: string,
+        params?: any
+      }
+      const commonInfo: commonInfo = {
+        serverIp,
       };
       if (ctx.request.body) {
         commonInfo.params = ctx.request.body;
@@ -127,7 +147,3 @@ const middlewareLog = () => {
     }
   }
 }
-
-module.exports.middlewareLog = middlewareLog;
-
-module.exports.loggers = logger;

+ 1 - 0
src/utils/observer.ts

@@ -1,4 +1,5 @@
 class Observer {
+  public handle
   constructor() {
     this.handle = {};
   };

+ 1 - 1
src/utils/response.ts

@@ -6,4 +6,4 @@ const responseHandle = (data, message = 'success', success = true) => {
   };
 };
 
-module.exports = responseHandle;
+export = responseHandle;

+ 9 - 0
tsconfig.json

@@ -3,12 +3,21 @@
     "outDir": "./dist",
     "allowJs": true,
     "target": "ES5",
+    "strict": true, // 启用所有严格类型检查选项
+    "alwaysStrict": true, // 以严格模式检查每个模块,并在每个文件里加入 'use strict'
     "noImplicitReturns": true, // 函数末尾返回值
     "noFallthroughCasesInSwitch": true, // switch case直接break
     "allowUnreachableCode": true, // 未执行代码
     "allowUnusedLabels": true, // 未执行标签
     "strictNullChecks": true, // 空检查
     "noImplicitAny": false, // 隐式any检查
+    "checkJs": true, // 检查js错误
+    "declaration": true, // 生成相应的 '.d.ts' 文件
+    "sourceMap": true, // 生成相应的 '.map' 文件
+    "removeComments": true, // 删除编译后的所有的注释
+    "importHelpers": true, // 从 tslib 导入辅助工具函数
+    "moduleResolution": "node", // 选择模块解析策略
+    "module": "commonjs" // 采用commonjs的模块风格
   },
   "include": [
     "./src"

+ 44 - 0
yarn.lock

@@ -325,6 +325,11 @@ anymatch@~3.1.1:
     normalize-path "^3.0.0"
     picomatch "^2.0.4"
 
+arg@^4.1.0:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+  integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
 argparse@^1.0.7:
   version "1.0.10"
   resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@@ -764,6 +769,11 @@ destroy@^1.0.4:
   resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
   integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
 
+diff@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+  integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
 dont-sniff-mimetype@1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz#c7d0427f8bcb095762751252af59d148b0a623b2"
@@ -1460,6 +1470,11 @@ make-dir@^3.0.0:
   dependencies:
     semver "^6.0.0"
 
+make-error@^1.1.1:
+  version "1.3.6"
+  resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+  integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
 media-typer@0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -2094,6 +2109,14 @@ source-map-support@0.5.16:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
 
+source-map-support@^0.5.17:
+  version "0.5.19"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+  integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
 source-map@^0.6.0, source-map@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
@@ -2225,6 +2248,17 @@ touch@^3.1.0:
   dependencies:
     nopt "~1.0.10"
 
+ts-node@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.0.0.tgz#e7699d2a110cc8c0d3b831715e417688683460b3"
+  integrity sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==
+  dependencies:
+    arg "^4.1.0"
+    diff "^4.0.1"
+    make-error "^1.1.1"
+    source-map-support "^0.5.17"
+    yn "3.1.1"
+
 tslib@1.9.3:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
@@ -2272,6 +2306,11 @@ typedarray-to-buffer@^3.1.5:
   dependencies:
     is-typedarray "^1.0.0"
 
+typescript@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.3.tgz#153bbd468ef07725c1df9c77e8b453f8d36abba5"
+  integrity sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==
+
 undefsafe@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae"
@@ -2427,3 +2466,8 @@ ylru@^1.2.0:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f"
   integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==
+
+yn@3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+  integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==