在开发一个 ui 组件库时,确定须要一边预览 demo,一边修改代码。css
常见的解决方案是像开发通常项目同样使用 webpack-dev-server
预览组件,好比经过 vue-cli
初始化项目,或者本身配置脚本。html
文艺一点儿地可能会用到 parcel
来简化 demo 的开发配置(好比 muse-ui)。vue
做为一个 ui 组件库,也确定要有本身的组件展现文档。webpack
通常业界常见方案是本身开发展现文档...git
但这样会带来一个组件库和文档如何同步的问题。github
因为 vuepress 支持在 markdown 中插入组件,因此咱们其实能够很天然地边写文档边开发组件。web
从开发步骤上来讲,甚至能够先写文档说明,再具体地编写代码实现组件功能。这样一来文档便是预览 demo,与组件开发能够同步更新。vue-cli
p.s. React 的组件文档能够试试这俩库:json
在开发和使用过程当中若是对于一些对象、方法的参数可以智能提示,岂不美哉?sass
如何实现呢?
其实就是在相应文件夹中添加组件相关的类型声明(*.d.ts
),并经过 src/index.d.ts
导出。
{
"typings": "src/index.d.ts",
}
复制代码
一开始将声明文件都放在
types/
文件夹下,但在实践中以为仍是放在当前文件夹下比较好。一方面有利于维护,另外一方面是读取源码时也有类型提示。
和打包库同样,选了 rollup。
在开发中用不用 *.vue
这样的单文件组件来开发呢?
<template>
只使用 render
函数。.vue
文件,但样式单独写。.jsx
文件,样式也单独写。<style>
的 .vue
文件,但在使用时必须用 vux-loader。<style>
的 .vue
文件,但有一些配置。讲道理,彻底不写 <template>
有点儿麻烦,因此添加了 rollup-plugin-vue 插件用于打包 .vue
文件。
但碰到一个问题:如何打包 <style>
中的样式?
<style>
,直接在 js 里 import scss 文件。没问题,可是写组件时不直观,同一组件的代码也分散在了两个地方为了区分不一样的场景使用不一样的 js,因此一共打包了三份 js(commonJs
、es module
、umd
),以及一份压缩后的 css(dist/tua-ui.css
)。
{
"main": "dist/TuaUI.cjs.js",
"module": "dist/TuaUI.es.js",
}
复制代码
大部分 ui 库都支持完整加载,和把大象装冰箱同样简单(但 vux 只支持按需加载):
import TuaUI from '@tencent/tua-ui'
import '@tencent/tua-ui/dist/tua-ui.css'
Vue.use(TuaUI)
复制代码
因缺思厅的是 cube-ui 把基础样式也写成 Vue 插件,致使按需引入的时候还要单独引入
Style
,emmmmmmmmm...
import {
/* eslint-disable no-unused-vars */
Style, // <-- 不写这行按需引入时就没基础样式
Button
} from 'cube-ui'
复制代码
ui 库如果只能完整加载,显然会打包多余代码。
因此各类库通常都支持按需加载组件,大概分如下几种。
webpack 其实在打包的时候是支持 tree-shaking 的,那么咱们能不能直接引用源码实现按需加载呢?
注意源码必须知足 es 模块规范(import、export)。
import { TuaToast } from '@tencent/tua-ui/src/'
Vue.use(TuaToast)
复制代码
尝试打包,发现 tree-shaking
并无起做用,仍是打包了全部代码。
其实问题出在没有在 ui 库的 package.json
中声明 sideEffects
属性。
在一个纯粹的 ESM 模块世界中,识别出哪些文件有反作用很简单。然而,咱们的项目没法达到这种纯度,因此,此时有必要向 webpack 的 compiler 提供提示哪些代码是“纯粹部分”。 —— 《webpack 文档》
注意:样式部分是有反作用的!即不该该被 tree-shaking
!
如果直接声明 sideEffects
为 false
,那么打包时将不包括样式!因此应该像下面这样配置:
{
"sideEffects": [ "*.sass", "*.scss", "*.css" ],
}
复制代码
用 vuepress 写文档的时候,通常会在 docs/.vuepress/components/
下写一些全局组件。
开发时没啥问题,可是发现一个坑:打包文档时发现组件里的样式 <style>
全丢了。
猜一猜缘由是什么?
这口锅就出在上一节的 sideEffects
,详情看这个 issue。解决方案就是在 sideEffects
里加一条 "*.vue"
便可。
下面我们打包一下安装了 ui 库的项目,看看按需加载的效果怎么样。
总结一下就是:
114.o4kb
TuaToast
后 js 增长了 0.99kb
,css 增长了 0.79kb
TuaIcon
后 js 增长了 0.96kb
,css 增长了 6.46kb
TuaUI
后 js 增长了 3.35kb
,css 增长了 8.04kb
能够看出按需加载仍是有效果的~
以上 to be continued...