Index example text in Markdown, converted to React components. The current package is the loader of webpack, which loads the markdown document by configuring the current loader, returning a JS object containing the markdown text, the example index in the markdown text.
npm i markdown-react-code-preview-loader -DAfter installing the dependency (loader), we need to configure the loader into the webpack configuration. Learn how to use the configuration loader by using two configuration methods in kkt.
① The first method, use the mdCodeModulesLoader method
mdCodeModulesLoader method for adding markdown-react-code-preview-loader to webpack config.
// .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';
/**
* `mdCodeModulesLoader` method for adding `markdown-react-code-preview-loader` to webpack config.
* @param {webpack.Configuration} config webpack config
* @param {string[]} lang Parsing language
* @param {Options} option Loader Options
* @returns {webpack.Configuration}
* **/
export declare const mdCodeModulesLoader: (config: webpack.Configuration, lang?: string[], option?: Options) => webpack.Configuration;② The second method is to manually add the configuration
The configuration and usage methods are consistent in 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 = {
/**
* Language to parse code blocks, default: `["jsx","tsx"]`
*/
lang?: string[];
/**
* Option settings for the babel (babel-plugin-transform-remove-imports) package
* https://github.com/uiwjs/babel-plugin-transform-remove-imports
*/
removeImports?: RemoveImportsOptions;
/**
* Add babel plugins.
*/
babelPlugins?: PluginItem[];
}After adding loader, use the method to load markdown text in the project project:
import mdObj from 'markdown-react-code-preview-loader/README.md';
mdObj.source // => `README.md` raw string text
mdObj.components // => The component index object, the React component converted from the markdown indexed example. (need to configure meta)
mdObj.data // => The component source code index object, the sample source code indexed from markdown. (need to configure 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 = {
/** The code after the source code conversion. **/
code?: string;
/** original code block **/
value?: string;
/** code block programming language **/
language?: string;
/** The index name, which can be customized, can be a row number. */
name?: string | number;
/** The `meta` parameter is converted into an `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'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 确认对话框...."
}const getCodeBlock: (child: MarkdownParseData['children'], opts?: Options) => CodeBlockData['data'];Note meta identifier to the code block example, and loader will index the react example for code conversion.
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:special identifier prefixmdx:previewControls whether to perform example indexing, and obtain the required example object through the corresponding line number.mdx:preview:demo12Uniquely identified bydemo12, accurately obtain theexample codeorexample component objectof the index.mdx:preview:&code=true&border=0pass the parameters for the rendering layer to use.
\```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 startAs always, thanks to our amazing contributors!
Made with action-contributors.
Licensed under the MIT License.