入口文件

首先,看一个项目的入口,可以从package.json中去看它的运行命令

可以看到dev那行,执行了很多脚本: npm run bootstrap && npm run build:file && cross-env NODE_ENV=development webpack-dev-server --config build/webpack.demo.js & node build/bin/template.js

npm run bootstrap就是安装项目所需依赖, 重点就是webpack-dev-server --config build/webpack.demo.js项目使用webpack执行build/webpack.demo.js,生成一个服务器,这个是项目的打包脚本js。

可以看到entry指向了./examples/entry.js,那么这个是我们的入口文件了。

entry.js

可以看到这里就是一个普通Vue的项目了,引用了许多的模块,注册了一些自己编写的Vue组件,重点需要看的是router。

router.config.js

这是对项目边栏,导航、主题等进行国际化渲染的路由。

这个对应的是项目的内容,也就是我们看到的demo演示部分。那么它是怎么把 .md的文件渲染到页面并且达到既显示demo效果,又有源代码的呢?

能做到这一点只能在编译的时候就对md的文件进行分析,分析出code部分,然后对code部分进行一些处理。这里element-ui在原来mdloader的基础上,添加一些项目需要用到的需求代码。我们回到webpack-demo.js

md-loader/index.js

它的入口文件是index.js

引入了config.js

md-loader/config.js

引用了许多的依赖包,使用了markdown-it-chain的链式调用,配置了一对东西。可以去看看这个模块的使用:预览

其实就是一个把.md解析为一个树行结构,再通过通过一些函数对树进行解析,拼接dom,生成dom树的作用,这里面的一些api需要自己去看才能理解。 简而言之,就是解析的代码,element-ui的工程师,对它扩展了一些功能,让它把code部分拼接成:

<demo-block>demo组件组件代码描述
</demo-blcok>

最后的拼接主要看index.js

function(source) {const content = md.render(source);const startTag = '<!--element-demo:';const startTagLen = startTag.length;const endTag = ':element-demo-->';const endTagLen = endTag.length;let componenetsString = '';let id = 0; // demo 的 idlet output = []; // 输出的内容let start = 0; // 字符串开始位置let commentStart = content.indexOf(startTag);let commentEnd = content.indexOf(endTag, commentStart + startTagLen);while (commentStart !== -1 && commentEnd !== -1) {output.push(content.slice(start, commentStart));const commentContent = content.slice(commentStart + startTagLen, commentEnd);const html = stripTemplate(commentContent);const script = stripScript(commentContent);let demoComponentContent = genInlineComponentText(html, script);const demoComponentName = `element-demo${id}`;output.push(`<template slot="source"><${demoComponentName} /></template>`);componenetsString += `${JSON.stringify(demoComponentName)}: ${demoComponentContent},`;// 重新计算下一次的位置id++;start = commentEnd + endTagLen;commentStart = content.indexOf(startTag, start);commentEnd = content.indexOf(endTag, commentStart + startTagLen);}// 仅允许在 demo 不存在时,才可以在 Markdown 中写 script 标签// todo: 优化这段逻辑let pageScript = '';if (componenetsString) {pageScript = `<script>export default {name: 'component-doc',components: {${componenetsString}}}</script>`;} else if (content.indexOf('<script>') === 0) { // 硬编码,有待改善start = content.indexOf('</script>') + '</script>'.length;pageScript = content.slice(0, start);}output.push(content.slice(start));return `<template><section class="content element-doc">${output.join('')}</section></template>${pageScript}`;
};

这样接的vue组件就会被vue-loader来处理,这样就形成了我们看到的效果。

附上自己分离它逻辑的demo: demo链接 预览链接

