# 代码编写规范指南

### Arena 环境

在 Arena 环境中，服务端与客户端采用不同的架构体系和编写规范：

- **服务端**：采用 `CommonJS` 规范
- **客户端**：采用 `ES6` 规范

### ArenaPro 环境

ArenaPro 环境实现了统一架构，为开发带来更简洁高效的体验：

- **推荐规范**：统一使用 `ESNext` 规范
- **主要优势**：
  - 代码更简洁易读
  - 支持最新 JavaScript 特性
  - 开发体验更统一

## 服务端开发规范

### 模块导出（CommonJS）

服务端使用 `CommonJS` 规范进行模块导出。主要通过 `module.exports` 实现：

```javascript
// 示例1：导出多个函数和变量
const playerUtils = {
  getPlayerHealth(player) {
    return player.health;
  },
  healPlayer(player, amount) {
    player.health += amount;
  },
  MAX_HEALTH: 100,
};

module.exports = playerUtils;

// 示例2：分别导出多个内容
module.exports.createEnemy = function (type, level) {
  return {
    type,
    level,
    power: level * 10,
  };
};

module.exports.ENEMY_TYPES = ["goblin", "dragon", "boss"];
```

### 模块导入（require）

使用 `require()` 函数导入模块：

```javascript
// 示例1：导入整个模块
const playerUtils = require("./playerUtils.js");

// 使用导入的功能
const player = { health: 50 };
playerUtils.healPlayer(player, 20);
console.log(playerUtils.getPlayerHealth(player)); // 输出: 70

// 示例2：使用解构赋值导入特定功能
const { createEnemy, ENEMY_TYPES } = require("./enemyUtils.js");

const newEnemy = createEnemy(ENEMY_TYPES[0], 5);
console.log(newEnemy); // 输出: { type: 'goblin', level: 5, power: 50 }
```

### 最佳实践

- 模块文件名使用小写，采用驼峰或下划线命名
- 相关功能打包在同一个模块中导出
- 为导出的函数和变量添加清晰的注释
- 避免循环依赖

## 客户端开发规范

### 模块导出（ES6）

客户端使用 ES6 模块化规范，支持命名导出和默认导出：

```javascript
// 示例1：UI组件导出
export class GameUI {
  constructor() {
    this.elements = new Map();
  }

  addElement(id, element) {
    this.elements.set(id, element);
  }

  render() {
    // 渲染逻辑
  }
}

// 示例2：工具函数导出
export const formatScore = (score) => `Score: ${score.toLocaleString()}`;
export const formatTime = (seconds) =>
  `${Math.floor(seconds / 60)}:${(seconds % 60).toString().padStart(2, "0")}`;

// 默认导出主游戏类
export default class Game {
  constructor() {
    this.ui = new GameUI();
    this.score = 0;
    this.time = 0;
  }

  start() {
    // 游戏启动逻辑
  }
}
```

### 模块导入（import）

```javascript
// 示例1：导入游戏核心功能
import Game, { GameUI, formatScore, formatTime } from "./game.js";

// 初始化游戏
const game = new Game();
const ui = new GameUI();

// 使用工具函数
console.log(formatScore(1000000)); // 输出: Score: 1,000,000
console.log(formatTime(125)); // 输出: 2:05

// 示例2：按需导入
import { GameUI as UserInterface } from "./game.js";
const ui = new UserInterface();
```

### 最佳实践

- 使用有意义的模块名和导出名
- 优先使用命名导出，便于代码追踪和重构
- 一个文件只包含一个默认导出
- 保持模块功能单一，避免过度耦合

## 注意事项

- 在 Arena 环境中严格遵循服务端和客户端的不同规范
- 在 ArenaPro 中统一使用 ES6+ 规范
- 确保导入路径正确，包含文件扩展名
- 避免在模块中直接修改全局状态
