Laravel Mix + Storybook = Love

前言

Storybook是前端开发的神器, 翻译成中文就是故事书。你改 Vue,JS, SCSS 文件, 它马上可以显示,不用刷新。而且可以 根据 Component 来一个个渲染,十分直观; 对于测试,还有 UI/UX 设计师都是好东西。最重要的是,在开发完成前,不用放入现有的路由 (Laravel 或者 VueRouter 内), 也先不用做一个 Blade 文件。 而且可以根据故事,加入不同的 Props , 然后看看在各种情况下,前段长啥样。

问题

Laravel 开发师们,因为我们有 Laravel Mix , 完全不会想去自己写 webpack 配置文件, 也没有 webpack 配置文件,和 Babel 配置; Laravel 所用的目录也和 Vue-Cli 不同,所以很难照抄网上现有的教程。Storybook 也不会读 webpack.mix.js , 所以很多东西无法编译。还有很多包(比如说 sass, vue-template-compiler)是没有“安装”的,所以会有很多错误。

安装

我的 Laravel Mix 版本是 4.0, 我也建议大家升上去(不难生)。不过本方法理论上 3.0 可以用,不过 2.X 绝对用不了。目录版本是 5.6+的了,如果你还是 5.5, 记得把 components/ 写成 components/resources/

安装 Storybook Vue 其实很简单, 你这么做就好了:

yarn add --dev @storybook/vue vue-template-compiler babel-preset-vue fibers sass-loader sass url-loader file-loader

或者

npm install --save-dev @storybook/vue vue-template-compiler babel-preset-vue fibers sass-loader sass url-loader file-loader

然后,在 package.jsonscripts 里加上:
"storybook": "start-storybook -p 9001 -c .storybook"

日后,就可以直接 yarn run storybook or npm run storybook 啦。

配置

  1. 建立一个 .storybook 目录, 以下所有文件都放在这个目录:
  2. 在目录里加上 .babelrc , 内容如下:
    {
    "presets": ["@babel/preset-env"]
    }

    这样子就保证编译的是 ES6 。

  3. 加上 webpack.config.js , 这个文件千万别放到 Laravel 的根目录上, 不然你 Laravel Mix 就不好使了。 这个是专属于 Storybook 的 Webpack 配置, 保证了 resources 下所有文件可以被编译,而且还不会出现 jQuery 问题 (好多插件这年头还在用 jQuery, 摊手。。。)。 这里的 SASS 编译器是 Dart-SASS, 如果你要用 Node-SASS, 把
    options: {
                        implementation: require("sass"),
                        fiber: Fiber
                    }

    踢掉就好了。

const path = require("path");
const Fiber = require('fibers');
const webpack = require('webpack');

module.exports = (baseConfig, env, defaultConfig) => {
    defaultConfig.plugins.push(
        new webpack.ProvidePlugin({
            $: "jquery",
            jQuery: "jquery"
        })
    );

    defaultConfig.resolve.alias = {
        jQuery: 'jquery/src/jquery',
        '$' :  'jquery/src/jquery',
        'vue$': 'vue/dist/vue.js'
    };

    defaultConfig.module.rules.push(
        {
            test: /\.scss$/,
            use: [
                "style-loader", // creates style nodes from JS strings
                "css-loader", // translates CSS into CommonJS
                {
                    loader: "sass-loader",
                    options: {
                        implementation: require("sass"),
                        fiber: Fiber
                    }
                }
            ]
        },
        {  test: /\.css$/,
            loader: 'style-loader!css-loader',
            include: __dirname
        },
        {
            test: /\.(woff|woff2)$/,
            use: {
                loader: 'url-loader',
                options: {
                    name: 'fonts/[hash].[ext]',
                    limit: 5000,
                    mimetype: 'application/font-woff'
                }
            }
        },
        {
            test: /\.(ttf|eot)$/,
            use: {
                loader: 'file-loader',
                options: {
                    name: 'fonts/[hash].[ext]'
                }
            }
        }
        }
        );
    defaultConfig.resolve.extensions.push(".scss");
    return defaultConfig;
};
  1. Config.js. Storybook 的配置文件. 这个自动加载你所有的故事, 并且读取你给Mix的 app.js, app.scss。如果你有其他的配置文件(一般是丢在 app.js) 内啦,不过也有特殊情况, 也是放这里。
import { configure} from '@storybook/vue';
import '../resources/js/app';
import '../resources//sass/app.scss'

// automatically import all files ending in *.stories.js
const req = require.context('../resources/js/', true, /.stories.js$/);

function loadStories() {
    req.keys().forEach(function (filename) {console.log(filename);req(filename)});
}

configure(loadStories, module);

写出你的一个故事

这里用大家都有的 Example.vue 文件做例子。 在 Example.Vue的旁边,新建一个 Example.stories.js。 文件内容如下:

import { storiesOf }   from "@storybook/vue";
import example from "./example";

storiesOf("Example Component", module)
    .add("main page", () => {
              return {
                components : {example},
                template   : `<example></example>`
            }
    });

然后, 跑: yarn run storybook 或者 npm run storybook , 这时候你会发现很多错误和警告。 没关系,看他说差什么包,你就装什么包。 一般包装全了,就没事了。

进入 localhost:9001 , 左边的导航会看到你刚刚写的故事。 然后,开始测试吧!

后言

Storybook 会出很多意外,因为无法直接套用 Laravel Mix用的配置,所以渲染方面,很多图像,字体可能会消失 (建议你把字体装到系统里)。而且没有在 Windows 底下试过,你们试了告诉我哈。。。 如果你是一个会写 Webpack 配置的上神, 那么这些问题你自然没有。 不过,你可以同时间看到,你的程序在不同 状况下的不同姿态,并且可以实时修改, 是很舒服,很省时间的。 如果有问题,回复PO在下面, 看看大家都遇到了什么状况。

本作品采用《CC 协议》,转载必须注明作者和本文链接
Software Engineer Practices above all 软件开发标准高于一切
Shuyi
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!