0.0.1 • Published 2 years ago

gaia-core v0.0.1

Weekly downloads
-
License
ISC
Repository
github
Last release
2 years ago

npm version

基于 koa 的 node 服务端框架,规范了路由生成、中间件管理、静态资源解析、模板渲染

安装

npm i gaia-core --save

如果使用ts开发,需要安装部分第三方库的类型声明,否则类型检查可能会报错:

npm i --save-dev @types/node @types/koa @types/koa__cors @types/koa-compress @types/koa-mount @types/koa-static"

使用示例

import GaiaApp from "gaia-core";
const nodeEnv = process.env.NODE_ENV;
const gaia = new GaiaApp(__dirname, nodeEnv === 'development' ? 'ts' : 'js'); // 如果本地是ts开发,请在此处判断一下
gaia.start().then((server) => {
  server.on('close', () => {});
});

cli工具

为方便项目初始化,可以使用gaia-cli初始化项目: https://github.com/gaia-hill/gaia-cli

项目结构

以 ts 项目为例(js 相同,只不过文件后缀不一样)

.
├── configs                        // 必须,配置文件存储目录
│   ├── application.ts             // 必须,项目通用配置
│   ├── rewrite.ts                 // 非必要,路由重定向文件,可匹配部分路径到指定的路由
│   └── routes.ts                  // 当routeType='config'时需要,定义路由配置
├── middleware                     // 非必要,自定义中间件目录
│   └── custom.ts                  // 自定义中间件
├── routes                         // 当routeType='dir'时需要,根据目录结构生成路由
│   ├── api
│   │   ├── test.ts                // 示例,该路径对应的路由为:/api/test
│   └── index.ts                   // 示例,该路径对应的路由为:/
├── views                          // HTML模板存放目录,模板类型目前支持ejs模板
│   └── index.ejs
└── index.ts                       // 项目入口文件

项目配置

configs/application.ts 中包含通用配置,配置属性如下:

//  以下配置除port外,都为非必填
export default async () => {
  return {
    port: 3005,                    // 服务运行的端口,默认3005
    routeType: 'config',           // 路由类型,config:配置文件 | dir:按目录生成,默认config
    static: {                      // 静态资源目录配置,public和staticPath为Gaia的配置,其他属性可参考koa-static的配置
      public: '/public',           // 静态资源访问路径前缀
      staticPath: './static',      // 静态资源目录(相对于启动目录),示例:如果static下面有test.js文件,则访问时的路径为/public/test.js
    },
    cors: false,                   // 跨域配置,参考@koa/cors的配置
		bodyparser: undefined,         // 请求body解析,参考koa-body配置
    compress: undefined,           // 压缩配置,参考koa-compress的配置
    view: {                        // 模板渲染配置
      type: 'ejs',                 // 模板类型,目前只支持ejs
      cache: true,                 // 是否开启模板缓存
      layout: 'layout',            // ejs的公共渲染模板
      data: {                      // 注入ejs模板的公共变量
        test1: 'xxx',
        test2: () => {},
      },
    },
  };
};

路由管理

配置型路由

configs/application.ts中配置routeType='config',按配置生成不需要遍历文件夹,启动速度要快一些

在configs/routes.ts文件中添加路由配置,格式如下:

import { Gaia } from 'gaia-core';
export default async (): Promise<Gaia.RouteType[]> => [
  {
    path: '/api/test',
    method: 'get',
    controller: async (ctx: Gaia.GaiaContext): Promise<string> => {
      ctx.ajax('/test');
      return 'test';
    },
    children: [
      {
        path: '/subtest',
        method: 'get',
        controller: (ctx: Gaia.GaiaContext) => {
          ctx.ajax('/subtest');
        },
      },
    ],
  },
];

该配置文件生成的路由为:

/api/test

/api/test/subtest

目录生成

configs/application.ts中配置routeType='dir'

路由生成是根据 routes 文件夹下的目录结构生成,例如下面结构:

.
├── api
│   ├── common
│   │   └── getData1.ts     // 对应URL:/api/common/getData1
│   └── getData2.ts         // 对应URL:/api/getData2
└── index.ts                // 对应URL:/

