Appearance
项目初始化与环境搭建
在开始编写动画引擎之前,我们需要搭建一个现代化的开发环境。本章将创建一个 TypeScript 项目,配置构建工具和测试框架,为后续开发打下基础。
1. 技术选型
为什么选择 TypeScript
动画引擎涉及大量的配置对象、回调函数和内部状态,TypeScript 的类型系统能够:
- 防止配置错误:
{ durations: 1 }这种拼写错误会被立即发现 - 提供智能提示:编写
gsap.to()时自动提示可用选项 - 增强代码可读性:类型即文档
为什么选择 tsup
我们选择 tsup 作为构建工具:
- 零配置:开箱即用,无需复杂的 webpack/rollup 配置
- 速度快:基于 esbuild,构建速度极快
- 双格式输出:同时生成 ESM 和 CJS 格式
为什么选择 Vitest
Vitest 是我们的测试框架:
- 兼容 Jest API:上手成本低
- 原生 ESM 支持:与现代前端工具链无缝集成
- 快速热重载:开发体验极佳
2. 项目初始化
创建项目目录
bash
mkdir mini-gsap
cd mini-gsap
pnpm init安装依赖
bash
# 开发依赖
pnpm add -D typescript tsup vitest @types/node
# 如果需要 DOM 类型
pnpm add -D @vitest/browser初始化 TypeScript
bash
npx tsc --init修改 tsconfig.json:
json
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "bundler",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"declaration": true,
"declarationDir": "./dist",
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist", "tests"]
}3. 项目结构
创建以下目录结构:
mini-gsap/
├── src/
│ ├── index.ts # 入口文件
│ ├── core/
│ │ ├── ticker.ts # 全局时钟
│ │ ├── tween.ts # Tween 类
│ │ └── timeline.ts # Timeline 类
│ ├── easing/
│ │ └── index.ts # 缓动函数
│ ├── plugins/
│ │ └── css-plugin.ts # CSS 插件
│ └── types/
│ └── index.ts # 类型定义
├── tests/
│ ├── tween.test.ts
│ └── timeline.test.ts
├── package.json
├── tsconfig.json
├── tsup.config.ts
└── vitest.config.ts4. 配置构建工具
创建 tsup.config.ts:
typescript
import { defineConfig } from 'tsup';
export default defineConfig({
entry: ['src/index.ts'],
format: ['cjs', 'esm'],
dts: true,
splitting: false,
sourcemap: true,
clean: true,
minify: false,
treeshake: true,
});5. 配置测试框架
创建 vitest.config.ts:
typescript
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
include: ['tests/**/*.test.ts'],
coverage: {
provider: 'v8',
reporter: ['text', 'json', 'html'],
},
},
});6. 配置 package.json
更新 package.json:
json
{
"name": "mini-gsap",
"version": "0.1.0",
"description": "A minimal GSAP-like animation library",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": "./dist/index.js",
"require": "./dist/index.cjs",
"types": "./dist/index.d.ts"
}
},
"files": ["dist"],
"scripts": {
"build": "tsup",
"dev": "tsup --watch",
"test": "vitest",
"test:run": "vitest run",
"coverage": "vitest run --coverage"
},
"keywords": ["animation", "gsap", "tween", "timeline"],
"license": "MIT"
}7. 入口文件雏形
创建 src/index.ts:
typescript
// Mini-GSAP 入口文件
// 版本信息
export const version = '0.1.0';
// 核心 API(后续实现)
export const gsap = {
version,
// 核心方法
to() {
console.log('gsap.to() - Coming soon...');
},
from() {
console.log('gsap.from() - Coming soon...');
},
fromTo() {
console.log('gsap.fromTo() - Coming soon...');
},
// Timeline 工厂
timeline() {
console.log('gsap.timeline() - Coming soon...');
},
// 插件注册
registerPlugin() {
console.log('gsap.registerPlugin() - Coming soon...');
},
};
// 默认导出
export default gsap;8. 第一个测试
创建 tests/setup.test.ts:
typescript
import { describe, it, expect } from 'vitest';
import { gsap, version } from '../src';
describe('Mini-GSAP Setup', () => {
it('should export version', () => {
expect(version).toBe('0.1.0');
});
it('should export gsap object', () => {
expect(gsap).toBeDefined();
expect(typeof gsap.to).toBe('function');
expect(typeof gsap.from).toBe('function');
expect(typeof gsap.timeline).toBe('function');
});
});9. 验证环境
运行以下命令验证环境配置:
bash
# 构建项目
pnpm build
# 运行测试
pnpm test:run如果看到测试通过的输出,说明开发环境已经就绪。
小结
本章我们完成了:
- 选择了 TypeScript + tsup + Vitest 技术栈
- 创建了标准的项目结构
- 配置了构建和测试工具
- 编写了入口文件雏形
- 验证了环境可用性
下一章,我们将深入动画的基础原理,理解 Web 动画的底层机制。