美文网首页
vuecli3 + markdown制作组件文档

vuecli3 + markdown制作组件文档

作者: Baby_ed6e | 来源:发表于2022-01-14 11:24 被阅读0次

1、安装脚手架并运行
2、安装markdown-to-vue-loader 实现加载md文档并运行里面的vue代码

cnpm i markdown-to-vue-loader vue-loader   -D

配置vue.config.js,并设置解析md文档的部分规则

module.exports = {
    ....
    chainWebpack: (config) => {
        config.module
            .rule("md")
            .test(/.md$/)
            .use("vue-loader")
            .loader("vue-loader")
            .end()
            .use("markdown-to-vue-loader")
            .loader("markdown-to-vue-loader")
            .options({
                componentWrapper: "<div class='markdown-component'></div>",
                preClass: "markdown-pre-class",
                preWrapper: "<div class='markdown-example-code'></div>",
                tableClass: "markdown-table-class",
                tableWrapper: "<div class='markdown-table-container'></div>",
            })
            .end();
    },
};

3、重新运行,即可把md文档当做组件加载

const active =  {
    component: () => import("./comp/quarterPicker.md"),
}

<component :is="active.component" />

4、如何在md文档里添加vue并运行代码,参考 https://www.npmjs.com/package/markdown-to-vue-loader
5、将动态组件单独提出,实现给md文档添加样式且不影响其内组件样式。 首先需要给动态组件添加外层包裹,并单独提出来,以下是给代码块添加高亮,给md文档添加样式的代码。

<template>
    <div class="markdown-component-worp">
        <component :is="active.component" />
    </div>
</template>

<script>
import hljs from "highlight.js";
import "./markdown.scss";
import "highlight.js/scss/default.scss";
import "highlight.js/styles/color-brewer.css";

const addData = (el) => {
    if (el && el.childNodes) {
        el.childNodes.forEach((node) => {
            if (
                node.nodeType == 1 &&
                node.className != "markdown-component" &&
                node.className != "markdown-table-container" &&
                node.className != "markdown-example-code"
            ) {
                node.setAttribute("data-md", node.nodeName);
                addData(node);
            }
        });
    }
};

export default {
    name: "ComponentWarp",
    props: {
        active: {
            type: Object,
            default: null,
        },
    },
    updated() {
        document.querySelectorAll("pre code").forEach((el) => {
            if (el.className == "language-vue") {
                el.className = "language-html";
            }
            hljs.highlightElement(el);
        });
        let worp = document.querySelector(".markdown-component-worp");
        addData(worp);
    },
};
</script>

<style lang="scss">
.markdown-component-worp {
    background: #fff;
    .markdown-component {
        border: 1px solid #f1f1f1;
        border-bottom: none;
        padding: 35px 25px 25px;
        position: relative;
        border-radius: 5px 5px 0 0;
        overflow: hidden;
        &::before {
            position: absolute;
            left: 0;
            top: 0;
            content: "demo";
            font-size: 10px;
            padding: 2px 5px;
            color: #8cc5ff;
            background: #ecf5ff;
        }
    }
    .markdown-example-code {
        border: 1px solid #f1f1f1;
        border-top: 1px solid #f1f1f1;
        border-radius: 0 0 5px 5px;
        overflow: hidden;
        margin-bottom: 50px;
        pre {
            padding: 10px;
            box-shadow: 0px 0px 5px #f1f1f1 inset;
            // max-height: 400px;
            overflow: scroll;
        }
    }

    pre {
        tab-size: 4;
    }
}
</style>

css样式

