(方法)vue 中展示、读取.md 文件(批量引入、自定义代码块高亮样式)

SubTopH的个人前端项目展示了如何使用Vue和Markdown加载器,实现组件化与交互式文档。通过vue.config.js配置和组件模板,你可以体验到批量导入的MD文件与代码高亮的便利。欢迎访问并提出改进意见。
摘要由CSDN通过智能技术生成

个人项目地址: SubTopH前端开发个人站

(自己开发的前端功能和UI组件,一些有趣的小功能,感兴趣的伙伴可以访问,欢迎提出更好的想法,私信沟通,网站属于静态页面)

SubTopH前端开发个人站icon-default.png?t=N7T8https://subtop.gitee.io/subtoph.github.io/#/home

以上 👆 是个人前端项目,欢迎提出您的建议😊

以下是正文内容...............

 1.首先安装以下依赖

  • vue-markdown-loader
  • vue-loader
  • vue-template-compiler
  • github-markdown-css
  • highlight.js
npm install vue-markdown-loader  -D
npm install vue-loader  -D
npm install vue-template-compiler  -D
npm install github-markdown-css  -D
npm install highlight.js  -D

2.在 vue.config.js 文件中配置 webpack

module.exports = {
  chainWebpack: (config) => {
    config.module
      .rule("md")
      .test(/\.md/)
      .use("vue-loader")
      .loader("vue-loader")
      .end()
      .use("vue-markdown-loader")
      .loader("vue-markdown-loader/lib/markdown-compiler")
      .options({
        raw: true,
      });
  },
};

3.组件中使用时

单个文件使用可在组件内单独引用

  • main.js 中引入样式
// markdown样式
import "github-markdown-css";
// 代码高亮
import "highlight.js/styles/github.css"; //默认样式
  • vue 组件中使用
  • 将 md 文件作为组件导入,注意:class 的值必须包含 markdown-body ,否则样式无法生效!
<template>
  <demo-md class="markdown-body"></demo-md>
</template>

<script>
import DemoMd from './demo.md';
export default {
  components: {
    DemoMd
  }
}
</script>

批量导入多个文件

  • 在 md 文件同目录中创建 index.js 文件,导入 md 文件
// md文件批量引入
import javaScript_prototype from "./javaScript_prototype.md";
import git_basics from "./git_basics.md";
import click_copy from "./click_copy.md";
// 创建md组件同时设置文章其他信息,单独导出使用
export const components = {
  click_copy: {
    id: 3,
    name: click_copy,
    type: ["html", "javaScript", "vue"],
    describe: "JavaScript页面点击复制功能(vue)",
    date: "2021-11-23 15:51:00",
  },
  git_basics: {
    id: 2,
    name: git_basics,
    type: ["git"],
    describe: "git 基础使用(创建、推送、克隆、拉取、常用指令等)",
    date: "2021-11-23 14:22:00",
  },
  javaScript_prototype: {
    id: 1,
    name: javaScript_prototype,
    type: ["javaScript"],
    describe: "个人对 javaScript 原型链理解",
    date: "2021-11-22 10:00:00",
  },
};
// 注册全部md组件
export const mdArticle = function (Vue, opts = {}) {
  Object.keys(components).forEach((key) => {
    Vue.component(key, components[key].name);
  });
};

在 main.js 文件中引入刚刚创建的 index.js 文件,导出全部 me 组件,全局注册

  • 引入markdown样式和高亮样式
// markdown样式
import "github-markdown-css";
// 代码高亮
import "highlight.js/styles/github.css"; //默认样式

// 代码高亮devibeans   swh自定义颜色
// import './assets/css/swh.css'           //自定义样式

// 引入md文章组件列表
import { mdArticle } from "./article/index";
Vue.use(mdArticle);

自定义代码代码块高亮样式(文件中自行修改颜色)

  • 创建 css 文件
/* 代码块高亮样式 */
pre code.hljs {
  display: block;
  overflow-x: auto;
  padding: 1em;
}
code.hljs {
  padding: 3px 5px;
}
.hljs {
  color: #eaeaea;
  background: #000;
}
.hljs-subst {
  color: #eaeaea;
}
.hljs-emphasis {
  font-style: italic;
}
.hljs-strong {
  font-weight: 700;
}
.hljs-type {
  color: #eaeaea;
}
/* 参数 */
.hljs-params {
  color: #ea00ff;
}

/* true颜色 */
.hljs-literal,
.hljs-name,
.hljs-number {
  color: rgb(105, 195, 255);
  font-weight: bolder;
}
/* 注释颜色 */
.hljs-comment {
  color: #8a8a8a;
}
.hljs-quote,
.hljs-selector-id {
  color: #0ff;
}
/* 函数颜色 */
.hljs-template-variable,
.hljs-title,
.hljs-variable {
  color: #c3bf7b;
  font-weight: 700;
}