路由文件中可进行对应的处理,示例:

export default async (ctx) => {
  // do something
  ctx.status = 200;
  ctx.body = { code: 0, msg: "success", data: [] };
};

路由重定向

在某些情况下,需要对路由进行重写(例如单页面应用非跟路由的刷新 404),可以通过 configs/rewrite.ts 配置,匹配是按数组顺序:

form:源路由路径

to:目标路径

break:当匹配到某一项后,是否中断匹配,true:停止匹配并重定向,false:继续匹配,如果后面又匹配到则根据后面的目标路径跳转

import { Gaia } from 'gaia-core';
export default ():Gaia.RewriteConfigType[] => {
  const rewriteRules = [
    {
      from: /^(?!\/favicon.ico)(?!\/api)(?!\/static)(?!\/_logout).*?$/,
      to: "/",
      break: true,
    },
  ];
  return rewriteRules;
};

模板渲染

框架中封装了对 ejs 模板的渲染,在 ctx 中提供了 render 方法,可以渲染 views 目录下的 ejs 模板

示例:假如在 views 目录下有以下模板

.
├── common
│   └── list.ejs
├── layout.ejs
└── index.ejs

在路由中我们可以直接通过 render 渲染,第一个参数为模板名称,第二个参数为注入模板的变量,

除了可以在 render 方法中注入变量,也可以在 configs/application.ts 中的 view.data 添加公共参数

export default async (ctx) => {
  ctx.render("common/list", { data: "xxx" });
};

如果在 configs/application.ts 中配置了 view.layout 属性,render 在渲染时会为每个 ejs 模板默认添加公共模板,用法如下:

// view.layout = 'layout'

// 路由渲染list模板
export default async (ctx) => {
  ctx.render("common/list");
};

layout.ejs 模板如下:

渲染的模板会通过 body 变量注入 layout 模板对应的位置

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>layout</title>
</head>
<body>
  <div>公共的部分</div>
  <%- body %>
</body>
</html>

自定义中间件

在 middleware 目录中可以自定义 koa 中间件,服务在启动时,会读取 middleware 中的文件,将中间件注入 koa 的实例中,示例:

该中间件是给 ctx 定义两个快捷 response 方法,在路由响应时可以直接调用

export default async (ctx, next) => {
  ctx.success = (data) => {
    const body = { code: 0, data, msg: "success" };
    ctx.status = 200;
    ctx.body = body;
  };

  ctx.error = (msg: string) => {
    const body = { code: -1, data: {}, msg };
    ctx.status = 200;
    ctx.body = body;
  };
  await next();
};

如果对中间件的执行顺序有要求,可以定义中间件的执行优先级,weight属性类型为 number | 'auto' ,当是数字时,越大优先级越高,当是auto时,执行顺序在数字之后,同为auto按遍历目录的顺序,如果直接导出函数(如上),weight默认为auto:

import { Next } from 'koa';
import { Gaia } from 'gaia-core';
export default {
  weight: 9,
  run: async (ctx: Gaia.GaiaContext, next: Next) => {
    ctx.success = (data) => {
      const body = { code: 0, data, msg: "success" };
      ctx.status = 200;
      ctx.body = body;
    };
    
    ctx.error = (msg: string) => {
      const body = { code: -1, data: {}, msg };
      ctx.status = 200;
      ctx.body = body;
    };
    await next();
  },
};

静态资源目录

在 configs/application.ts 添加 static 参数,可配置静态资源访问服务,假设有如下配置:

{
  public: '/public',           // 访问前缀
  staticPath: './static',      // 静态资源本地目录,路径相对于项目启动目录,
  maxAge: 30 * 24 * 60 * 60,   // 资源缓存过期时间
}
.
├── configs
├── middleware
├── routes
├── static
│   └── test.png
├── views
└── index.ts

可通过/public/test.png 访问该资源

获取koa application实例

获取app实例有两种方式:

1、通过初始化时的gaia实例获取

const gaia = new GaiaApp(__dirname, 'ts');
// gaia.app

2、通过请求上下文ctx获取

import { Gaia } from 'gaia-core';
export default async (ctx: Gaia.GaiaContext) => {
  // ctx.app
};