成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Mdx 讓 Markdown 步入組件時代

開發 開發工具
MDX 是一種書寫格式,允許你在 Markdown 文檔中無縫地插入 JSX 代碼。你還可以導入(import)組件,例如交互式圖表或彈框,并將它們 嵌入到內容當中。

前言

在 MDX 出現之前,將 JSX 與 Markdown 混合書寫時,Markdown 的優勢就不存在了。通常是基于模板字符串的方式,因此就需要大量的轉義和繁瑣的語法。

MDX 試圖讓書寫 Markdown 和 JSX 更簡單、更具 表現力。當你將組件 (甚至可以是動態的或需要加載數據的組件)與 Markdown 混合書寫時,你將寫出更有趣的內容。

MDX 是什么

MDX 是一種書寫格式,允許你在 Markdown 文檔中無縫地插入 JSX 代碼。你還可以導入(import)組件,例如交互式圖表或彈框,并將它們 嵌入到內容當中。

前提條件

您應該熟悉 markdown 語法和 JavaScript 語法 (特別是 JSX)。

MDX 示例比如官網的一個例子,如下代碼

import {Chart} from './snowfall.js'
export const year = 2018

# Last year’s snowfall

In {year}, the snowfall was above average.
It was followed by a warm spring which caused
flood conditions in many of the nearby rivers.

<Chart year={year} color="#fcb32c" />

展示效果

效果.png

如何使用

在 create-react-app 中 只需要安裝 @mdx-js/loader, create-react-app 5 支持自定義 loader

src/App.jsx

/* eslint-disable import/no-webpack-loader-syntax */
import Content from "!@mdx-js/loader!./content.mdx";

export default function App() {
return <Content />;
}

src/content.mdx

# Hello, world!

This is **markdown** with <span style={{color: "red"}}>JSX</span>: MDX!

如果是 webpack 項目只需要加一個 @mdx-js/loader就可以支持

module.exports = {
module: {
//
rules: [
//
{
test: /\.mdx?$/,
use: [
// `babel-loader` is optional:
{ loader: "babel-loader", options: {} },
{
loader: "@mdx-js/loader",
/** @type {import('@mdx-js/loader').Options} */
options: {
/* jsxImportSource: …, otherOptions… */
},
},
],
},
],
},
};

插件支持

MDX 也支持插件配置,也就是原先的 markdown 插件

比如要讓 markdown 支持表格和 checkboxList ,可以使用 remark-gfm 插件;

比如要讓 markdown 支持數學公式 可以使用 rehype-katex 插件;

在 option 中可以傳入參數,代碼如下:

import rehypeKatex from 'rehype-katex'
import remarkMath from 'remark-math'


module.exports = {
module: {
//
rules: [
//
{
test: /\.mdx?$/,
use: [
// `babel-loader` is optional:
{loader: 'babel-loader', options: {}},
{
loader: '@mdx-js/loader',
/** @type {import('@mdx-js/loader').Options} */
options: {remarkPlugins: [remarkGfm], rehypePlugins: [rehypeKatex]}}
}
]
}
]
}
}

當然也可以支持自定義插件,比如 img 要加上默認樣式,限制其最大寬度,href 跳轉要改成新窗口打開等 ,如何寫 markdown 插件可以查看 unifiedjs.com

定義組件

在支持了 mdx 之后, 可以給 mdx 定義組件, 比如給 H1 傳遞默認樣式等,或者加入默認組件,例如 https://beta.reactjs.org/ 就加入了很多自定義組件,代碼示例如下:

import React from "react";
import ReactDom from "react-dom";
import Post from "./post.mdx"; // Assumes an integration is used

export const H1 = ({ className, ...props }: HeadingProps) => (
<H1
className={cn(className, "text-5xl font-bold leading-tight")}
{...props}
/>
);

const components = {
h1: H1,
};

ReactDom.render(
<Post components={components} />,
document.querySelector("#root")
);

MDX provider

每個文檔都要傳 components 很麻煩?我們可以在最外層導入 MDXProvider

import React from 'react'
import ReactDom from 'react-dom'
import Post from './post.mdx' // Assumes an integration is used to compile MDX -> JS.
import {Heading, /* … */ Table} from './components/index.js'
+import {MDXProvider} from '@mdx-js/react'

