简介

Rockerjs-MVC是一套基于配置、具有轻量级容器特性且集成了链路追踪功能的Node.js Web应用框架。

Rockerjs-MVC的容器特性可极致简化你的代码,帮助你快速构建高效、可扩展的应用程序。它采用DI(Dependency Inject)和OOP(Object Oriented Programming)的理念,遵循 “配置大于约定” 的规范,同时提供 Starter机制 实现“模块粒度下配置与约定的融合” ,使用TypeScript强类型语言构建你的应用。

Rockerjs-MVC的所有功能都是基于一个遵循ini配置规范的 "app.${env}.config" 文件来实现的,可提供四种不同环境的配置文件:dev、daily、pre、prod

轻量级容器特性意味着Rockerjs-MVC可管理所有注解标识类的实例化对象,并管理其生命周期、对象间的依赖关系;当使用这些对象时可通过注解直接引用,无需手动实例化或建立对象间依赖。

Starter机制提供某些模块约定俗成的配置并自动初始化,无需开发者在程序中显式操作。当默认配置无法满足时,可通过配置文件配置该Starter相关参数。Starter机制采用基于约定的准则实现,但可基于配置文件进行扩展。

安装

Git:

$ git clone https://github.com/weidian-inc/rockerjs-demo.git project
$ cd project
$ npm install
$ node index

NPM:

$ npm i --save @rockerjs/mvc

特点

  1. 上手快,编码风格类似Springboot,但对前后端开发友好
  2. 基于TypeScript构建
  3. 提供IoC容器和AOP特性
  4. Starter机制,快速构建一个应用
  5. 多环境配置文件启动
  6. 极易上手的模块系统
  7. 可扩展渲染插件机制
  8. 久违的Main函数

核心概念

Rockerjs-MVC有三种基本的应用程序模块:

  1. 组件
  2. 过滤器
  3. 控制器

组件

组件是一个带有 @Component 注解的类。被注解的类需要同时继承一个抽象类 AbstractComponent,实现对应方法。

组件是一个高内聚的功能实体,它可以是一个中间件,也可以是工具类,也可以是一个普通类。在Rockerjs-MVC中,组件是一个通用的实体。

一个Redis组件:

@Component
export class Redis extends AbstractComponent {
  public static Module: typeof RedisClient;
  public name: string;

  public async start(config: RockerConfig.Redis) {
    // init
  }
}

过滤器

过滤器是控制器处理请求的前置逻辑,它采用职责链模式将请求与请求的处理者解耦。过滤器类似于Koa的中间件,或者说它就是Koa的中间件封装的类。

过滤器是一个通过 @Filter 注解的并继承抽象类 AbstractFilter 的类。它必须实现三个抽象方法:init()、doFilter()、destroy(),由容器在该类的不同生命周期进行调用。

一个BodyParser过滤器:

import * as BP from "koa-body";

@Filter
export class BodyParser extends AbstractFilter {
  args: RockerConfig.BodyParser;
  init(args: RockerConfig.BodyParser) {
    Logger.info('bodyParser filter init with args: '  +    JSON.stringify(args)); 
    this.args  =  args;
  }

  async doFilter(context, next) {
    let  uploadDir  =  path.join(process.cwd(), this.args.uploadDir);
    await  BP({
      multipart: true,
      urlencoded: false,
      text: false,
      json: false,
      formidable: {
        uploadDir: uploadDir,
        keepExtensions: true,      
      }
    })(context, next);
  }
  
  destroy() {
    Logger.info('bodyParser filter destroy');
  }
}

控制器

控制器负责处理传入的HTTP请求。控制器是一个带有 @Controller(path) 注解的类,其中path标识当前控制器所匹配的路径。

@Controller("/home")
export class HomeController {
  @Inject
  mainService: MainService;

  @Get({url: '/a'})
  async home(@Param("name") name: string, @Param("person") person: object) {
    let  a  =  await  this.mainService.sendMsgThenquery();
    return {
      tag: 'hello world',
      a,
      name,
      person
    }
  }
}

HomeController控制器可处理Get请求: /home/a