2018-11-04
最近我一直在寻找书写博客的最佳方式,既要能自由书写,也要能够精准地把控布局。
为此,我分别试验了几种书写方式:
其中:
正当苦恼的时候,网上的朋友指点我说,有一种 Markdown 的扩展,可以在其中混写 JSX。
这正是我需要的!经过调研,我发现了 mdx-js/mdx 这个库。
这个库的介绍如下:
需要注意的是,mdx 库默认使用的扩展名是 .mdx。
React 版本:
在安装之前,首先要检查自己项目中 React 版本,根据这个 issue 所描述的,React 的版本必须 16.3+。seddd
这个库的安装文档我有点没看懂,因此自己根据 example 摸索着手动安装。
安装以下依赖:
yarn add create-react-context
yarn add @mdx-js/loader
yarn add @mdx-js/mdx
之后配置 webpack, .mdx 后缀使用 @mdx-js/mdx 加载器(注意:我选择延续使用 .md 扩展名):
{ test: /\.md$/, exclude: /node_modules/, loader: ['babel-loader', '@mdx-js/loader']},
其中:mdx 的 loader 需要与 babel-loader 组合使用。
本节介绍如何在项目中添加 mdx 组件,实现加载 Markdown(mdx 文件)。
首先我们先大概地了解下整体过程:
具体代码如下:
const RList = (props) => { return <List bulleted>{props.children}</List> } const ROList = (props) => <List ordered>{props.children}</List> const RListItem = (props) => { return <List.Item>{props.children}</List.Item> } const Quote = (props) => <Message color='orange'>{props.children}</Message> const RTable = (props) => <Table celled>{props.children}</Table> const components = { h1: H1, h2: H2, h3: H3, h4: H4, code: Code, ul: RList, ol: ROList, li: RListItem, blockquote: Quote, table: RTable }
其中:
下面需要导入 Markdown 文件,具体导入方式有两种:
同步的写法是在代码的开头直接 import:
import MD from 'content/blog/posts/Rxjava3.md';
异步的写法是使用 import() 方法:
import('content/blog/posts/' + post.link).then(v => { let Article = v.default ... })
在使用时,MD 或 Article 作为 React 组件使用。
下面来在 render 中写 MDXProvider:
<MDXProvider components={components}><Article/></MDXProvider>
这样就大功告成了。
我们再来回顾一下整个流程:
MDX 的语法是 Markdown 语法的超集,Markdown 语法自然不必多说,下面详细说超出的那一部分。
JSX 组件直接使用:
<Box> <Heading>Here's a JSX block</Heading> <Text>It's pretty neat</Text> </Box>
组件在使用时需要进行导入:
import Graph from './components/graph' ## Here's a graph <Graph />
同时,也允许导入其他数据,比如导入外部的 md 文档:
import License from './license.md' import Contributing from './docs/contributing.md' # Hello, world! <License /> --- <Contributing />
我尝试着引用一个 React 组件:
import DefaultBarChart from "components/d3/DefaultBarChart"
<DefaultBarChart data={[1,2,3,4]} size={[500, 200]} />
可见导入成功了,上面这段代码输入的是:
import DefaultBarChart from "components/d3/DefaultBarChart" <DefaultBarChart data={[1,2,3,4]} size={[500, 200]} />
我发现,JSX 必须写在一行里面,如果拆分多行写会报错。