索引 Markdown 中的示例文本,转换为 React 组件。当前包是 webpack 的 loader,通过配置当前 loader 加载 markdown 文档,返回一个 JS 对象,包含 markdown 文本,markdown 文本中的示例索引。
npm i markdown-react-code-preview-loader -D安装依赖(loader)之后,我们需要将 loader 配置到 webpack 配置中,通过在 kkt 中两种配置方法,了解如何使用配置 loader。
第 ① 种方法,使用 mdCodeModulesLoader 方法
mdCodeModulesLoader 用于在 webpack 配置添加 markdown-react-code-preview-loader 的方法。
// .kktrc.ts
import scopePluginOptions from '@kkt/scope-plugin-options';
import { LoaderConfOptions, WebpackConfiguration } from 'kkt';
import { mdCodeModulesLoader } from 'markdown-react-code-preview-loader';
export default (
conf: WebpackConfiguration,
env: 'development' | 'production',
options: LoaderConfOptions
) => {
// ....
conf = mdCodeModulesLoader(conf);
// ....
return conf;
};import webpack from 'webpack';
import { Options } from 'markdown-react-code-preview-loader';
/**
* 用于修改 webpack 配置 loader 的方法
* @param {webpack.Configuration} config webpack 配置
* @param {string[]} lang 解析语言
* @param {Options} option Loader Options
* @returns {webpack.Configuration}
* **/
export declare const mdCodeModulesLoader: (
config: webpack.Configuration,
lang?: string[],
option?: Options
) => webpack.Configuration;第 ② 种方法,手动添加配置
在 Webpack 中配置使用方法是一致的。
// .kktrc.ts
import webpack, { Configuration } from 'webpack';
import scopePluginOptions from '@kkt/scope-plugin-options';
import { LoaderConfOptions } from 'kkt';
export default (
conf: Configuration,
env: 'development' | 'production',
options: LoaderConfOptions
) => {
// ....
config.module.rules.forEach((ruleItem) => {
if (typeof ruleItem === 'object') {
if (ruleItem.oneOf) {
ruleItem.oneOf.unshift({
test: /.md$/,
use: [
{
loader: 'markdown-react-code-preview-loader',
options: { lang:["jsx","tsx"] },
},
],
});
}
}
});
// ....
return conf;
};import { PluginItem } from '@babel/core';
import { Options as RemoveImportsOptions } from 'babel-plugin-transform-remove-imports'
export type Options = {
/**
* 需要解析代码块的语言,默认: `["jsx","tsx"]`
*/
lang?: string[];
/**
* 删除过滤 imports 包;
* babel (babel-plugin-transform-remove-imports) 包的 option 设置
* https://github.com/uiwjs/babel-plugin-transform-remove-imports
*/
removeImports?: RemoveImportsOptions;
/**
* 添加 babel 插件。
*/
babelPlugins?: PluginItem[];
}添加 loader 之后,在项目工程中加载 markdown 文本使用方法:
import mdObj from 'markdown-react-code-preview-loader/README.md';
mdObj.source // => `README.md` 原始字符串文本
mdObj.components // => 组件索引对象,从 markdown 索引到的示例转换成的 React 组件。(可能需要配置 meta)
mdObj.data // => 组件源码索引对象,从 markdown 索引到的示例源码。(可能需要配置 meta){
data: {
77: {
code: "\"use strict\";\n\nfunction ......"
language: "jsx"
name: 77,
meta: {},
value: "impo....."
},
demo12: {
code: "\"use strict\";\n\nfunction ......"
language: "jsx"
name: 'demo12',
meta: {},
value: "impo....."
}
},
components: { 77: ƒ, demo12: ƒ },
source: "# Alert 确认对话框...."
}export type CodeBlockItem = {
/** 源码转换后的代码。 **/
code?: string;
/** 原始代码块 **/
value?: string;
/** 代码块编程语言 **/
language?: string;
/** 索引名称可以自定义,可以是行号。 */
name?: string | number;
/** `meta` 参数被转换为 `object` */
meta?: Record<string, string>;
};
export type CodeBlockData = {
source: string;
components: Record<CodeBlockItem['name'], React.FC>;
data: Record<CodeBlockItem['name'], CodeBlockItem>;
};import { isMeta } from 'markdown-react-code-preview-loader';
isMeta('mdx:preview') // => true
isMeta('mdx:preview:demo12') // => true
isMeta('mdx:preview--demo12') // => falseimport { getMetaId } from 'markdown-react-code-preview-loader';
getMetaId('mdx:preview') // => ''
getMetaId('mdx:preview:demo12') // => 'demo12'const getCodeBlock: (child: MarkdownParseData['children'], opts?: Options) => CodeBlockData['data'];import { getURLParameters } from 'markdown-react-code-preview-loader';
getURLParameters('name=Adam&surname=Smith') // => { name: 'Adam', surname: "Smith" }
getURLParameters('mdx:preview:demo12') // => { }
getURLParameters('mdx:preview:demo12&name=Adam&surname=Smith') // => { name: 'Adam', surname: "Smith" }
getURLParameters('mdx:preview:demo12&code=true&boreder=0') // => { code: 'true', boreder: "0" }\```tsx mdx:preview:demo12&code=true&boreder=0
import React from "react"
const Demo = ()=>{
return <div>测试</div>
}
export default Demo
\```{
data: {
demo12: {
code: "\"use strict\";\n\nfunction ......"
language: "jsx"
name: 'demo12',
meta: { code: 'true', boreder: '0' },
value: "impo....."
}
},
components: { demo12: ƒ },
source: "# Alert 确认对话框...."
}注意 meta 标识,loader 才会去索引对于的 react 示例,进行代码转换。
Meta Tag Meta ID Meta Param
┈┈┈┈┈┈┈┈ ┈┈┈┈┈┈┈ ┈┈┈┈┈┈┈┈┈┈
╭┈┈┈┈┈┈┈┈━╲━━━━━━━━━━━━╱━━━━━━━╱━━━━━┈┈┈┈╮
┆ ```jsx mdx:preview:demo12&boreder=0 ┆
┆ import React from "react" ┆
┆ const Demo = () => <div>Test</div> ┆
┆ export default Demo ┆
┆ ``` ┆
╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
mdx:特殊标识前缀mdx:preview控制是否进行进行示例索引,通过对应所在行号,获取需要的示例对象。mdx:preview:demo12通过demo12唯一标识,准确获取索引的示例代码或示例组件对象。mdx:preview:&code=true&border=0传递参数,提供给渲染层使用。
\```tsx mdx:preview
import React from "react"
const Demo = ()=>{
return <div>测试</div>
}
export default Demo
\```\```tsx mdx:preview:demo12
import React from "react"
const Demo = ()=>{
return <div>测试</div>
}
export default Demo
\```\```tsx mdx:preview:demo12&code=true&boreder=0
import React from "react"
const Demo = ()=>{
return <div>测试</div>
}
export default Demo
\```npm install # Install dependencies
npm install --workspaces # Install sub packages dependencies
npm run watch
npm run start一如既往,感谢我们出色的贡献者!
由 action-contributors 生成。
Licensed under the MIT License.