---
description: 主调用方法，用于创建app实例对象。
---

# maty(options)

使用方式：

```javascript
const maty = require('maty');

const app = maty(options);
```

options参数的可用配置项及作用如下：

```javascript
options = {
  baseDir: process.cwd(),                // 项目根目录绝对地址，默认获取process.cwd()
  routerDir: defaultRouterDir,           // 加载路由配置的目录
  interceptorDir: defaultInterceptorDir, // 加载拦截器配置的目录
  viewDir: defaultViewDir,               // 视图模板目录
  viewExclude: ['**/include/**'],        // 排除自动渲染模板的目录，采用glob匹配规则
  apiDataCache: cache(),                 // 接口数据缓存方法，默认lru-cache实现
  apiDataName(apiUrl) {},                // 接口数据名方法，默认为获取api地址最后一个/后面的单词名
  handleAPI: apiUrl => apiUrl,           // router.api地址预处理方法，默认返回自身
  ajaxCache: true,                       // 是否允许缓存ajax响应结果，默认允许缓存
  uploadDir: defaultUploadDir            // 文件上传默认存储目录
}
```

#### baseDir \[:String]

项目根目录，默认从启动目录获取，baseDir决定了路由、拦截器、视图模板、文件上传目录的默认值。

```javascript
const defaultRouterDir = `${baseDir}/routers`;
const defaultInterceptorDir = `${baseDir}/interceptors`;
const defaultViewDir = `${baseDir}/views`;
const defaultUploadDir = `${baseDir}/uploads`;
```

同时又可以单独设置routers、interceptors、views、uploads的所在目录，单独设置时忽略baseDir的作用。

#### viewExclude \[:String]

maty支持无匹配路由配置的情况下，自动获取和请求路径相同的视图模板文件来渲染，而viewExclude用于设置排除规则（具体规则参见[glob文档](https://github.com/isaacs/node-glob)），符合规则的模板文件不会被自动渲染，用于保护一些模块文件或私有文件等

#### apiDataCache \[:Object]

设置后端api返回的数据缓存对象，采用 [lru-cache](https://github.com/isaacs/node-lru-cache) 的实现规范。比如需要使用Redit等自行管理缓存的，可以自定义该对象。

apiDataCache至少有get, set两个方法：

```
set(key, value, maxAge)
get(key) => value
```

#### apiDataName(apiUrl) \[:Function]

获取api返回数据的名称，例如一个路由配置如下：

```javascript
'/comments/list': {
  api: ['http://api.com/user/info', 'http://api.com/user/comments'],
  handle(data) {
    const userInfo = data.info  // key info 来自/user/info最后一个单词
    const comments = data.comments
  }
}
```

'/user/info', '/user/comments'两个接口返回的数据会被合并到handle方法第一个参数的data对象中，那么apiDataName就是用于设置data对象的key。默认为使用api地址最后一个/后面的单词名。

该配置项作为规律性的自动化获取data key的手段，用于提高效率。但api地址提供方未必按默认的规律行事，或者多个api地址的最后一个单词名经常性冲突， 此时可以按实际api地址的规律来自定义一个apiDataName(apiUrl){} 方法。api地址作为参数传入该方法。

同时若偶尔有data key名冲突，还可以在router配置apiItem.name来手动定义。

#### handleAPI(apiUrl) \[:Function]

针对每一个api地址的处理方法，默认返回apiUlr本身。该配置同样用于提高规律性的api地址配置效率。例如上面那个路由配置了两个api地址：

```javascript
['http://api.com/user/info', 'http://api.com/user/comments']
```

它们的规律是拥有相同的域名，那么可以简化配置为：

```javascript
['/user/info', '/user/comments']
```

然后设置handleAPI方法为：

```
handleAPI(apiUrl) {
  return `http://api.com${apiUrl}`;
}
```

#### ajaxCache \[:Boolean]

众所周知，ajax请求可能被浏览器缓存，大部分是在请求地址上加一个随机数用来消除缓存，其实服务器响应头也可以控制缓存，而ajaxCache就是用来控制对于ajax的响应是否缓存的。默认true允许缓存，设置false可禁止缓存。
