让 Markdown 中的代码可以实时运行,为什么会有这样一个需求?
在我们前端团队中,技术相关的文档都采用 Markdown 编写, 文档中往往会伴随很多示例代码,我们希望大家在阅读文档的时候,可以运行示例代码,看到效果。
明确需求以后,写了一个 React 组件来满足这些功能, react-code-view
, 首先看一下效果:
在线预览: https://simonguo.github.io/react-code-view/
markdown-loader
与 html-loader
解析 Markdown 文档。codemirror
codemirror
中的代码通过 babel 编译,再通过 ReactDOM.render 渲染到指定的容器中。npm install react-code-view
在 webpack 中需要添加对 markdown-loader
的支持。 需要安装:
npm install html-loader --save-dev
npm install markdown-loader --save-dev
npm install react-markdown-reader --save-dev
webpack.config.js
配置
>=webpack 2.x +
const markdownRenderer = require('react-markdown-reader').renderer;
{
test: /\.md$/,
use: [{
loader: 'html-loader'
}, {
loader: 'markdown-loader',
options: {
pedantic: true,
renderer: markdownRenderer(/**languages:Array<string>**/)
}
}]
}
languages 默认值:["javascript", "bash", "xml", "css", "markdown", "less"]
;
Github: https://github.com/simonguo/react-markdown-reader
示例代码中通常是使用到 ES2015+ , React 等,需要对代码实时做编译,所以在 html 中引入 babel :
<script type="text/javascript" src="//cdn.staticfile.org/babel-standalone/6.24.0/babel.min.js"></script>
import CodeView from 'react-code-view';
import '~react-code-view/lib/less/index.less';
import { Button } from 'rsuite';
<CodeView dependencies={{ Button }} >
{require('./example.md')}
</CodeView>
源代码都统一写在 markdown 中,参考: example.md
这里需要注意的是把需要运行的代码一定要放在 <!--start-code-->
与 <!--end-code-->
之间。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.