@midwayjs/view
Version:
Midway Component for render view
229 lines (168 loc) • 4.98 kB
Markdown
# midway-view
Base view component for midway.
## Install
/view don't have build-in view engine, So you should choose a template engine like ejs, and install `@midwayjs/view-ejs`.
View component will be auto install and enable by import `view-ejs`.
```bash
$ npm i /view-ejs --save
```
## Usage
First, import component in `src/configuration.ts`.
```typescript
import { Configuration } from '@midwayjs/core';
import * as view from '@midwayjs/view-ejs';
import { join } from 'path'
({
imports: [
// ...
view
],
importConfigs: [
join(__dirname, 'config')
]
})
export class ContainerLifeCycle {
}
```
Configure the mapping, the file with `.ejs` extension will be rendered by ejs.
```typescript
// src/config/config.default.ts
export const view = {
defaultViewEngine: 'ejs',
mapping: {
'.ejs': 'ejs',
},
};
// ejs config
export const ejs = {};
```
In controller, you can call `ctx.render`.
```typescript
import { Inject, Provide } from '@midwayjs/core';
import { Context } from '@midwayjs/koa';
('/')
export class HomeController {
()
ctx: Context;
('/')
async render(){
await this.ctx.render('hello.ejs', {
data: 'world',
});
}
}
```
## Use multiple view engine
/view support multiple view engine, so you can use more than one template engine in one application.
If you want add another template engine like nunjucks, then you can add /view-nunjucks component.
Configure the plugin and mapping
```typescript
// src/config/config.default.ts
export const view = {
mapping: {
'.ejs': 'ejs',
'.nj': 'nunjucks',
},
};
```
You can simply render the file with .nj extension.
```typescript
await this.ctx.render('user.nj');
```
## Write a view engine
Create a view engine class first, and implement render and renderString, if the template engine don't support, just throw an error.
```typescript
// lib/view.ts
import { Provide } from '@midwayjs/core';
()
export class MyView {
('xxxx')
viewConfig;
async render(fullpath, locals) {
return myengine.render(fullpath, locals);
}
async renderString() { throw new Error('not implement'); }
};
```
These methods receive three arguments, `renderString` will pass tpl as the first argument instead of name in `render`.
`render(name, locals, viewOptions)`
- name: the file path that can resolve from root (`/view` by default)
- locals: data used by template
- viewOptions: the view options for each render, it can override the view default config in `config/config.default.js`. Plugin should implement it if it has config.
When you implement view engine, you will receive this options from `render`, the options contain:
- root: it will resolve the name to full path, but seperating root and name in viewOptions.
- name: the original name when call render
- locals: the original locals when call render
`renderString(tpl, locals, viewOptions)`
- tpl: the template string instead of the file, using in `renderString`
- locals: same as `render`
- viewOptions: same as `render`
### Register
After define a view engine, you can register it.
```typescript
// src/configuration.ts
import { Configuration, Inject, Provide } from '@midwayjs/core';
import * as koa from '@midwayjs/koa';
import * as view from '@midwayjs/view';
import { MyView } from './lib/my';
({
imports: [koa, view],
importConfigs: [join(__dirname, 'config')]
})
export class AutoConfiguration {
()
viewManager: view.ViewManager;
async onReady(){
this.viewManager.use('ejs', MyView);
}
}
```
You can define a view engine name, normally it's a template name.
## Configuration
### Root
Root is `${appDir}/view` by default, but you can define multiple directory.
```typescript
export default appInfo => {
const appDir = appInfo.appDir;
return {
view: {
rootDir: {
default: `${appDir}/view`,
anotherDir: `${appDir}/view2`
}
}
}
}
```
### defaultExtension
When render a file, you should specify a extension that let /view know which engine you want to use. However you can define `defaultExtension` without write the extension.
```typescript
// src/config/config.default.ts
export const view = {
defaultExtension: '.html',
};
// controller
import { Inject, Provide } from '@midwayjs/core';
import { Context } from '@midwayjs/koa';
('/')
export class HomeController {
()
ctx: Context;
('/')
async render(){
// render user.html
await this.ctx.render('user');
}
}
```
### viewEngine and defaultViewEngine
If you are using `renderString`, you should specify viewEngine in view config, see example above.
However, you can define `defaultViewEngine` without set each time.
```js
// config/config.default.js
export const view = {
defaultViewEngine: 'ejs',
};
```
## License
[MIT]((https://github.com/midwayjs/midway/blob/master/LICENSE))