Rasmus Andersson released markdown-wasm, a very fast Markdown parser ported from C to WebAssembly. markdown-wasm is twice as fast as the best JavaScript Markdown parser in one benchmark. markdown-wasm remains additionally small (31KB gzipped).
In a benchmark that runs markdown-wasm and other popular Markdown parsers (e.g. markdown-it, commonmark, marked and showdown) against a series of sample Markdown files that cover the CommonMark specification, markdown-wasm parses the sample files twice as fast as markdown-it, the next fastest contender:
(average operations per seconds. Source: markdown-wasm GitHub)
It seems to do so by being consistently faster than the benchmarked alternatives:
(min-max parse time, logarithmic scale. Source: markdown-wasm GitHub)
markdown-wasm leverages MD4C (markdown for C), a Markdown parser written in C that is compliant with the CommonMark specification. markdown-wasm ports MD4C to WebAssembly with the wasmc
utility that handles the compiling, linking, and packaging of C and C++ WASM/JS projects. markdown-wasm has no dependencies.
markdown-wasm exposes a single parse
API that takes Markdown content (JavaScript string or UTF8 encoded data) and converts it to HTML (returned as a JavaScript string or an Uint8Array
). markdown-wasm can be used in Node.js, the browser, or built from source with wasmc
.
Computations can be performed faster by doing less work (via more efficient algorithms and data structures), doing work in parallel (leveraging multi-core architectures), or simply doing work faster (e.g., compiling vs. interpreting, AOT vs. JIT compilation). When performance matters, developers often use languages that are designed for efficient compilation and execution of source code across several computation cores (Rust, Go, C, and more). markdown-wasm participates in a growing trend of software that developers write in compile-to-native languages for performance — then eventually port to WebAssembly so the software can run in a variety of target environments and runtimes (e.g., in the browser).
Performance may not however be always all that matters. The markdown-it parser is for instance easy to extend with JavaScript plugins. Such extensibility facilitates community contributions and the growth of an ecosystem of plugins.
Developers can try out markdown-wasm thanks to a dedicated playground. While markdown-wasm should support mathematical notations (e.g. $x_0$
), the playground does not. markdown-wasm supports all features specified in the CommonMark Markdown flavor and additional extensions.
markdown-wasm can be used in the browser as follows:
<script src="markdown.js"></script>
<script>
window["markdown"].ready.then(markdown => {
console.log(markdown.parse("# hello\n*world*"))
})
</script>
markdown-wasm can be used in Node.js as follows:
const markdown = require("./dist/markdown.node.js")
console.log(markdown.parse("# hello\n*world*"))
markdown-wasm is open-source software under the MIT license.