Nuxt解析markdown字符串生成HTML

289 阅读1分钟

安装

npm i @nuxtjs/markdownit

配置nuxt.config

export default{
	// .... other config
	modules: {
	  '@nuxtjs/markdownit'
	},
	markdownit: {
    preset: 'default',
    linkify: true,
    breaks: true,
    runtime: true,
    // 用什么解析插件安装什么解析插件
    // use这里的均需要 npm i进行安装
    use: [
      'markdown-it-div',
      'markdown-it-attrs',
      'markdown-it-highlightjs',
      'markdown-it-mark',
      'markdown-it-deflist',
      'markdown-it-abbr',
      'markdown-it-footnote',
      'markdown-it-ins',
      'markdown-it-sub',
      'markdown-it-sup',
      'markdown-it-toc-and-anchor',
      'markdown-it-task-lists',
      'markdown-it-katex',
      'markdown-it-emoji'
    ]
  }
}

若是use中的组件报错,记得使用npm i 包名进行安装,

组件化

<template>
  <div class="robot-message" v-html="$md.render(markdownStr)"></div>
</template>
<script>

export default {
  name: 'MdCompile',
  props: {
    markdownStr: {
      type: String,
      default: ''
    }
  },
 }
 </script>

因为我使用了reset.css所以部分需要重新定义一下样式

<style>
.robot-message {
  max-width: 768px;
  width: 100%;
}
.markdownIt-Anchor {
  display: none !important;
}
.markdownIt-TOC a {
  color: #409EFF !important;
  text-decoration: none;
}
pre code {
  position: relative;
  background-color: #f6f8fa !important;
  border-radius: 5px !important;
  padding: 30px 10px !important;
  margin: 10px 0 !important;
  border: 1px solid #e1e4e8 !important;
  display: block !important;
  overflow-x: auto !important;
  font-size: 14px !important;
  line-height: 1.6 !important;
  word-break: break-all !important;
  word-wrap: break-word !important;
  color: #24292e !important;
  font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace !important;
}
pre code::before {
  position: absolute;
  top: 10px;
}

pre .language-javascript::before {
  content: 'javascript' !important;
  color: #005cc5 !important;
}
pre .language-css::before {
  content: 'css' !important;
  color: #005cc5 !important;
}
pre .language-html::before {
  content: 'html' !important;
  color: #005cc5 !important;
}
pre .language-bash::before {
  content: 'bash' !important;
  color: #005cc5 !important;
}
pre .language-json::before {
  content: 'json' !important;
  color: #005cc5 !important;
}
pre .language-markdown::before {
  content: 'markdown' !important;
  color: #005cc5 !important;
}
pre .language-nginx::before {
  content: 'nginx' !important;
  color: #005cc5 !important;
}
pre .language-sql::before {
  content: 'sql' !important;
  color: #005cc5 !important;
}
pre .language-xml::before {
  content: 'xml' !important;
  color: #005cc5 !important;
}
pre .language-yaml::before {
  content: 'yaml' !important;
  color: #005cc5 !important;
}
pre .language-java::before {
  content: 'yaml' !important;
  color: #005cc5 !important;
}
pre .language-diff::before {
  content: 'diff' !important;
  color: #005cc5 !important;
}
pre .language-python::before {
  content: 'python' !important;
  color: #005cc5 !important;
}
pre code .hljs-keyword {
  color: #a71d5d !important;
}
.hljs-params {
  color: #6f42c1 !important;
}
.hljs-variable {
  color: #e83e8c !important;
}
.hljs-title {
  color: #d73a49 !important;
}
.hljs-string {
  color: #032f62 !important;
}
.hljs-literal {
  color: #005cc5 !important;
}
</style>