.md是什么文件_Element-UI源码阅读之md显示到页面相关推荐

  1. 直播网站源码,使用nodejs显示HTML页面

    直播网站源码,使用nodejs显示HTML页面实现的相关代码 1.初始化node项目 在命令行输入: npm init 2.安装express 在命令行输入: npm install express ...

  2. 渲染引擎分析 - 鸿蒙(OpenHarmony) JS UI 源码阅读笔记

    作者:门柳 鸿蒙是华为研发的新一代终端操作系统,能适用于 IoT.手表.手机.Pad.电视等各种类型的设备上,扛起"国产操作系统"的大旗,也遭受了很多非议.2021 年 6 月初发 ...

  3. 有道云笔记 - Markdown模板(文首附markdown源码,即.md文件)

    有道云笔记 - Markdown模板 附 本文的Markdown源码镜像: https://github.com/yanglr/AlgoSolutions/blob/master/Youdao_Not ...

  4. PHP 八羊闪电本地相册图片查看器V1 PHP极简代码直接查看本地文件夹图片 源码下载!

    该源码,直接读取本地IMGAGES文件夹的图片,直接显示在相册,点击放大查看,非常方便,非常适合二次开发,但是不适合小白.没有做UI和设计,比较简陋,所以仅仅售价10元钱,想要的就拿去,不想要的就别拍 ...

  5. 星宿UI源码V1.3 wordpress系统资讯资源下载小程序源码开源下载

    更新内容: 新增:金刚区支持跳转业务域名(个人小程序不支持) 新增:wordpress后台公众号文章(焦点)开关 新增:资源下载提取密码 新增:支持wordpress文章中添加小程序流量主AD,图组 ...

  6. QT中在设计师Design进行界面开发后查看ui源码

    1.有时想在qt代码中实现某些功能,像我遇到的情况就是想在界面上实现添加一个水平的空白控件,也就是设计师里面的Horizontal Spacer控件,如图1 然后将其添加到布局里面,效果如图2 图1 ...

  7. Winforn中DevExpress的TreeList中显示某路径下的所有目录和文件(附源码下载)

    场景 Winform中DevExpress的TreeList的入门使用教程(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  8. SpringBoot文件上传源码解析

    一.SpringMVC文件上传源码分析前言(这部分我觉得原作者写的很好) 该如何研究SpringMVC的文件上传的源码呢? 研究源码并不是仅仅知道程序是怎样运行的,而应该从宏观的角度.不同的立场去看待 ...

  9. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http:// ...

最新文章

  1. MPB:河湖着生硅藻样品采集、永久玻片制作及鉴定
  2. 黄仁勋把自己做成了虚拟娃娃
  3. java ee s2sh复习题_JavaEESSH框架答案试题题目及答案,期末考试题库,章节测验答案...
  4. android 关闭多点触控_Cocos Creator关闭多点触摸的问题
  5. Restful对于URL的简化
  6. Leetcode 系列 | 反转链表
  7. android uber源码,Uber SDK in android
  8. 全局变量局部变量ScriptCase中的全局变量、局部变量
  9. ipv6的127位掩码如何表示_子网掩码为255.255.255.0代表的意思是什么?
  10. 不能执行已释放 Script 的代码
  11. 常用几个UITableView,UICollectionView  UIScrollView关键点
  12. 【Python】【有趣的模块】【requests】【一】HTTP头信息总结
  13. 中国纺织行业前景动态分析与投资战略研究报告2022-2028年
  14. 详解Java的IO流Part7:PrintStream打印流【完结】
  15. UML教程8:构件图 部署图 附录
  16. windows下面刷新dns
  17. 完美卸载itunes
  18. 关于安卓毛玻璃实现(一)动态毛玻璃
  19. BFF —— Backend For Frontend
  20. 关于指针所占的字节数

热门文章

  1. 建模:确定服务的边界——《微服务设计》读书笔记
  2. 文档数据库RavenDB-介绍与初体验
  3. element-ui Notification重叠问题,原因及解决办法
  4. mysql 一主一备_Mysql一个主一备
  5. Android之实现点击布局缩小然后再放大动画
  6. C语言之字符数组在if{}里面赋值给char *引发的问题
  7. Android之什么场景该使用单例模式总结
  8. Android之状态栏通知Notification、NotificationManager详解
  9. Android之Android Studio三种方式导入外部资源 以及 报错处理
  10. 【iVX 初级工程师培训教程 10篇文拿证】03 事件及猜数字小游戏