1. 程式人生 > >加薪攻略之UI元件庫實踐—storybook

加薪攻略之UI元件庫實踐—storybook

[TOC] # 加薪攻略之UI元件庫實踐—storybook > 領導“拍了拍”你,是時候搭建你們團隊的 UI 元件文件庫了 ## 一、業務背景 專案中抽離的元件較多的時候,沒有集中展示出來具體有些什麼,而是分佈在各個使用的業務場景中。對於新接觸專案的開發人員來說,由於不清楚業務場景,考慮複用元件時不是很直觀,也不便於後期元件測試,維護和升級。 ## 二、選用方案 目前業界最流行的StoryBook,使用StoryBook——更好地管理我們的UI元件 使用StoryBook的特點: 元件驅動開發,由下至上,從底層元件開始一步步構建介面 隔離開發環境展示元件,無需執行專案 無需關心元件的依賴和要求 隔離UI元件,支援獨立除錯&測試,統一展示專案元件庫。 [使用效果](https://next--storybookjs.netlify.app/vue-kitchen-sink/?path=/story/button--square) ![](https://imgkr2.cn-bj.ufileos.com/401b5cb8-706c-4350-901d-4cd516e5db5b.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=In3AhGwCwBZVSB6pTuD6dy%252BIZLo%253D&Expires=1610024677) [Storybook官網](https://storybook.js.org/) ## 三、引入分析 由於原有專案技術棧為:vue+elementui+less, 可以參考Vue版的官方指南進行安裝,經過一番實踐,看了很多文章,也踩了很多坑,終於總結了以下步驟,可以更好的適配我們的專案和無侵入式引入storybook。 ### 專案結構 ![](https://static01.imgkr.com/temp/e961010e77984718a58fc85df7211cf2.png) ### 專案效果 ![](https://imgkr2.cn-bj.ufileos.com/fb489694-cb00-4ffa-b21b-6d985e9c0753.gif?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=5ZqwxJTBfWIaLT6sFE0QViW%252BZLg%253D&Expires=1610024956) ## 四、實現步驟 - install storybook 依賴 - 新建storybook配置檔案./storybook/config.js,新增相關配置,載入元件的stories - 為storybook的元件執行新增對應的webpack配置(./storybook/webpack.config.js) - 為元件新增story(即xxx.stories.js) - 執行storybook ### 1.新增依賴 ```javascript npm install @storybook/vue --save-dev npm install [email protected] style-loader css-loader less-loader --save-dev ``` (注意vue-loader的版本在15以上,配合webpack4使用) ### 2.新增npm執行指令碼 ```javascript "scripts": { ... "storybook": "start-storybook -p 6006", "build-storybook": "build-storybook -c .storybook -o .out" }, ``` ### 3.新增配置檔案 .storybook/config.js ```javascript import { addParameters,configure } from '@storybook/vue'; function loadStories() { /*根據特定的檔名載入stories,在這個例子,用xxx.stories.js命名檔案*/ const req = require.context('./stories', true, /\.stories\.js$/); req.keys().forEach(filename => req(filename)); } addParameters({ options: { panelPosition: 'right' //操作面板在右邊 }, }) configure(loadStories, module); ``` 根據專案情況,同樣在以上檔案中,做一些和專案中 main.js 相似的初始化工作: ```javascript //.storybook/config.js import Vue from "vue"; import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; import axios from "axios"; import '@/utils/prototype'; Vue.config.productionTip = false; Vue.prototype.$http = axios; Vue.use(ElementUI, { size: 'mini'}); ... ``` ### 4.新增必要的webpack配置 建立檔案 .storybook/webpack.config.js ``` // .storybook/webpack.config.js const path = require('path'); module.exports = async ({ config, mode }) => { function resolve(dir) { return path.join(__dirname, "..", dir); } //設定別名同項目保持一致 config.resolve = { extensions: [".js", ".vue", ".json", ".jsx"], alias: { vue$: "vue/dist/vue.esm.js", "@": resolve("src"), "@assets": resolve("src/assets") } }; config.module.rules.push({ test: /\.(css|less)$/, use: ["style-loader", "css-loader","less-loader"], exclude:/node_modules/ }); return config; }; ``` ### 5.準備專案中的元件 src/components/Button/index.vue ``` ``` ### 6.為元件新增story 建立 .storybook/stories/button.stories.js ``` import { storiesOf } from '@storybook/vue'; import vButton from '../../src/components/Button/index.vue'; storiesOf('Button', module) .add('with text', () => ({ components: { vButton }, template: 'Hello Button', })) .add('with some emoji', () =>
({ components: { vButton }, template: '