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
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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