スタイルガイドジェネレータの「Fractal」を使う機会があったので、使用までの流れと使い方をメモ。
インストール
まずはFractalを使用するディレクトリへ移動します。
cd 【プロジェクトディレクトリ】
以下のコマンドでpackage.jsonを生成します。
npm init
Fractalをプロジェクトディレクトリにインストールします。
npm install --save @frctl/fractal
今回はFractal単体で使用するため、グローバルにも同様にインストールします。
npm i -g @frctl/fractal
これでインストールは一通り完了しました。
設定
プロジェクトディレクトリ内に、以下の構造でフォルダを作成します。
- src
- components
- docs
- package.json
プロジェクトディレクトリ直下に、fractalfile.jsというファイル名でファイルを作成します。
今回は以下のような内容で記述します。
'use strict';
// fractalインスタンスを作成してエクスポート
const fractal = module.exports = require('@frctl/fractal').create();
// プロジェクト関連のメタデータ設定
fractal.set('project.title', 'cly7796.net');
fractal.set('project.author', 'cly7796');
// コンポーネントの設定
fractal.components.set('path', __dirname + '/src/components');
// ドキュメントページの設定
fractal.docs.set('path', __dirname + '/src/docs');
公式のドキュメントだとfractal.jsというファイル名で生成するようになっていますが、Windows環境だとfractal.jsというファイル名でうまくいかないようなので、fractalfile.jsとしています。
package.jsonに以下を追記します。
"fractal": {
"main": "fractalfile.js"
}
サンプルでコンポーネントを追加してみます。
先ほど作成したcomponentsディレクトリ内にalert.hbsというファイル名で以下のように記述します。
<!-- src/components/alert.hbs --> <div class="alert">This is an alert!</div>
スタイルガイドのトップページの内容を追加します。
docsのディレクトリ内にindex.mdというファイルを作成して、以下のように記述します。
--- title: cly7796 Fractal sample --- Fractal sample page.
これで一通り準備完了なので、実際に使ってみます。
以下のコマンドを実行します。
fractal start --sync
「Fractal web UI server is running!」と表示されていればOKです。
記載されているURLにアクセスすると、以下のように表示されました。

左ナビのAlertをクリックすると以下のように表示されます。

ここまでのディレクトリ構造は以下のようになっています。
- src
- components
- alert.hbs
- docs
- index.md
- components
- fractalfile.js
- package.json
CSSの適用
今のままだとコンポーネントのプレビューにスタイルが当たっていない状態なので、CSSを適用してみます。
このプレビュー部分はiframeで読み込む形になっているので、このiframe内のテンプレートを用意します。

プロジェクトディレクトリ直下にpublicというフォルダを作成、さらにその中でcssというフォルダを作成して、style.cssというファイル名で以下のCSSファイルを設置します。
.alert {
color: red;
font-weight: bold;
}
fractalfile.jsの内容を以下に変更します。
'use strict';
// fractalインスタンスを作成してエクスポート
const fractal = module.exports = require('@frctl/fractal').create();
// プロジェクト関連のメタデータ設定
fractal.set('project.title', 'cly7796.net');
fractal.set('project.author', 'cly7796');
// コンポーネントの設定
fractal.components.set('path', __dirname + '/src/components');
// ドキュメントページの設定
fractal.docs.set('path', __dirname + '/src/docs');
// 静的ファイルの設定
fractal.web.set('static.path', __dirname + '/public');
12~13行目に静的ファイルの読み込みファイルを追加していて、これでpublicディレクトリ内をルートとして扱えるようになりました。
componentsディレクトリ内に_preview.hbsというファイル名で以下のように記述します。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link media="all" rel="stylesheet" href="{{ path '/css/style.css' }}">
<title>Preview Layout</title>
</head>
<body>
{{{ yield }}}
</body>
</html>
CSSのパスは{{ path ‘/css/style.css’ }}で指定していて、{{{ yield }}}の部分にコンポーネントが追加されます。
これでコンポーネントのプレビューにスタイルを当てることができました。

ここまでのディレクトリ構造は以下のようになっています。
- public
- css
- style.css
- css
- src
- components
- _preview.hbs
- alert.hbs
- docs
- index.md
- components
- fractalfile.js
- package.json
コンポーネントの設定
設定ファイルの追加
設定ファイルは同じディレクトリに同じコンポーネント名で作成する必要があり、ファイル形式はjson,js,ymlのいずれかで作成できます。
例えば先ほどのalert.hbsの設定ファイルをjson形式で作成する場合、componentsディレクトリ内に「alert.config.json」という名前でファイルを作成します。
ファイルの内容を以下のようにしてみます。
{
"title": "アラート"
}
コンポーネントページのタイトルを変更することができました。

設定ファイルでデータを管理することもできます。
例えば、alert.hbsのテキスト部分を以下のように変更してみます。
<!-- src/components/alert.hbs -->
<div class="alert">{{text}}</div>
先ほど作成したalert.config.jsonに以下のように追加します。
{
"title": "アラート",
"context": {
"text": "alert.config.jsonから設定"
}
}
これで設定ファイルからデータを渡すことができました。

別パターンのコンポーネントを作成
variants(BEMで言うところのモディファイア)を作成してみます。
componentsディレクトリ内にalert–caution.hbsというファイルを作成して、以下の内容を記述します。
<div class="alert alert--caution">{{text}}</div>
/public/css/style.cssにもスタイルを追加します。
.alert--caution {
color: yellow;
}
左ナビの表示が「Default」と「Caution」になり、別パターンのコンポーネントを追加できました。

