# mm_tpl
**Repository Path**: qiuwenwu91/mm_tpl
## Basic Information
- **Project Name**: mm_tpl
- **Description**: No description available
- **Primary Language**: NodeJS
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-02-17
- **Last Updated**: 2026-03-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# mm_tpl
超级美眉模板引擎模块,基于art-template模板引擎,提供强大的MVC模式视图渲染功能,支持钩子系统、主题切换和缓存机制。
[English Documentation](README_EN.md) | [中文文档](README.md)
## 目录
- [特性](#特性)
- [安装](#安装)
- [快速开始](#快速开始)
- [高级特性](#高级特性)
- [API 参考](#api-参考)
- [注意事项](#注意事项)
- [开发](#开发)
- [许可证](#许可证)
## 特性
- 🚀 基于art-template高性能模板引擎
- 🔧 支持多种模板语法规则
- 🎨 主题切换和模板文件优先级搜索
- ⚡ 内置缓存机制提升性能
- 🔌 强大的钩子系统支持
- 📁 灵活的目录结构支持
- 🛡️ 完善的错误处理机制
## 安装
```bash
npm install mm_tpl
```
## 快速开始
### 1. 安装依赖
```bash
npm install mm_tpl
```
### 2. 初始化模板引擎
```javascript
const {Tpl} = require('mm_tpl');
// 创建模板实例
const tpl = new Tpl({
root: process.cwd(), // 根目录
default_dir: "./template/", // 默认模板目录
default_theme: 'default', // 默认主题
extname: ".html", // 模板文件扩展名
cache_root: './cache', // 缓存目录
cache_extname: '.cache.html', // 缓存文件扩展名
rules: [nativeRule, artRule, htmlRule, jsRule, pyRule, pyRule2] // 模板规则
});
```
### 3. 基础模板渲染
```javascript
// 简单变量替换
const result = tpl.render("
${message}
", {
message: "Hello World"
});
// 输出: Hello World
// 编译模板函数
const compiled = tpl.compile("${name} - ${age}
");
const result2 = compiled({ name: "张三", age: 25 });
// 输出: 张三 - 25
```
### 4. 循环渲染
```javascript
// 数组循环
const arrayResult = tpl.render(`
${loop arr value idx}
- ${idx}: ${value}
${/loop}
`, {
arr: [123, 234]
});
// 对象循环
const objectResult = tpl.render(`
${loop obj value key}
- ${key}
- ${value}
${/loop}
`, {
obj: { name: "张三", age: 25 }
});
// 传统for循环
const forResult = tpl.render(`
`, {
arr: [123, 234]
});
// each循环
const eachResult = tpl.render(`
${each arr}
- ${$value}
${/each}
`, {
arr: [123, 234]
});
// 输出:
//
```
### 5. 视图渲染
```javascript
// 设置全局变量
$.globalBag.siteName = "我的网站";
// 设置视图变量
tpl.set({
title: "首页",
keywords: "关键词"
});
// 渲染视图文件
const html = tpl.view("./views/index.html", {
user: { name: "张三" }
});
// 输出: 渲染结果 Hello World
// 获取视图变量
const title = tpl.get("title");
// 删除视图变量
tpl.del("keywords");
```
### 6. 缓存机制
```javascript
// 使用缓存渲染视图
const html = tpl.view("./views/page", {
data: someData
}, {
cache: true, // 是否使用缓存
cache_filename: "./cache" // 缓存文件名
});
// 清除缓存
tpl.clearCache('./views/mall'); // 清除指定目录缓存
// 或
tpl.clearCache(); // 清除所有缓存
```
### 7. 钩子系统
#### 添加函数钩子
```javascript
$.hook.addFunc('list', async function(viewBag, req, type) {
// 处理列表逻辑
var query = req.query;
if (query.user_id) {
viewBag.user_id = query.user_id;
}
return someData;
}, 100, 'listFunc'); // sort: 优先级, alias: 别名
```
#### 添加动作钩子
```javascript
$.hook.addAction('header', function(viewBag, param) {
return "";
}, 1, "headerAction");
```
#### 添加过滤器钩子
```javascript
$.hook.addFilter('content', function(viewBag, content, param) {
return content.replace("旧文本", "新文本");
}, 1, "contentFilter");
```
#### 执行钩子
```javascript
// 执行函数钩子
const result = await tpl.runFunc('list', { query: { page: 1 } }, 'article');
// 执行动作钩子
const actionResult = tpl.runHook('header', { param: 'value' });
// 在模板中使用钩子
const html = tpl.render(`
${hookAction('header')}
${hookFilter('content', '原始内容')}
`, data);
```
#### 删除钩子
```javascript
// 删除指定钩子
$.hook.delFunc('list', 'listFunc');
$.hook.delAction('header', 'headerAction');
$.hook.delFilter('content', 'contentFilter');
// 清空所有钩子
$.hook.clear();
```
## 高级特性
### 1. 主题和目录支持
```javascript
// 设置当前主题
tpl.current_theme = "dark";
// 模板文件查找顺序(优先级从高到低):
// 1. diy目录(自定义目录)
// 2. 当前主题目录
// 3. 默认主题目录
```
### 2. 模板规则
模块内置支持多种模板规则,包括:
- nativeRule: 原生语法规则
- artRule: art-template语法规则
- htmlRule: HTML注释语法规则
- jsRule: JavaScript语法规则
- pyRule: Python风格语法规则
### 3. 错误处理
```javascript
const html = tpl.view("./template.html", data);
if (tpl.error) {
console.error("渲染错误:", tpl.error);
}
```
### 4. 字符转义
```javascript
// 自动转义特殊字符
const escaped = tpl.escape("${content}
");
// 输出: ·$·{content}
// 还原转义字符
const restored = tpl.escape(escaped, true);
// 输出: ${content}
```
### 5. 全局挂载
```javascript
// 自动挂载到全局对象
if (global.$ && !$.Tpl) {
$.Tpl = Tpl;
$.tpl = new Tpl();
}
```
## API 参考
### Tpl 类方法
- `constructor(config)` - 构造函数,创建模板实例
- `setConfig(config)` - 设置配置参数
- `render(body, model, options)` - 渲染模板字符串
- `compile(body, options)` - 编译模板为函数
- `view(file, model, options)` - 渲染模板文件
- `set(obj)` - 设置视图数据
- `get(key)` - 获取视图数据
- `del(keys)` - 删除视图数据
- `clearCache(path, file)` - 清除缓存
- `runFunc(name, req, ...args)` - 执行函数钩子
- `runHook(name, req, ...args)` - 执行动作钩子(runFunc别名)
- `escape(body, restore)` - 转义/还原字符
### Hook 类方法
- `addFunc(name, func, sort, alias)` - 添加函数钩子
- `addAction(name, func, sort, alias)` - 添加动作钩子
- `addFilter(name, func, sort, alias)` - 添加过滤器钩子
- `runFunc(name, model, req, ...args)` - 执行函数钩子
- `runAction(name, model, ...args)` - 执行动作钩子
- `runFilter(name, model, ret, ...args)` - 执行过滤器钩子
- `delFunc(name, alias)` - 删除函数钩子
- `delAction(name, alias)` - 删除动作钩子
- `delFilter(name, alias)` - 删除过滤器钩子
- `clear(name)` - 清空钩子
## 注意事项
1. **依赖要求**: 需要安装 `art-template` 和 `mm_expand` 依赖包
2. **目录权限**: 确保模板目录具有读写权限
3. **缓存管理**: 及时清理过期缓存,避免内存泄漏
4. **钩子优先级**: 数值越小优先级越高,执行顺序越靠前
5. **异步处理**: 钩子函数支持异步操作,注意错误处理
6. **文件查找**: 模板文件按优先级顺序查找,确保文件存在
7. **字符转义**: 自动处理模板语法字符,避免冲突
## 开发
```bash
# 运行测试
npm test
# 查看代码覆盖率
npm run coverage
```
## 许可证
MIT License