Docz使用总结

功能特性:

  • 零配置、简单易用
  • 高效、支持热加载和代码分割
  • 易于定制
  • 基于MDX
  • 支持插件
  • 支持Typescript

安装

yarn add docz docz-theme-default --dev

启动配置

package.json

{
  "name": "sinoui-docs",
  "version": "1.0.0",
  "private": true,
  "license": "MIT",
  "scripts": {
    "docz:dev": "docz dev",
    "docz:build": "docz build",
    "docz:serve": "docz build && docz serve"
  },
  "devDependencies": {
    "docz": "latest",
    "react": "^16.8.2",
    "react-dom": "^16.8.2"
  }
}

然后运行

yarn docz:dev

即可启动服务器。

添加.mdx文档

Alert.tsx

import React, { SFC } from 'react';
import styled from 'sinoui-components/styles';

export type Kind = 'info' | 'positive' | 'negative' | 'warning';
export type KindMap = Record<Kind, string>;

const kinds: KindMap = {
  info: '#5352ED',
  positive: '#2ED573',
  negative: '#FF4757',
  warning: '#FFA502',
};

export interface AlertProps {
  /**
   * Set this to change alert kind
   * @default info
   */
  kind: 'info' | 'positive' | 'negative' | 'warning';
}

const AlertStyled = styled.div`
  padding: 15px 20px;
  background: white;
  border-radius: 3px;
  color: white;
  background: ${({ kind = 'info' }: AlertProps) => kinds[kind]};
`;

export const Alert: SFC<AlertProps> = ({ kind, ...props }) => (
  <AlertStyled {...props} kind={kind} />
);

Alert.mdx

---
name: Alert  // 左侧导航显示标题
---

import { Playground, Props } from 'docz';
import { Alert } from './Alert';

# Alert

## 效果

<Playground>
  <Alert kind="info">这是提示性文字</Alert>
</Playground>

## 属性

<Props of={Alert} />

运行效果:

mdx.png

自定义配置

支持Typescript

只需要在doczrc.js中配置typescript:true即可。

doczrc.js

export default {
  title: 'sinoui-docs', //网页页签标题
  typescript: true,     // 支持typescript
};

一般在支持typescript时,可能会遇到编译问题,需要添加onCreateWebpackChain配置

doczrc.js

import { resolve } from 'path';

const srcPath = resolve(__dirname, '../packages');
const nodeModulePath = resolve(__dirname, '../node_modules');

export default {
  title: 'sinoui-docs',
  codeSandbox: false,
  typescript: true,
  onCreateWebpackChain: (config) => {
    config.module
      .rule('ts')
      .include.add(srcPath)
      .end()
      .exclude.add(nodeModulePath)
      .end();

    return config;
  },
};

但是onCreateWebpackChain属性在V2版本中已经弃用,可使用下面的方式替换:

  1. 首先在根目录下添加tsconfig.json文件
{
  "include": ["src", "types"],
  "exclude": ["node_modules"],
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "lib": ["dom", "esnext"],
    "importHelpers": true,
    "declaration": true,
    "sourceMap": true,
    "strict": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true,
    "noImplicitThis": true,
    "alwaysStrict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": true,
    "moduleResolution": "node",
    "jsx": "react",
    "esModuleInterop": true,
    "allowJs": false,
    "baseUrl": ".",
    "rootDir": "./src",
    "outDir": "./build",
    "resolveJsonModule": true,
    "incremental": true
  }
}
  1. 在根目录下添加gatsby-node.js文件
const path = require('path');
const TsconfigPaths = require('tsconfig-paths-webpack-plugin');

const tsConfigFile = path.join(__dirname, '../tsconfig.json');

exports.onCreateWebpackConfig = (args) => {
  args.actions.setWebpackConfig({
    resolve: {
      plugins: [
        new TsconfigPaths({
          configFile: tsConfigFile,
        }),
      ],
    },
    watchOptions: {
      ignored: ['node_modules', 'dist', '.cache', 'coverage', '.docz'],
    },
  });
};

支持自定义站点主题(v1)

使用theme或者themeConfig指定站点主题

doczrc.js

// theme
export default {
  theme: '/src/my/theme/folder', //外部theme文件
}

// themeConfig
export default {
    themeConfig:{
        colors:{
            primary:'red'  //指定站点主题下的主色调
        }
    }
}

此外还能支持直接对标签元素的样式定制

export default {
  themeConfig: {
    styles: {
      h1: `
        font-size: 80px;
        margin-bottom: 10px;
      `
    }
  }
};

支持自定义站点主题(v2)

V2版本中我们要确保移除docz-theme-default的依赖,可使用

yarn remove docz-theme-default  或
npm uninstall docz-theme-default

移除此依赖的主要原因是因为V2启动了自己的Gatsby主题gatsby-theme-docz。具体使用方式如下:
由于doczrc.js中的theme属性已经移除,如果我们想要使用自定义的主题,可以在src下新建gatsby-theme-docz/index.js:

// src/gatsby-theme-docz/index.js
import React from 'react'
import Theme from './my-custom-theme'

export default (props) => <Theme {...props} />

支持自定义应用程序包装器(根节点组件)

我们在写文档时,由于组件使用styled-components,所以必须提供统一的ThemeProvider,这个给我们提供很大的便利性

wrapper.js

import React from 'react';
import defaultTheme from 'sinoui-components/styles/defaultTheme';
import { ThemeProvider } from 'sinoui-components/styles';

export default function Wrapper(props) {
  return <ThemeProvider theme={defaultTheme}>{props.children}</ThemeProvider>;
}

doczrc.js

export default {
  wrapper: 'src/wrapper',
}

这样我们在写使用场景时就不用每次都写一遍ThemeProvider了。

但是V2版本中wrapper属性也已经移除,新的处理方式如下:
src下新建gatsby-theme-docz/wrapper.js:

import React from 'react';
import { ThemeProvider } from 'styled-components';
import { defaultTheme, createTheme } from '@sinoui/theme';
import { useThemeUI } from 'theme-ui';
import lightBlue from '@sinoui/theme/colors/lightBlue';

const darkTheme = createTheme({
  palette: {
    type: 'dark',
    primary: lightBlue,
  },
});

export default ({ children }) => {
  const { colorMode } = useThemeUI();
  return (
    <ThemeProvider theme={colorMode === 'dark' ? darkTheme : defaultTheme}>
      <div>{children}</div>
    </ThemeProvider>
  );
};

支持自定义渲染模板

模板替换属性indexHtml只在V1中有作用,V2版本已不支持此特性。

docz默认渲染模板在移动端使用时,连击会导致屏幕自动放大,为了禁止这种行为,我们可以指定一个渲染模板替换默认模板。

index.html

<!DOCTYPE html>
<html lang="{{ lang }}">
  <head>
    <meta charset="UTF-8" />
    <meta name="description" content="{{ description }}" />
    <!--设置移动端不支持连击时的自动缩放 -->
    <meta
      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;"
      name="viewport"
    />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>{{ title }}</title>
    {{ head }}
  </head>
  <body>
    <div id="root" />
    {{ footer }}
  </body>
</html>

doczrc.js

export default {
  indexHtml: "index.html"
};

参考文档:docz

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351