.markdown-component-worp {

    [data-md='H1'],
    [data-md='H2'],
    [data-md='H3'],
    [data-md='H4'] {
        color: #111111;
        font-weight: 400;
        margin-top: 1em;
    }

    [data-md='H1'],
    [data-md='H2'],
    [data-md='H3'],
    [data-md='H4'],
    [data-md='H5'] {
        font-family: Georgia, Palatino, serif;
    }

    [data-md='H1'],
    [data-md='H2'],
    [data-md='H3'],
    [data-md='H4'],
    [data-md='H5'],
    [data-md='P'],
    [data-md='DL'] {
        margin-bottom: 16px;
        padding: 0;
    }

    [data-md='H1'] {
        font-size: 48px;
        line-height: 54px;
    }

    [data-md='H2'] {
        font-size: 36px;
        line-height: 42px;
    }

    [data-md='H1'],
    [data-md='H2'] {
        border-bottom: 1px solid #EFEAEA;
        padding-bottom: 10px;
    }

    [data-md='H3'] {
        font-size: 24px;
        line-height: 30px;
    }

    [data-md='H4'] {
        font-size: 21px;
        line-height: 26px;
    }

    [data-md='H5'] {
        font-size: 18px;
        list-style: 23px;
    }

    [data-md='A'] {
        color: #0099ff;
        margin: 0;
        padding: 0;
        vertical-align: baseline;

        &:hover {
            text-decoration: none;
            color: #ff6600;
        }
    }

    [data-md='UL'],
    [data-md='OL'] {
        padding: 0;
        padding-left: 24px;
        margin: 0;
        margin-bottom: 20px;

        li {
            line-height: 24px;
        }

    }

    [data-md='P'],
    [data-md='UL'],
    [data-md='OL'] {
        font-size: 16px;
        line-height: 24px;
    }

    [data-md='OL'] [data-md='OL'],
    [data-md='UL'] [data-md='OL'] {
        list-style-type: lower-roman;
    }

    [data-md='BLOCKQUOTE'] {
        border-left: .5em solid #eee;
        padding: 0 0 0 1em;
        margin-left: 0;

        cite {
            font-size: 14px;
            line-height: 20px;
            color: #bfbfbf;
        }

        cite:before {
            content: '\2014 \00A0';
        }

        p {
            color: #666;
        }
    }

    [data-md='HE'] {
        text-align: left;
        color: #999;
        height: 2px;
        padding: 0;
        margin: 16px 0;
        background-color: #e7e7e7;
        border: 0 none;
    }

    [data-md='DL'] {
        padding: 0;

        dt {
            padding: 10px 0;
            margin-top: 16px;
            font-size: 1em;
            font-style: italic;
            font-weight: bold;
        }

        dd {
            padding: 0 16px;
            margin-bottom: 16px;
            margin-left: 0;
        }
    }

    .markdown-table-container {
        table {
            width: 100%;
            max-width: 1000px;
            font-family: verdana, arial, sans-serif;
            font-size: 11px;
            color: #333333;
            border-width: 1px;
            border-color: #666666;
            border-collapse: collapse;
        }

        table th {
            border-width: 1px;
            padding: 8px;
            border-style: solid;
            border-color: #666666;
            background-color: #dedede;
        }

        table td {
            border-width: 1px;
            padding: 8px;
            border-style: solid;
            border-color: #666666;
            background-color: #ffffff;
        }
    }
}

相关文章

  • vuecli3 + markdown制作组件文档

    1、安装脚手架并运行2、安装markdown-to-vue-loader 实现加载md文档并运行里面的vue代码 ...

  • 具名插槽slot无报错但不显示的原因

    场景:使用VueCLI2写的组件,然后拿到VueCLI3创建的项目当中就显示不了了;看了下官方文档,可能是版本问题...

  • vuepress中实现代码折叠、高亮

    最近在vuepress中撰写UI框架文档时发现在组件中插入演示代码没高亮,虽然在文档markdown中写代码有高亮...

  • 给你自己的博客加个 Markdown

    今天给大家推荐一个简单易用的开源 Markdown 组件, Markdown 组件仓库地址是: Markdown...

  • github_markdown语法大全整理

    markdown github markdown语法 markdown引擎 学习markdown 文档说明 本文用...

  • 树莓派初始化设置

    树莓派初始化设置 密码重置 允许root用户登录    目前,产品中所有前端组件的API文档均由Markdown编...

  • Markdown 基本语法

    Markdown语法 当前文档仅用作个人学习笔记,来源: Markdown 中文文档 概述设计理念Markdown...

  • laya2.0 预设prefab

    一、使用方式 参考官方文档 预设使用 制作一个自定义的Box预设组件,将页面中要制作成预设组件的元素设置好要用的属...

  • MarkDown 文档

    Markdown 文档 Markdown 语法整理大集合2017

  • 001-Markdown 语法

    markdown 语法 兼容 HTML 例: 效果: 欢迎使用Markdown 文档格式编写文档! 1. 区块元素...

网友评论

      本文标题:vuecli3 + markdown制作组件文档

      本文链接:https://www.haomeiwen.com/subject/itjacrtx.html