Marked是什么
Marked.js 是:
- 为速度而生:高性能的底层 Markdown 编译器,解析时无缓存或长时间阻塞问题。
- 轻量高效:在保持轻量的同时,支持所有主流 Markdown 语法规范。
- 跨平台运行:可作为命令行工具(CLI),也可运行于客户端/服务端 JavaScript 环境。
注:基准测试仍在进行中,执行速度会随严格遵循不同规范的程度变化
* 设计原则是尽可能减少依赖
*** 完全遵循规范可能导致处理速度降低
演示
访问https://marked.js.org/demo/查看实际效果 ⛹️
本文档的所有页面也是用 Marked 渲染的 💯
安装
命令行工具安装:
npm install -g marked
浏览器环境安装:
npm install marked
使用
⚠️ 重要安全警告:
Marked 不会自动净化输出的 HTML。处理不可信字符串时,必须过滤潜在的 XSS 攻击。推荐使用以下过滤库:
- https://github.com/cure53/DOMPurify(推荐)
- https://github.com/leizongmin/js-xss
- https://github.com/apostrophecms/sanitize-html
- https://github.com/bevacqua/insane
// 使用DOMPurify过滤输出
DOMPurify.sanitize(marked.parse(`<img src="x" onerror="alert('攻击')">`));
⚠️ 特殊字符警告:
零宽度Unicode字符(如\uFEFF
)可能干扰解析(某些编辑器会在文件开头添加):
// 移除开头的常见零宽度字符
marked.parse(
contents.replace(/^[\u200B\u200C\u200D\u200E\u200F\uFEFF]/, "")
)
命令行使用
从stdin输入:
echo "hello world" | marked -o hello.html
cat hello.html # 输出: <p>hello world</p>
字符串输入:
marked -s "*hello world*" # 输出: <p><em>hello world</em></p>
文件输入:
echo "**加粗文本**" > readme.md
marked -i readme.md -o readme.html
cat readme.html # 输出: <p><strong>加粗文本</strong></p>
查看帮助:
marked --help
CLI配置
可通过配置文件定制marked行为:
.json
文件:包含传递给marked的配置对象.js
文件:需通过export default
导出配置对象或函数
默认配置文件搜寻路径(按顺序):
~/.marked.json
~/.marked.js
~/.marked/index.js
配置示例:
echo '{ "breaks": true }' > config.json
marked -s '第一行\n第二行' -c config.json
# 输出: <p>第一行<br>第二行</p>
浏览器端使用
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Marked浏览器示例</title>
</head>
<body>
<div id="content"></div>
<script src="https://cdn.jsdelivr.net/npm/marked/lib/marked.umd.js"></script>
<script>
document.getElementById('content').innerHTML =
marked.parse('# 浏览器中使用Marked\n\n由**marked**渲染');
</script>
</body>
</html>
ES模块导入:
<script type="module">
import { marked } from "https://cdn.jsdelivr.net/npm/marked/lib/marked.esm.js";
document.getElementById('content').innerHTML =
marked.parse('# 浏览器中使用Marked\n\n由**marked**渲染');
</script>
Node.js使用
// ESM语法
import { marked } from 'marked';
// 或CommonJS语法
// const { marked } = require('marked');
const html = marked.parse('# Node.js中使用Marked\n\n由**marked**渲染');
Marked 还支持高级配置和扩展功能
支持的Markdown规范
我们主动兼容以下规范:
- ✅ Markdown 1.0 (100%)
- ✅ CommonMark 0.31 (98%)
- ✅ GitHub Flavored Markdown 0.29 (97%)
兼容以上规范意味着Marked也可处理其他变体语法,但这些不提供官方支持。
使用Marked的工具
以下工具利用Marked实现高性能转换:
工具 | 描述 |
---|---|
https://github.com/zerodevx/zero-md | 原生Markdown转HTML的Web组件 |
https://github.com/susam/texme | 创建自渲染的Markdown+LaTeX文档 |
http://strapdownjs.com | 轻量级实时Markdown处理器 |
https://github.com/psychobunny/raito | 8KB的迷你Markdown Wiki系统 |
https://homebrewery.naturalcrit.com | 制作D&D风格文档的工具 |
https://github.com/lexdene/marked_reader | 基于Electron的Markdown阅读器 |
安全性
我们极度重视Marked的安全性:
- 📧 漏洞报告请邮件至NPM项目所有者和维护者
- ⏱️ 48小时内提供初步评估
- ⚙️ 2周内发布修复补丁(欢迎直接提交PR)
唯一绝对安全的系统是不存在的系统 —— 但这不影响我们追求卓越
总结
Marked.js 是当前最轻量高效的Markdown解析解决方案:
- 性能卓越:采用无阻塞解析架构,适合高频处理场景
- 环境灵活:从命令行到浏览器再到Node.js均可无缝集成
- 规范支持全面:完整支持三大主流Markdown标准
- 扩展性强:提供丰富配置接口和扩展机制
- 生态成熟:被众多知名工具选为核心解析引擎
对于需要快速、安全处理Markdown的应用场景,Marked.js是经得起验证的理想选择。开发者应特别注意输出净化问题,配合DOMPurify等库可构建完整的安全防护体系。