思维导图控件开发-技术选择-七种武器(2)之storyboard

本文将会介绍一个开源库storybook

在用Javascript 或者 Typescript 开发web组件库(library)的过程中,如果想写一个使用这个库的示例(demo)。这个demo的代码结构用什么方式来进行组织呢。我看了很多知名开源项目的代码,不同的项目对于这块代码的组织,我总结了以下,大致上有以下几种:

demo 代码放在工程中的一个单独的文件夹中,demo代码是直接放在html 中,在demo 的html 中直接引用自身库打包发布后的代码。

比方说facebook 开源的https://github.com/facebook/draft-js
这个项目的example代码中其中的一个demo叫做https://github.com/facebook/draft-js/blob/master/examples/draft-0-10-0/link/link.html

<html>
  <head>
    <meta charset="utf-8" />
    <title>Draft • Link Editor</title>
    <link rel="stylesheet" href="../../../dist/Draft.css" />
  </head>
  <body>
    <div id="target"></div>
    <script src="../../../node_modules/react/umd/react.development.js"></script>
    <script src="../../../node_modules/react-dom/umd/react-dom.development.js"></script>
    <script src="../../../node_modules/immutable/dist/immutable.js"></script>
    <script src="../../../node_modules/es6-shim/es6-shim.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.js"></script>
    <script src="../../../dist/Draft.js"></script>
    <script type="text/babel">

demo的代码直接引用项目打包生成的文件

<script src="../../../dist/Draft.js"></script>

demo是一个使用packages.json来组织的项目

这种情况有两种做法:

demo 代码也放在库的同一个仓库中

这种情况又有好几种组织方式,下面列举两种常见的方案:

  1. demo代码用一个新的packages.json来组织
    例如draft.js下的这个示例https://github.com/facebook/draft-js/blob/master/examples/draft-0-10-0,这是一个用packages.json来组织的demo。 packages.json里面的内容如下:

{
  "name": "playground",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "codemirror": "^5.32.0",
    "draft-convert": "^2.0.1",
    "draft-js": "file:../../..",
    "immutable": "^3.8.2",
    "react": "^16.2.0",
    "react-codemirror2": "^3.0.7",
    "react-dom": "^16.2.0",
    "react-json-tree": "^0.11.0",
    "react-panelgroup": "^1.0.5",
    "react-scripts": "^1.1.5"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

这里demo对draft.js的依赖使用了这样的写法

"draft-js": "file:../../..",

表示直接通过文件系统的相对路径进行查找,相比较与写版本号,这种写法的好处是库的代码发生了更新之后,只需要重新打包生成,demo代码中就可以看到库发生的变化,而不需要每次都将库推送到npm 仓库里面去。当然也可以通过yarn link 和yarn unlink来实现。

  1. demo代码用webpack-dev-server来进行启动
    这样的话只要在库的工程目录下新建一个用于启动webpack-dev-server的webpack 配置文件, 然后使用webpack-dev-server 来启动示例。这是一种非常常见的做法。
    例如在开源项目slate https://github.com/ianstormtaylor/slate
    中启动示例的方法
"server": "webpack-dev-server --config ./support/webpack/config.js",

demo 代码和库代码在不同的仓库中

这也是一种常见的做法,将库打包生成的代码发布到npm, demo代码依赖库代码。通过版本号,或者yarn link。

正题

上面说了这么多,然而最深得我心的还是使用storybook 这个库来启动示例。
storybook 对常见的前端开发框架都做了支持。具体怎么在项目中使用可以查看文档https://storybook.js.org/docs/basics/introduction/

使用步骤

对于我最熟悉的react框架,使用storybook的步骤大致如下:

  1. 添加依赖
npm install @storybook/react --save-dev

or

yarn add @storybook/react --dev

确保react, react-dom, @babel/core, babel-loader 这些依赖也添加到了项目中,如果没有,也请添加。
2.添加npm script

{
  "scripts": {
    "storybook": "start-storybook -p 6006"
  }
}

-p 指定端口号

  1. 创建配置文件
    创建.storybook/config.js 作为storybook的基础配置
import { configure } from '@storybook/react';

function loadStories() {
  require('../stories/index.js');
  // You can require as many stories as you need.
}

configure(loadStories, module);
  1. 编写示例
    举个栗子:
    ../stories/index.js 是示例文件的路径

比方说在我的项目中创建了很多个demo,

import * as React from "react";

import { storiesOf } from "@storybook/react";
import { action } from "@storybook/addon-actions";
import { linkTo } from "@storybook/addon-links";

import { Button, Welcome } from "@storybook/react/demo";

import SimpleDemo from "./demo-blink-mind-react/SimpleDemo";
import AutoGenerateDepthForTest from "./demo-blink-mind-react/AutoGenerateDepthForTest";
import DemoScrollApi1 from "./demo-scroll-api/Demo1";
import DemoScrollApi2 from "./demo-scroll-api/Demo2";
import DemoScrollApi3 from "./demo-scroll-api/Demo3";

import DragDropDemo1 from "./demo-drag-drop/Demo1";
import DragDropDemo2 from "./demo-drag-drop/Demo2";
import DragDropDemo3 from "./demo-drag-drop/Demo3";
import DragDropDemo4 from "./demo-drag-drop/Demo4";
import DragDropDemo5 from "./demo-drag-drop/Demo5";
import DragDropDemo6 from "./demo-drag-drop/Demo6";
import DragDropDemo7 from "./demo-drag-drop/Demo7";
import DragDropDemo8 from "./demo-drag-drop/Demo8";

storiesOf("Welcome", module).add("to Storybook", () => (
  <Welcome showApp={linkTo("Button")} />
));

storiesOf("blink-mind-react-demo", module)
  .add("SimpleDemo", () => <SimpleDemo />)
  .add("AutoGenerateDepthForTest", () => <AutoGenerateDepthForTest />);

storiesOf("drag-scroll-demo", module)
  .add("demo1", () => <DemoScrollApi1 />)
  .add("demo2", () => <DemoScrollApi2 />)
  .add("demo3", () => <DemoScrollApi3 />);

storiesOf("drag-drop", module)
  .add("demo1", () => <DragDropDemo1 />)
  .add("demo2", () => <DragDropDemo2 />)
  .add("demo3", () => <DragDropDemo3 />)
  .add("demo4", () => <DragDropDemo4 />)
  .add("demo5", () => <DragDropDemo5 />)
  .add("demo6", () => <DragDropDemo6 />)
  .add("demo7", () => <DragDropDemo7 />)
  .add("demo8", () => <DragDropDemo8 />);

可以用这样的代码将demo进行分组

storiesOf("blink-mind-react-demo", module)
  .add("SimpleDemo", () => <SimpleDemo />)
  .add("AutoGenerateDepthForTest", () => <AutoGenerateDepthForTest />);
  1. 启动storybook
npm run storybook

打开浏览器的localhost:6006可以看到storybook的主界面。非常的方便。省去了很多自己去搭积木的时间。


storybook.jpg

好的,关于storybook 怎么使用就介绍完了。

storybook 高级配置

storybook 如何支持typescript , 各种css 预处理器呢?在storybook中也可以使用webpack的各种loader。只需要在.storybook目录下创建一个webpack.config.js,
在里面写webpack 的各种配置,支持typescript, css预处理器,以及其他loader和plugin支持的功能。
具体怎么配置,可以参考:
https://github.com/awehook/blink-mind-react/blob/master/.storybook/webpack.config.js

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

推荐阅读更多精彩内容