# mm 代码封装指南

## 规则（Rules）

- 可复用的工具代码封装在 `com/{组件名}/index.js` 中
- 全局工具函数扩展到 `$.utils` 对象，通过 `$.utils.xxx()` 访问
- 组件应保持功能单一，低耦合

## 方法（Methods）

### 步骤1：封装为模块组件

```javascript
// com/string_helper/index.js
module.exports = {
    trim(str) { return str ? str.trim() : ''; },
    truncate(str, len) {
        return str && str.length > len ? str.substring(0, len) + '...' : str;
    },
    randomStr(len) {
        var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        var result = '';
        for (var i = 0; i < len; i++) {
            result += chars.charAt(Math.floor(Math.random() * chars.length));
        }
        return result;
    }
};
```

### 步骤2：封装为全局工具函数

```javascript
// 在 sys 的 _init 或 com/index.js 中
if (!$.utils) { $.utils = {}; }

$.utils.formatMoney = function(amount) {
    return Math.round(amount * 100) / 100;
};

$.utils.isPhone = function(str) {
    return /^1[3-9]\d{9}$/.test(str);
};
```

### 步骤3：使用封装的代码

```javascript
// 模块方式
var helper = require('./com/string_helper/index.js');
var code = helper.randomStr(6);

// 全局方式
if ($.utils.isPhone('13800138000')) {
    // ...
}
```

## 技巧（Tips）

- 模块组件适合复杂工具库，全局函数适合频繁调用的快捷方法
- 全局函数命名加前缀避免冲突，如 `$.utils.xxx`
- 扩展 `$` 对象的代码在 App 的 `_init` 或 `com/index.js` 中执行
- 参考实现：`com/` 目录下的现有组件