const components = {
h1: Heading.H1,
//
table: Table
}

ReactDom.render(
- <Post components={components} />,
+ <MDXProvider components={components}>
+ <Post />
+ </MDXProvider>,
document.querySelector('#root')
)

在線運行

以上實例都是在構建時運行,那么能讓 MDX 在瀏覽器運行呢,比如未來,博客的編輯器支持 MDX, 那么我們的博客文章頁面就可以有更多交互了。

比如數據通過服務端返回,下面代碼是 next.js 示例

import { useState, useEffect, Fragment } from "react";
import * as runtime from "react/jsx-runtime.js";
import { compile, run } from "@mdx-js/mdx";

export default function Page({ code }) {
const [mdxModule, setMdxModule] = useState();
const Content = mdxModule ? mdxModule.default : Fragment;

useEffect(() => {
(async () => {
setMdxModule(await run(code, runtime));
})();
}, [code]);

return <Content />;
}

export async function getStaticProps() {
const code = String(
await compile("# hi", { outputFormat: "function-body" /* …otherOptions */ })
);
return { props: { code } };
}

實時運行

例如:官方的 palyground,就可以實時運行,左邊寫代碼,右側展示文檔

官方 playground

最簡單的代碼如下:

import { VFile } from "vfile";
import { evaluate, } from "@mdx-js/mdx";

const value='## header'

const file = new VFile({ basename: "example.mdx", value });

const {default:Result}=await evaluate(file, runtime);

這個 Result 就是一個react 組件,如要實現類似功能可以參考官方 github 中的 editor.client.js。

小結

Markdown 所有程序員都愛,Markdown 在標準化、結構化、組件化都存在硬傷,有了 MDX ,Markdown 有了富交互、內容形態的編寫,希望 MDX 盡早、盡快、更多的投入到的互聯網產品中,也希望 MDX 的解析也來越標準化。


責任編輯:武曉燕 來源: JS酷
相關推薦

2013-01-15 10:18:06

云計算云理念實踐醫藥行業

2020-03-30 12:35:53

華為

2015-04-29 17:26:32

泰山云

2020-11-16 14:27:46

生物識別

2014-07-15 16:21:39

敏捷華為

2016-06-03 12:58:39

婁山云

2009-11-03 13:27:03

接入網市場

2013-01-24 13:15:58

互聯網移動互聯網智能手機

2010-07-20 15:32:18

Wi-Fi

2009-07-14 17:16:33

吹制光纖綜合布線

2013-11-19 13:11:51

WIFI技術LTE通信

2016-10-31 11:27:16

IT轉型

2014-04-29 10:56:23

物聯網IoT

2024-03-29 08:32:01

Node.jsNext.js組件

2010-08-11 09:45:03

2013-05-27 09:59:33

數據存儲大數據昆騰存儲

2012-12-21 20:03:48

金融展

2010-04-01 09:18:38

云計算

2011-06-29 14:54:35

2021-02-20 10:06:07

人工智能
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区二 | 四虎影院在线免费观看 | 日韩在线播放av | 久久久国产精品视频 | 中国黄色在线视频 | 91精品国产色综合久久 | 日韩成人精品一区 | 91精品久久久久久久久久小网站 | 日韩一二三区视频 | 91视频亚洲 | 亚洲第1页| 国产欧美一区二区三区久久人妖 | 久久国产一区二区三区 | 久久亚洲国产精品日日av夜夜 | 四虎影音 | 天天射网站 | 国产一极毛片 | 亚洲第一免费播放区 | 日屁网站 | 亚洲在线电影 | 欧美在线视频一区二区 | 欧美一级α片 | 久久一区二区三区四区五区 | 亚洲成人精品在线观看 | 久久99精品久久久久婷婷 | www.亚洲精品 | 亚洲人成人一区二区在线观看 | 久久久精品视频免费看 | 成人在线视频一区 | 亚洲国产精品99久久久久久久久 | 伊人久久精品 | 成人小视频在线观看 | 亚洲性视频网站 | 91国产精品 | 久久精品免费观看 | 嫩草影院网址 | 九九热热九九 | 一级片在线播放 | 久久久精品一区二区三区四季av | 精品久久国产 | 国产色在线|