主にフロントエンド側で使用するドキュメンテーションツールを探していて、
- markdown で書く普通のドキュメントも
- MDX で React コンポーネントのショーケースとしても
ということで docz を使ってみることにしました。
インストール
v2 から Gatsby がベースになるようなので、 docz@next を使うことにします。
% npm i -D docz@next
ドキュメントの mdx ファイルを置いておく docs と 設定ファイルとなる doczrc.js をプロジェクトルートに作ります。
% mkdir docs % touch doczrc.js
ドキュメントに含むファイルは doczrc.js で以下のように指定します。指定しない場合は、プロジェクト内にあるマークダウン/MDXファイルを探してくれるようです。
module.exports = {
title: 'Awesome document',
files: './docs/**/*.{md,mdx}',
}ドキュメントを書いていく
これだけで docs 以下にある .md/.mdx ファイルを探してドキュメントとしてビルドしてくれます。
% touch docs/introduction.md % npx docz dev
更にベージを追加
% touch docs/development.md
自動的にサイドバーにページを追加してくれます。が、Introduction - Development の順になってほしいので、設定を追加します。
// doczrc.js
module.exports = {
...
menu: ['Introduction', 'Development'],
}menu に記述する文字列は MDファイル名に対応するようになっているようです。 また、セクションを分割することもできるので、例えば以下のような構成にしたい場合は
- Introduction - Development - Domain - Repository - Usecase - State - View - Components - Foundations - Elements - Blocks
以下のように menu を指定し
// doczrc.js
module.exports = {
...
menu: [
'Introduction',
{
name: 'Development',
menu: ['Domain', 'Repository', 'Usecase', 'State', 'View'],
},
{
name: 'Components',
menu: ['Foundations', 'Elements', 'Blocks'],
},
],
}docs ディレクトリ以下にファイルを追加します。
% touch docs/development/{domain.md,repository.md,usecase.md,state.md,view.md}
% touch docs/components/{foundation.mdx,element.mdx,block.mdx}
% touch docs/components/{foundations.mdx,elements.mdx,blocks.mdx}この状態では、まだメニューの内容とファイル構成が合っていない状態なので、各 md/mdx ファイルの frontmatter を書く必要があります。
--- name: Blocks route: components/blocks menu: Components ---
name は doczrc の menu配列に入れた表示名、 menu は doczrc で指定した name に対応させていきます。 最終的に以下のような構造になってくれます。
Component のプレビュー!
mdx ファイルとして書いたドキュメントは、以下のようにコンポーネントを import して マークダウン内に書くことができます。
---
name: Elements
route: components/elements
menu: Components
---
import { Paragraph, Button } from '../../src/views/components/elements'
# Paragraph
<Paragraph>hello, docz</Paragraph>
# Button
<Button
onClick={() => {
alert('hello')
}}
>
Click me
</Button>さらに Docz が提供するコンポーネントを使うことで、ドキュメント上でコンポーネントの編集やPropsの表示ができます。
---
name: Elements
route: components/elements
menu: Components
---
import { Playground, Props } from 'docz'
import { Button } from '../../src/views/components/elements'
## Button
### Properties
<Props of={Button} />
### Usage
<Playground>
<Button
onClick={() => {
alert('hello')
}}
>
Click me
</Button>
</Playground>コンポーネントのショーケースとしては、Storybook のようなツールを使うほうがやっぱり強いのかなと思いますが、普通のマークダウンで書く文章と合わせて一つのドキュメントにできるのと、 react-component-component みたいなものを使えば <Playground /> 内でインタラクティブなショーケースを作ったりできそうです。
Docusaurus のv2もMDXに対応するようですが、よりお手軽に使う場合に Docz も検討できると思います。