/* 对象颜色 */
.hljs-keyword,
.hljs-selector-class,
.hljs-symbol {
  color: #9d6bb4;
}
/* 值的颜色 */
.hljs-bullet,
.hljs-string {
  color: rgb(255, 142, 66);
}

.hljs-section,
.hljs-tag {
  color: rgb(105, 195, 255);
}
.hljs-selector-tag {
  color: #000fff;
  font-weight: 700;
}
.hljs-attribute,
.hljs-built_in,
.hljs-link,
.hljs-regexp {
  color: rgb(105, 195, 255);
}
.hljs-meta {
  color: #fff;
  font-weight: bolder;
}

App.vue 可直接覆盖(代码块背景色、代码括号颜色)

<style lang="less">
#app {
  font-family: "楷体";
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  color: #2c3e50;
  .markdown-body .highlight pre,
  .markdown-body pre {
    background-color: rgb(34, 34, 34); // 代码块背景色改变默认
    color: rgb(105, 195, 255); //代码括号颜色
  }
}
</style>

组件中直接使,可以根据 parameter 动态显示 md 文件

  • 将 md 文件作为组件导入,注意:class 的值必须包含 markdown-body ,否则样式无法生效!
  • parameter 是文章 md 组件名称,通过列表点击传递 name,实现动态显示 md 组件
<template>
    <div class="markdown-body">
        <!-- 文章详情页面 -->
        <div class="details">
            <!-- md文件组件 -->
            <component :is="parameter"></component>
        </div>
  </div>
</template>
export default {
  data() {
    return {
      parameter: "", //文章对应组件名字
    };
  },
  mounted() {
    this.getParameters();
  },
  methods: {
    getParameters() {
      // 获取文章参数  点击跳转获取参数  或者 刷新页面从url中获取参数
      this.parameter =
        this.$route.query.article || location.search.split("=")[1];
    },
  },
};

效果展示

点击 md 文件列表

Alt md

 进入md 文件详情页面

Alt md

使用Vue3脚手架,可以使用marked库将Markdown文件渲染成HTML页面,并通过highlight.js库实现代码块高亮和行号显示。下面是具体的步骤: 1. 安装所需的库 使用npm或yarn安装marked和highlight.js库: ```shell npm install marked highlight.js --save ``` 2. 创建一个Markdown文件 在src目录下创建一个Markdown文件,例如example.md,用于测试渲染Markdown的功能。 ```markdown # Hello, world! 这是一个示例Markdown文件。 ## 代码块 ```js function hello() { console.log("Hello, world!"); } ``` 以上是一个JavaScript代码块。 ## 列表 - 列表项1 - 列表项2 - 列表项3 ``` 3. 创建一个Markdown组件 在src/components目录下创建一个Markdown组件,例如Markdown.vue,用于渲染Markdown文件。 ```vue <template> <div v-html="markdown"></div> </template> <script> import marked from "marked"; import hljs from "highlight.js"; export default { name: "Markdown", props: { source: String, }, computed: { markdown() { return marked(this.source, { highlight: function (code, lang) { if (lang && hljs.getLanguage(lang)) { return hljs.highlight(lang, code).value; } return hljs.highlightAuto(code).value; }, langPrefix: "hljs language-", breaks: true, gfm: true, }); }, }, }; </script> <style> .hljs-line-numbers { text-align: right; border-right: 1px solid #ccc; color: #999; padding-right: 5px; } </style> ``` 在组件,我们使用marked库将Markdown文件渲染成HTML页面,通过props属性接受Markdown文件的路径或字符串。同时,我们传递一个highlight函数给marked库,使用highlight.js对代码块进行高亮。另外,我们使用hljs-line-numbers类为代码块添加行号显示。 4. 在页面使用Markdown组件 在需要显示Markdown文件的页面引入Markdown组件,传递Markdown文件的路径或字符串作为source属性的值。 ```vue <template> <div> <Markdown :source="markdown" /> </div> </template> <script> import Markdown from "@/components/Markdown.vue"; import exampleMarkdown from "@/example.md"; export default { name: "App", components: { Markdown, }, data() { return { markdown: exampleMarkdown, }; }, }; </script> ``` 在页面引入Markdown组件,并将example.md文件作为markdown属性的值传递给Markdown组件。 这样,当页面加载时,Markdown组件将会把example.md文件渲染成HTML页面,并且代码块会被高亮并且显示行号。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值