介绍

marked 是一个基于 JavaScript 的 Markdown 解析器和编译器。它可以将 Markdown 语法解析为 HTML,并且可以扩展 Markdown 的功能。Marked 可以在浏览器端和 Node.js 环境下运行。

使用 Marked 可以轻松地将 Markdown 文本转换为 HTML 文档,而无需手动编写 HTML 代码。它支持 Markdown 的所有基本语法,如标题、段落、列表、链接、图片等。此外,Marked 还支持一些扩展语法,如表格、代码块、代码高亮、删除线、粗体、斜体等。

npm 方式

下面是 Vue3 的官网示例 - 一个简单的 markdown 编辑器。通过 ES Module 方式导入 marked 对象,然后通过 computed 计算属性根据左侧文本框内容将生成的 HTML 代码插入到右侧页面元素中,动态更新其内容,这里配合指令 v-html 将内容直接作为普通 HTML 插入。还使用了 lodash-es 模块的防抖函数 debounce,防止输入频率导致的性能问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<template>
<div class="editor">
<textarea class="input" :value="input" @input="update"></textarea>
<div class="output" v-html="output"></div>
</div>
</template>
<script setup>
import { marked } from 'marked'
import { debounce } from 'lodash-es'
import { ref, computed } from 'vue'
const input = ref('# hello')
const output = computed(() => marked(input.value))
const update = debounce((e) => {
input.value = e.target.value
}, 100)
</script>
<style>
body {
margin: 0;
}
.editor {
height: 100vh;
display: flex;
}
.input,
.output {
overflow: auto;
width: 50%;
height: 100%;
box-sizing: border-box;
padding: 0 20px;
}
.input {
border: none;
border-right: 1px solid #ccc;
resize: none;
outline: none;
background-color: #f6f6f6;
font-size: 14px;
font-family: 'Monaco', courier, monospace;
padding: 20px;
}
code {
color: #f66;
}
</style>

CDN 方式

只需要在你的 HTML 文档中引入 marked.js 文件,然后使用 JavaScript 代码调用 marked 对象的函数即可将 Markdown 文本转换为 HTML。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<body>
<div class="editor">
<textarea class="input" id="input"></textarea>
<div class="output" id="output"></div>
</div>
</body>
<script src="<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>"></script>
<script>
function debounce(fn, delay = 200) {
let timer;
return function() {
clearTimeout(timer);
timer = setTimeout(fn.bind(this, ...arguments), delay);
}
}
input.value = '# hello'
output.innerHTML = marked.parse(input.value)
input.oninput = debounce((e) => {
input.value = e.target.value
output.innerHTML = marked.parse(input.value)
}, 500)
</script>
<style>
body {
margin: 0;
}
.editor {
height: 100vh;
display: flex;
}
.input,
.output {
overflow: auto;
width: 50%;
height: 100%;
box-sizing: border-box;
padding: 0 20px;
}
.input {
border: none;
border-right: 1px solid #ccc;
resize: none;
outline: none;
background-color: #f6f6f6;
font-size: 14px;
font-family: 'Monaco', courier, monospace;
padding: 20px;
}
code {
color: #f66;
}
</style>

配置

marked 提供了许多配置选项,可以用来自定义转换过程中的行为和输出结果。

  1. gfm:启用 GitHub 风格的 Markdown。默认为 true
  2. breaks:将行内的换行符转换为 <br>。默认为 false
  3. sanitize:启用 HTML 标签的转义。默认为 false
  4. smartLists:启用智能列表。默认为 true,即自动将 - 和 * 转换为无序列表,而将数字和 . 转换为有序列表。
  5. smartypants:启用智能标点。默认为 false,即不自动将引号和破折号转换为智能标点。
  6. highlight:用于高亮代码块的函数。默认为 null,即不进行代码高亮。
  7. renderer:用于自定义输出 HTML 的渲染器。默认为 new marked.Renderer(),即使用默认的渲染器。

这些配置选项可以通过一个 JavaScript 对象进行设置,然后作为第二个参数传递给 marked 函数。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const marked = require('marked');

const markdown = '# Hello, world!';
const options = {
gfm: true,
breaks: true,
smartLists: true,
highlight: function(code) {
return require('highlight.js').highlightAuto(code).value;
}
};

const html = marked(markdown, options);
console.log(html);

上面的代码将一个 Markdown 字符串转换为 HTML,并启用了 GitHub 风格的 Markdown、智能列表和代码高亮等功能。

仓库和文档地址

  1. https://github.com/markedjs/marked
  2. Marked Documentation