Marked.js生态系统:插件开发与社区贡献
Marked.js作为一个高度可扩展的Markdown解析器,拥有丰富的官方插件生态系统和第三方扩展支持。本文详细介绍了其核心扩展机制,包括钩子系统和扩展配置接口,展示了官方插件如语法高亮和命令行工具的使用方法,以及第三方扩展如表格增强和数学公式支持。同时,文章还涵盖了扩展开发的最佳实践、性能优化考虑和社区贡献指南,为开发者创建高质量扩展提供了全面指导。
官方插件生态与第三方扩展
Marked.js 作为一个高度可扩展的 Markdown 解析器,提供了丰富的官方插件生态系统和第三方扩展支持。通过其强大的钩子系统和灵活的架构设计,开发者可以轻松地定制和扩展 Marked.js 的功能。
核心扩展机制
Marked.js 的扩展性主要基于以下几个核心机制:
钩子系统 (Hooks System)
钩子系统是 Marked.js 扩展的核心,允许开发者在解析过程的不同阶段注入自定义逻辑。系统提供了多个关键钩子:
class _Hooks<ParserOutput = string, RendererOutput = string> {
// 预处理阶段 - 在解析前处理原始 Markdown
preprocess(markdown: string): string;
// 后处理阶段 - 在解析后处理生成的 HTML
postprocess(html: ParserOutput): ParserOutput;
// 令牌处理 - 处理所有令牌
processAllTokens(tokens: Token[] | TokensList): Token[] | TokensList;
// 提供自定义词法分析器
provideLexer(): Function;
// 提供自定义解析器
provideParser(): Function;
}
扩展配置接口
Marked.js 提供了完整的扩展配置接口,支持多种扩展方式:
interface MarkedExtension<ParserOutput = string, RendererOutput = string> {
hooks?: HooksObject<ParserOutput, RendererOutput> | null;
renderer?: Partial<RendererObject> | null;
tokenizer?: Partial<TokenizerObject> | null;
extensions?: MarkedExtension<ParserOutput, RendererOutput>[] | null;
// ... 其他配置选项
}
官方插件生态系统
Marked.js 维护了一系列高质量的官方插件,这些插件经过严格测试并与核心库保持同步更新:
语法高亮插件 (marked-highlight)
import { marked } from 'marked';
import { markedHighlight } from 'marked-highlight';
import hljs from 'highlight.js';
// 配置语法高亮扩展
marked.use(markedHighlight({
langPrefix: 'hljs language-',
highlight(code, lang) {
const language = hljs.getLanguage(lang) ? lang : 'plaintext';
return hljs.highlight(code, { language }).value;
}
}));
// 使用扩展后的 marked
const html = marked.parse('```js\nconsole.log("Hello World");\n```');
命令行工具插件 (marked-man)
import { marked } from 'marked';
import { markedMan } from 'marked-man';
// 配置 man page 格式输出
marked.use(markedMan());
// 生成 man page 格式内容
const manOutput = marked.parse('# MARKED(1)');
自定义渲染器扩展
// 自定义渲染器示例
const customRenderer = {
heading(text: string, level: number) {
return `<h${level} class="custom-heading">${text}</h${level}>`;
},
code(code: string, language: string | undefined) {
return `<pre><code class="language-${language}">${escape(code)}</code></pre>`;
}
};
marked.use({ renderer: customRenderer });
第三方扩展生态
除了官方插件,社区还开发了大量高质量的第三方扩展:
表格增强扩展
// 表格增强插件示例
marked.use({
extensions: [{
name: 'table',
level: 'block',
start(src) { return src.match(/^\|/)?.index; },
tokenizer(src) {
const match = src.match(/^\|(.+)\|\n\|([\-:\| ]+)\|\n((?:\|.*\|\n)*)/);
if (match) {
return {
type: 'table',
raw: match[0],
header: match[1].split('|').map(cell => cell.trim()),
align: match[2].split('|').map(align => {
if (align.includes(':')) return align.includes('-') ? 'center' : 'left';
return null;
}),
rows: match[3].split('\n').filter(Boolean).map(row =>
row.split('|').map(cell => cell.trim())
)
};
}
},
renderer(token) {
// 自定义表格渲染逻辑
}
}]
});
数学公式支持
// MathJax 集成示例
marked.use({
hooks: {
postprocess(html) {
return html.replace(/\$\$(.*?)\$\$/g, '<div class="math">$1</div>')
.replace(/\$(.*?)\$/g, '<span class="math-inline">$1</span>');
}
}
});
扩展开发最佳实践
插件架构设计
flowchart TD
A[用户输入 Markdown] --> B[preprocess 钩子]
B --> C[词法分析 Lexer]
C --> D[令牌处理 processAllTokens]
D --> E[解析器 Parser]
E --> F[渲染器 Renderer]
F --> G[postprocess 钩子]
G --> H[最终输出 HTML]
style B fill:#e1f5fe
style D fill:#e1f5fe
style G fill:#e1f5fe
类型安全的扩展开发
// 类型安全的钩子函数定义
interface CustomHooks {
preprocess: (markdown: string) => string | Promise<string>;
postprocess: (html: string) => string | Promise<string>;
}
// 扩展配置类型
interface MarkedExtensionConfig {
hooks?: Partial<CustomHooks>;
renderer?: Partial<RendererObject>;
tokenizer?: Partial<TokenizerObject>;
}
// 安全的扩展应用函数
function applyExtension(config: MarkedExtensionConfig) {
marked.use(config as any);
}
性能优化考虑
开发扩展时需要考虑性能影响:
| 扩展类型 | 性能影响 | 优化建议 |
|---|---|---|
| 预处理钩子 | 低 | 避免复杂字符串操作 |
| 令牌处理 | 中 | 使用高效的数据结构 |
| 后处理钩子 | 高 | 减少 DOM 操作,使用缓存 |
| 自定义渲染器 | 可变 | 避免重复创建对象 |
社区贡献指南
Marked.js 社区欢迎各种类型的扩展贡献:
- 代码质量:遵循项目的编码规范和测试标准
- 文档完善:提供详细的使用文档和示例
- 向后兼容:确保扩展不会破坏现有功能
- 性能考虑:进行性能测试和优化
- 测试覆盖:提供完整的单元测试和集成测试
通过遵循这些最佳实践,开发者可以创建出高质量、高性能的 Marked.js 扩展,丰富整个生态系统。
代码贡献指南与PR流程
作为Marked.js生态系统的核心组成部分,代码贡献是推动项目发展的关键动力。Marked.js社区建立了一套完善的贡献流程,确保代码质量、规范性和可维护性。本文将详细介绍从环境搭建到PR合并的完整贡献流程。
环境准备与项目初始化
在开始贡献代码之前,需要正确设置开发环境。Marked.js要求Node.js版本不低于20,确保使用兼容的运行时环境。
# 克隆项目到本地
git clone https://gitcode.com/gh_mirrors/ma/marked.git
cd marked
# 切换到master分支
git checkout master
# 安装项目依赖
npm install
项目结构采用模块化设计,主要源代码位于src目录,编译后的文件输出到lib目录。开发过程中应始终在src目录下进行修改,避免直接编辑lib中的自动生成文件。
代码规范与质量要求
Marked.js遵循严格的代码质量标准和设计原则,主要基于SOLID设计原则,特别是单一职责原则和开闭原则。
flowchart TD
A[代码贡献] --> B[遵循单一职责原则]
A --> C[遵循开闭原则]
B --> D[每个组件专注单一功能]
C --> E[通过扩展而非修改实现新功能]
D --> F[清晰的模块边界]
E --> G[易于维护和扩展]
项目使用ESLint进行代码规范检查,配置基于@markedjs/eslint-config。提交前应运行lint检查:
# 检查代码规范
npm run test:lint
# 自动修复可修复的问题
npm run lint
测试策略与验证流程
全面的测试覆盖是Marked.js质量保证的核心。项目包含多种类型的测试,确保功能正确性和规范兼容性。
| 测试类型 | 目录位置 | 描述 | 运行命令 |
|---|---|---|---|
| 规范测试 | /test/specs/ |
CommonMark和GFM规范兼容性 | npm run test:specs |
| 单元测试 | /test/unit/ |
组件级别功能测试 | npm run test:unit |
| 类型测试 | - | TypeScript类型定义验证 | npm run test:types |
| 性能测试 | - | 性能基准比较 | npm run bench |
测试用例编写应遵循以下模式:
// 示例:为新的Markdown特性添加测试
describe('new feature', () => {
it('should handle basic case', () => {
const result = marked.parse('**bold** text');
expect(result).toContain('<strong>bold</strong>');
});
it('should handle edge cases', () => {
const result = marked.parse('**bold** _italic_');
expect(result).toContain('<strong>bold</strong> <em>italic</em>');
});
});
PR提交流程与规范
提交Pull Request时,应遵循标准化的流程和模板要求。Marked.js提供了PR模板,包含提交者和评审者的检查清单。
sequenceDiagram
participant D as 开发者
participant R as 评审者
participant C as CI系统
D->>D: 创建功能分支
D->>D: 实现功能并测试
D->>C: 运行完整测试套件
C-->>D: 测试结果反馈
D->>D: 修复发现问题
D->>R: 提交PR
R->>R: 代码审查
R->>D: 提供反馈意见
D->>D: 根据反馈修改
D->>R: 更新PR
R->>R: 最终审核
R->>D: 合并PR
PR提交前必须确保:
- 所有测试通过:运行
npm run test:all确保无测试失败 - 代码规范合规:ESLint检查无错误
- 编译文件清理:运行
npm run build:reset移除编译产物变更 - 提交信息规范:遵循约定式提交规范
优先级与问题分类
Marked.js使用明确的优先级标签对问题和PR进行分类,确保资源合理分配:
| 优先级 | 标签 | 描述 | 响应时间要求 |
|---|---|---|---|
| L0 | security | 安全漏洞 | 立即处理 |
| L1 | broken | 功能损坏无替代方案 | 高优先级 |
| L2 | annoying | 功能损坏有替代方案 | 中等优先级 |
| RR | refactor | 重构和性能优化 | 按计划处理 |
| NFS | new feature (spec) | 规范相关新功能 | 按路线图 |
| NFU | new feature (user) | 用户请求新功能 | 社区投票 |
构建与发布流程
贡献的代码需要经过完整的构建流程验证:
# 完整构建流程
npm run build
# 生成ES模块版本
npm run build:esbuild
# 生成类型定义
npm run build:types
# 生成man文档
npm run build:man
构建系统使用esbuild进行打包,TypeScript进行类型检查,确保输出的多种格式(ESM、UMD、CJS)都正确无误。
代码审查要点
PR审查时重点关注以下方面:
- 功能正确性:输出结果符合Markdown规范
- 性能影响:不引入性能回归
- 向后兼容:不破坏现有API
- 测试覆盖:包含充分的测试用例
- 文档更新:相应的文档和示例更新
通过遵循这套完整的贡献流程,开发者可以高效地为Marked.js生态系统做出有价值的贡献,同时确保代码质量和项目稳定性。
测试套件设计与自动化测试
Marked.js 作为一个成熟的 Markdown 解析器,拥有完善的测试体系,确保代码质量和功能稳定性。测试套件采用分层架构设计,涵盖了单元测试、规范测试、性能测试和安全性测试等多个维度。
测试架构设计
Marked.js 的测试架构采用模块化设计,通过不同的测试类型确保全面覆盖:
flowchart TD
A[Marked.js 测试体系] --> B[单元测试]
A --> C[规范测试]
A --> D[性能测试]
A --> E[安全性测试]
B --> B1[核心模块测试]
B --> B2[扩展功能测试]
B --> B3[边界条件测试]
C --> C1[CommonMark 规范]
C --> C2[GFM 规范]
C --> C3[自定义规范]
D --> D1[基准性能测试]
D --> D2[回归性能测试]
E --> E1[ReDoS 攻击防护]
E --> E2[XSS 注入防护]
单元测试体系
单元测试位于 test/unit/ 目录,针对核心模块进行精细化测试:
| 测试文件 | 测试内容 | 覆盖范围 |
|---|---|---|
marked.test.js |
核心解析功能 | 基本语法、扩展功能、边界条件 |
Lexer.test.js |
词法分析器 | 令牌生成、语法识别 |
Parser.test.js |
语法解析器 | AST 构建、语法树转换 |
Hooks.test.js |
钩子函数 | 预处理、后处理逻辑 |
instance.test.js |
实例管理 | 多实例隔离、配置管理 |
// 典型的单元测试示例
describe('inlineLexer', () => {
it('should send html to renderer.html', () => {
const renderer = new Renderer();
mock.method(renderer, 'html');
const md = 'HTML Image: <img alt="MY IMAGE" src="example.png" />';
marked.parse(md, { renderer });
assert.strictEqual(
renderer.html.mock.calls[0].arguments[0].raw,
'<img alt="MY IMAGE" src="example.png" />'
);
});
});
规范测试套件
规范测试确保 Marked.js 符合各种 Markdown 标准,测试用例存储在 test/specs/ 目录:
| 规范类型 | 测试用例数 | 合规要求 |
|---|---|---|
| CommonMark | 600+ | 完全兼容 CommonMark 0.31.2 |
| GitHub Flavored Markdown | 100+ | 支持 GFM 扩展语法 |
| 原始规范 | 50+ | 向后兼容性保证 |
| 新功能测试 | 30+ | 自定义扩展功能 |
测试运行器使用 @markedjs/testutils 包来执行规范验证:
import { getTests, runTests, outputCompletionTable } from '@markedjs/testutils';
const [commonMarkTests, gfmTests] = await getTests([
'./specs/commonmark',
'./specs/gfm'
]);
outputCompletionTable('CommonMark', commonMarkTests);
runTests({
tests: commonMarkTests,
parse,
defaultMarkedOptions: { gfm: false, pedantic: false }
});
自动化测试流程
Marked.js 采用完整的 CI/CD 流水线,自动化测试流程如下:
sequenceDiagram
participant D as 开发者提交
participant G as GitHub Actions
participant T as 测试运行器
participant R as 测试报告
D->>G: 推送代码到仓库
G->>T: 启动测试任务
T->>T: 运行单元测试
T->>T: 执行规范测试
T->>T: 进行性能基准测试
T->>T: 安全性扫描
T->>R: 生成测试报告
R->>G: 返回测试结果
G->>D: 通知构建状态
测试工具与框架
项目使用现代化的测试工具链:
| 工具 | 用途 | 配置位置 |
|---|---|---|
| Node.js Test Runner | 单元测试框架 | package.json scripts |
| @markedjs/testutils | 规范测试工具 | test/run-spec-tests.js |
| Benchmark.js | 性能测试 | test/bench.js |
| ESLint | 代码质量检查 | eslint.config.js |
测试配置示例:
{
"scripts": {
"test": "node --test test/unit/",
"test:specs": "node test/run-spec-tests.js",
"test:all": "npm run test && npm run test:specs",
"benchmark": "node test/bench.js"
}
}
测试覆盖率与质量指标
Marked.js 追求高测试覆盖率,关键质量指标包括:
| 指标类型 | 目标值 | 当前状态 |
|---|---|---|
| 单元测试覆盖率 | >90% | 通过 jest 覆盖率报告 |
| 规范兼容性 | 100% | CommonMark 0.31.2 全通过 |
| 构建通过率 | 100% | GitHub Actions 绿色构建 |
| 性能回归 | <5% | 基准测试监控 |
自定义测试工具
项目提供了专用的测试工具函数,位于 test/unit/utils.js:
// 异步测试工具函数
export async function timeout(ms = 1) {
return new Promise(resolve => {
setTimeout(resolve, ms);
});
}
// 测试用例中使用示例
it('should handle async operations', async () => {
const start = Date.now();
await timeout(100);
const duration = Date.now() - start;
assert.ok(duration >= 100);
});
测试数据管理
测试用例使用结构化的数据管理方式:
mindmap
root(测试数据管理)
(规范测试数据)
(CommonMark 规范)
(GFM 扩展)
(原始语法)
(单元测试数据)
(正常用例)
(边界用例)
(错误用例)
(性能测试数据)
(大规模文档)
(复杂语法)
(边缘情况)
(安全测试数据)
(ReDoS 攻击模式)
(XSS 注入向量)
每个测试目录包含对应的 .md 源文件和 .html 预期输出文件,确保测试的可重复性和可维护性。
测试运行策略
测试执行采用分层策略,确保高效和可靠:
- 快速反馈层: 单元测试优先运行,提供即时反馈
- 兼容性验证层: 规范测试确保标准兼容性
- 性能监控层: 基准测试防止性能回归
- 安全防护层: 安全测试阻断潜在漏洞
这种测试套件设计使得 Marked.js 能够在保持高性能的同时,确保代码质量和功能稳定性,为开发者提供可靠的 Markdown 解析解决方案。
文档编写与社区维护最佳实践
在开源项目的生态系统中,高质量的文档和有效的社区维护是项目成功的关键因素。Marked.js 作为一个成熟的 Markdown 解析器项目,在文档编写和社区维护方面积累了丰富的实践经验,这些实践为其他开源项目提供了宝贵的参考。
文档体系架构设计
Marked.js 采用分层文档架构,确保不同层次的用户都能找到所需信息:
flowchart TD
A[Marked.js 文档体系] --> B[入门指南]
A --> C[高级使用]
A --> D[扩展开发]
A --> E[API 参考]
A --> F[贡献指南]
B --> B1[快速开始]
B --> B2[基础示例]
C --> C1[配置选项]
C --> C2[安全考虑]
D --> D1[插件开发]
D --> D2[自定义渲染器]
E --> E1[方法文档]
E --> E2[类型定义]
F --> F1[代码贡献]
F --> F2[文档贡献]
F --> F3[问题报告]
这种分层架构确保了文档的完整性和易用性,每个层次的用户都能快速定位到所需内容。
自动化文档生成与验证
Marked.js 采用自动化工具链来确保文档质量和一致性:
| 工具类型 | 工具名称 | 用途描述 | 配置位置 |
|---|---|---|---|
| 构建工具 | esbuild | 构建项目并生成文档 | esbuild.config.js |
| 代码检查 | ESLint | 代码规范和文档格式检查 | eslint.config.js |
| 测试框架 | Mocha/Jest | 文档示例代码验证 | test/ 目录 |
| 类型检查 | TypeScript | API 文档类型验证 | tsconfig.json |
项目通过配置严格的 CI/CD 流程,确保每次提交都会自动验证文档的正确性:
# 文档构建和验证流程
npm run build # 构建项目
npm run test # 运行测试(包含文档示例验证)
npm run lint # 代码和文档格式检查
社区贡献者管理框架
Marked.js 建立了清晰的社区角色体系,确保项目健康可持续发展:
classDiagram
class CommunityRole {
+String title
+String[] responsibilities
+Integer maxCount
}
class Contributor {
+String name
+String[] badges
+Date joinDate
}
CommunityRole <|-- Publisher
CommunityRole <|-- Admin
CommunityRole <|-- Committer
CommunityRole <|-- Contributor
Publisher : +releaseManagement()
Publisher : +stakeholderCommunication()
Admin : +communityMaintenance()
Admin : +governanceManagement()
Committer : +codeReview()
Committer : +PRMerging()
Contributor : +issueReporting()
Contributor : +PRSubmission()
文档质量保证机制
为确保文档质量,Marked.js 实施以下质量控制措施:
1. 示例代码验证 所有文档中的代码示例都必须通过自动化测试验证:
// 文档示例必须包含测试用例
describe('Documentation Examples', () => {
it('should render basic markdown correctly', () => {
const result = marked.parse('# Hello World');
expect(result).toBe('<h1>Hello World</h1>');
});
});
2. 版本兼容性标注 文档中明确标注功能支持的版本范围:
| 功能特性 | 引入版本 | 弃用版本 | 替代方案 |
|---|---|---|---|
| 旧版配置方式 | v1.0.0 | v3.0.0 | 使用新的 Options API |
| 特定解析规则 | v2.5.0 | v4.0.0 | 自定义扩展实现 |
3. 多语言支持策略 虽然主要文档使用英文,但项目鼓励社区贡献多语言翻译:
<!-- 中文翻译示例 -->
# 快速开始
## 安装
```bash
npm install marked
基本用法
import { marked } from 'marked';
const html = marked.parse('# 你好世界');
### 社区沟通与协作规范
有效的社区沟通是项目成功的关键。Marked.js 建立了明确的沟通规范:
**Issue 模板标准化**
```markdown
## 问题描述
[清晰描述遇到的问题]
## 重现步骤
1.
2.
3.
## 期望行为
[描述期望的结果]
## 实际行为
[描述实际发生的结果]
## 环境信息
- Marked 版本:
- Node.js 版本:
- 操作系统:
PR 审核流程
sequenceDiagram
participant C as Contributor
participant B as Bot (CI/CD)
participant R as Reviewer
participant M as Maintainer
C->>B: 提交 PR
B->>B: 运行自动化测试
B-->>C: 测试结果反馈
R->>C: 代码审查评论
C->>C: 根据反馈修改
C->>B: 更新 PR
B->>B: 重新运行测试
R->>M: 推荐合并
M->>C: 合并 PR
知识传承与新人引导
为帮助新贡献者快速上手,项目提供了详细的新人引导材料:
贡献者成长路径
timeline
title 贡献者成长时间线
section 第1周
阅读贡献指南 : 了解项目规范
设置开发环境 : 完成本地配置
section 第2-3周
修复简单问题 : 开始实际贡献
参与代码审查 : 学习最佳实践
section 第4-8周
实现小功能 : 积累项目经验
协助文档改进 : 加深项目理解
section 2-3个月
成为Committer : 获得合并权限
指导新贡献者 : 传承项目知识
新人任务分类
| 任务类型 | 难度 | 预计时间 | 学习价值 | 示例任务 |
|---|---|---|---|---|
| 文档改进 | 低 | 2-4小时 | 了解项目结构 | 修复错别字,补充示例 |
| 测试用例 | 中 | 4-8小时 | 理解功能逻辑 | 添加边界情况测试 |
| Bug修复 | 中高 | 8-16小时 | 深入代码实现 | 修复已知问题 |
| 功能开发 | 高 | 16+小时 | 完整开发流程 | 实现新特性 |
持续改进与反馈循环
Marked.js 建立了有效的反馈机制来持续改进文档和社区体验:
文档反馈收集表
## 文档反馈
- [ ] 内容准确性问题
- [ ] 示例代码错误
- [ ] 缺少重要信息
- [ ] 组织结构问题
- [ ] 语言表达问题
## 改进建议
[详细描述改进建议]
## 优先级
- [ ] 紧急(阻碍使用)
- [ ] 重要(影响理解)
- [ ] 一般(体验优化)
通过实施这些最佳实践,Marked.js 建立了一个健康、活跃的开发者社区,确保了项目的长期可持续发展。这些经验为其他开源项目提供了可借鉴的模板,特别是在文档质量和社区维护方面。
Marked.js通过完善的插件生态系统和社区贡献机制,确保了项目的高质量和可持续发展。其分层文档架构、自动化测试流程和清晰的社区角色体系,为开发者提供了全面的支持和引导。这些最佳实践不仅丰富了Marked.js的功能和性能,也为其他开源项目提供了可借鉴的经验,特别是在文档质量、测试覆盖和社区维护方面。通过遵循这些实践,开发者可以更有效地参与贡献,共同推动Marked.js生态系统的繁荣发展。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00