先ほど追加した「alert.config.json」にvariantsの設定も追加できます。
以下のように変更します。
{
"title": "アラート",
"context": {
"text": "alert.config.jsonから設定"
},
"variants": [
{
"name": "caution",
"title": "アラートの別パターン",
"context": {
"text": "variants内で別途設定"
}
}
]
}
ページタイトルとコンポーネントのテキストを変更できました。

グループ化
ここまでcomponentsディレクトリ直下にファイルを設置してきましたが、さらにその中でフォルダ分けすることでグループ分けすることもできます。
例として、componentsディレクトリ内にgroupというフォルダを作成して、alert.hbsとalert–caution.hbsとalert.config.jsonをフォルダ内に移動します。
さらにgroupディレクトリ内にbtn.hbsというコンポーネントを以下の内容で追加します。
<button class="btn">Button</button>
/public/css/style.cssにスタイルを追加します。
.btn {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
padding: 0;
border: none;
outline: none;
color: #000;
font-size: 14px;
font-family: "ヒラギノ角ゴ ProN W3", "Hiragino Kaku Gothic ProN", "メイリオ", Meiryo, sans-serif;
background: transparent;
cursor: pointer;
border: #000 1px solid;
border-radius: 3px;
padding: 5px 10px;
}
左ナビを「Group」という括りでまとめることができました。

インクルード
他のコンポーネントの内容をインクルードして使用することもできます。
以下の内容でcomponentsディレクトリ内にsearch.hbsを作成します。
<input type="search" name="keywords">
{{> @btn }}
{{> @btn }}で先ほど追加したbtn.hbsをインクルードしています。

ここまでのディレクトリ構造は以下のようになっています。
- public
- css
- style.css
- css
- src
- components
- group
- alert.config.json
- alert.hbs
- alert–caution.hbs
- btn.hbs
- _preview.hbs
- search.hbs
- group
- docs
- index.md
- components
- fractalfile.js
- package.json
テーマの変更
全体のテーマのカラーがいくつか用意されているようなので設定してみます。
fractalfile.jsを以下のように変更します。
'use strict';
// fractalインスタンスを作成してエクスポート
const fractal = module.exports = require('@frctl/fractal').create();
// プロジェクト関連のメタデータ設定
fractal.set('project.title', 'cly7796.net');
fractal.set('project.author', 'cly7796');
// コンポーネントの設定
fractal.components.set('path', __dirname + '/src/components');
// ドキュメントページの設定
fractal.docs.set('path', __dirname + '/src/docs');
// 静的ファイルの設定
fractal.web.set('static.path', __dirname + '/public');
// テーマの設定
const mandelbrot = require('@frctl/mandelbrot');
const myCustomisedTheme = mandelbrot({
skin: "olive"
});
fractal.web.theme(myCustomisedTheme);
カラーを変更できました。

用意されているテーマではなく、CSS読み込みの変更もできます。
今回はデフォルトのテーマの後にCSSを追加で読み込み、上書きするようにしてみます。
'use strict';
// fractalインスタンスを作成してエクスポート
const fractal = module.exports = require('@frctl/fractal').create();
// プロジェクト関連のメタデータ設定
fractal.set('project.title', 'cly7796.net');
fractal.set('project.author', 'cly7796');
// コンポーネントの設定
fractal.components.set('path', __dirname + '/src/components');
// ドキュメントページの設定
fractal.docs.set('path', __dirname + '/src/docs');
// 静的ファイルの設定
fractal.web.set('static.path', __dirname + '/public');
// テーマの設定
const mandelbrot = require('@frctl/mandelbrot');
const myCustomisedTheme = mandelbrot({
"styles": [
"default",
"/css/styleguide.css"
]
});
fractal.web.theme(myCustomisedTheme);
/public/css/にstyleguide.cssを作成して、以下のように記述します。
.Header {
background: black;
}
ヘッダーの色を変更できました。

エクスポート
静的なHTMLにエクスポートするオプションも用意されています。
fractalfile.jsを以下のように変更します。
'use strict';
// fractalインスタンスを作成してエクスポート
const fractal = module.exports = require('@frctl/fractal').create();
// プロジェクト関連のメタデータ設定
fractal.set('project.title', 'cly7796.net');
fractal.set('project.author', 'cly7796');
// コンポーネントの設定
fractal.components.set('path', __dirname + '/src/components');
// ドキュメントページの設定
fractal.docs.set('path', __dirname + '/src/docs');
// 静的ファイルの設定
fractal.web.set('static.path', __dirname + '/public');
// テーマの設定
const mandelbrot = require('@frctl/mandelbrot');
const myCustomisedTheme = mandelbrot({
"styles": [
"default",
"/css/styleguide.css"
]
});
fractal.web.theme(myCustomisedTheme);
// HTMLの生成
fractal.web.set('builder.dest', __dirname + '/build');
これで/build/に静的HTMLの状態でスタイルガイドが生成されるようになりました。
以下のコマンドでビルドを行います。
fractal build
「Build finished with no errors.」と表示されればOKです。
以下のように生成することができました。
スタイルガイドのデモページ
【参考サイト】
コメントが承認されるまで時間がかかります。