Commit 463307ef357113df29d08581fd1925417136292c

Authored by ly525
1 parent 44f695ca

docs: add api dev docs link and custom plugin dev docs; #!zh 增加后端 api 文档链接和自定义组件开发文档

docs/.vuepress/config.js
... ... @@ -36,6 +36,7 @@ module.exports = {
36 36 // { text: 'API', link: '/api/' },
37 37 { text: 'Website', link: 'https://h5.luban-h5.com' },
38 38 { text: 'Changelog', link: 'https://github.com/ly525/luban-h5/releases' },
  39 + { text: 'Api Docs', link: 'https://h5.luban-h5.com/documentation/' },
39 40 ],
40 41 sidebar: {
41 42 '/': [
... ... @@ -59,10 +60,17 @@ module.exports = {
59 60 ],
60 61 },
61 62 {
62   - collapsable: true,
63   - title: '🔌 Local plugins',
  63 + collapsable: false,
  64 + title: '🔌Plugins Development',
64 65 children: [
65   - '/en/plugin-development/quick-start',
  66 + '/zh/plugin-development/',
  67 + '/zh/plugin-development/how-it-works/simple-prop',
  68 + '/zh/plugin-development/how-it-works/custom-editor-single-prop',
  69 + '/zh/plugin-development/how-it-works/custom-editor-multiple-props',
  70 + '/zh/plugin-development/quick-start',
  71 + '/zh/plugin-development/cli-params',
  72 + '/zh/plugin-development/plugin-default-inject-props',
  73 + '/zh/plugin-development/reference',
66 74 ],
67 75 },
68 76 {
... ... @@ -86,6 +94,7 @@ module.exports = {
86 94 // { text: '插件', link: '/zh/plugin/' },
87 95 { text: '首页', link: 'https://h5.luban-h5.com' },
88 96 { text: '发布日志', link: 'https://github.com/ly525/luban-h5/releases' },
  97 + { text: '后端API文档', link: 'https://h5.luban-h5.com/documentation/' },
89 98 ],
90 99 sidebar: {
91 100 '/': [
... ... @@ -109,10 +118,17 @@ module.exports = {
109 118 ],
110 119 },
111 120 {
112   - collapsable: true,
113   - title: '🔌 Local plugins',
  121 + collapsable: false,
  122 + title: '🔌插件/自定义组件开发(Alpha)',
114 123 children: [
  124 + '/zh/plugin-development/',
  125 + '/zh/plugin-development/how-it-works/simple-prop',
  126 + '/zh/plugin-development/how-it-works/custom-editor-single-prop',
  127 + '/zh/plugin-development/how-it-works/custom-editor-multiple-props',
115 128 '/zh/plugin-development/quick-start',
  129 + '/zh/plugin-development/cli-params',
  130 + '/zh/plugin-development/plugin-default-inject-props',
  131 + '/zh/plugin-development/reference',
116 132 ],
117 133 },
118 134 {
... ...
docs/zh/plugin-development/README.md 0 → 100644
  1 +# 目录
  2 +> 说明,自定义组件目前处于 Alpha 版本,持续迭代中,API 可能会发生重大变化。
  3 +> 建议到 Beta 版本再使用
  4 +
  5 +- [原理篇:简单属性编辑器](how-it-works/simple-prop.md)
  6 +- [原理篇:单属性自定义编辑器](how-it-works/custom-editor-single-prop.md)
  7 +- [原理篇:多属性自定义编辑器](how-it-works/custom-editor-multiple-props.md)
  8 +- [脚手架:快速上手](quick-start.md)
  9 +- [脚手架:命令行交互说明](cli-params.md)
  10 +- [组件:默认属性注入](plugin-default-inject-props.md)
  11 +- [参考资料](reference.md)
0 12 \ No newline at end of file
... ...
docs/zh/plugin-development/cli-params.md 0 → 100755
  1 +# 脚手架-命令行参数说明
  2 +
  3 +## 命令参数说明
  4 +1. `组件的名称(发布到npm)`:***输入组件名称***
  5 + * 默认为 `test`,这个名字最后会作为:component name
  6 + * 将在luban-h5的编辑器中,通过 `yarn add component-name` 的形式引入
  7 +
  8 +2. `icon`: ***输入icon***
  9 + > ![image](https://user-images.githubusercontent.com/12668546/69070298-daac0200-0a62-11ea-9543-9199f6040545.png)
  10 +
  11 +
  12 + * 访问 [Font Awesome 4.7 版本](https://fontawesome.com/v4.7.0/icons/)
  13 +
  14 + * 按照下图的方法,选择一个 icon, 在命令行对话中,输入即可
  15 + > ![image](https://user-images.githubusercontent.com/12668546/69069617-c3204980-0a61-11ea-8239-7f7bf660297d.png)
  16 +
  17 +
  18 + ```js
  19 + export default {
  20 + // 在 https://fontawesome.com/v4.7.0/icons/ 中寻找对应的 icon,填入 icon 字段即可
  21 + icon: 'address-book',
  22 + name: 'luban-h5-address',
  23 + }
  24 + ```
  25 +
  26 +3. `是否有命名空间(@scope)`:***Yes or No***
  27 + * 作为组织或者企业开发组件,可以选择 `Yes`,在下一步,填写 `npm scope`
  28 +
  29 +4. `scope(命名空间<理解为企业/组织名称>)`: ***输入scope名称***
  30 + * 将企业/组织的组件放在 `@组织名` 下, 便于管理
  31 + * 举例1:
  32 + * LubanH5 的官方组件库,都放在了`@luban-h5`这个 scope 下。
  33 + * 以按钮组件为例,通过 `yarn add @luban-h5/lbc-button`,即可引入官方按钮组件了
  34 + * 用户一看到 `@luban-h5` 这个,就知道是由 LubanH5 官方提供的组件库
  35 + * 举例2:
  36 + * 你的企业/组织名称是 `abc`,你在开发 `upload` 上传组件,那么就可以选择:
  37 +
  38 + ```bash
  39 + 组件的名称(发布到npm) :upload
  40 + 是否有命名空间(@scope):Yes
  41 + scope:abc
  42 +
  43 + 通过 `npm publish --access public` 发布到 npm
  44 + 通过`npm install @abc/upload` 或 `yarn add @abc/uplaod`, 即可引入到`鲁班编辑器`中作为`自定义组件`使用
  45 + ```
  46 +
  47 +
  48 +## 相关概念
  49 +[npm-scope 官网文档](https://docs.npmjs.com/misc/scope)
0 50 \ No newline at end of file
... ...
docs/zh/plugin-development/how-it-works/custom-editor-multiple-props.md 0 → 100755
  1 +# 原理篇:多属性自定义编辑器
  2 +> 自定义组件/插件/Plugin 原理概览
  3 +
  4 +## 举例 [鲁班H5 轮播图组件](https://github.com/luban-h5-components/lbp-slide)
  5 +- 这个组件本质上就是一个 vue 组件
  6 +- 其本质是对 [Vant组件库的轮播组件](https://youzan.github.io/vant/#/zh-CN/swipe) 的简单封装
  7 +- [核心代码](https://github.com/luban-h5-components/lbp-slide/blob/master/src/component/entry.vue)
  8 + - 可以看出来,核心代码其实非常简单,和大家平时写轮播图,或者调用第三方组件库的轮播图的方式几乎没有区别,基本上是配置一些 props,比如轮播间隔时间、轮播图列表等
  9 + - 接下来我们来讲一下不同的地方在哪里🧐
  10 +
  11 +## 自定义组件和常规组件的不同之处(影响多个属性)
  12 +以[如下这段代码](https://github.com/luban-h5-components/lbp-slide/blob/master/src/component/entry.vue#L57-L67)为例,相信写 `vue` 或者 `react` 的同学,应该会比较熟悉
  13 +
  14 +配置 轮播组件的 items,也就是轮播的选项信息
  15 +```js
  16 +props: {
  17 + items: {
  18 + type: Array,
  19 + default: () => [
  20 + { value: 'https://img.yzcdn.cn/vant/apple-1.jpg' },
  21 + { value: 'https://img.yzcdn.cn/vant/apple-2.jpg' }
  22 + ],
  23 + // 主要区别应该是这里
  24 + editor: {
  25 + custom: true
  26 + }
  27 + }
  28 +}
  29 +```
  30 +
  31 +- 这里和我们平时写的组件是有些区别的,我们添加了这些信息
  32 +```js
  33 +editor: {
  34 + custom: true
  35 +}
  36 +```
  37 +- 其中`custom: true` 表示在编辑器的右侧面板,采用`自定义属性编辑器`来配置`自定义组件`的相关属性
  38 +
  39 +- 在这里可以理解为:采用`自定义属性编辑器`来配置`轮播组件`的`items`属性
  40 +
  41 +- 那么,它和上面的 按钮组件的 `color.editor` 有什么区别呢?为何这里不采用一个第三方组件呢?
  42 +
  43 +- 答案:因为有时候,有些操作会影响多个属性值(联动)
  44 +
  45 +- 以轮播图组件的实际场景为例,我们来解释下什么叫:`有些操作会影响多个属性值`。毕竟这句话猛的一听,有点像教科书,晦涩难懂,咱还是说说实际业务场景吧
  46 +
  47 +> 有图有真相:
  48 +> ![image](https://user-images.githubusercontent.com/12668546/73135735-b7b05680-4080-11ea-9d54-02760c9a13d3.png)
  49 +
  50 +- 按照图中的说法,如果我们点击了【减号】按钮,其实就会影响到两个属性:`activeIndex` 和 `items`,因此如果写了一个和上面的颜色选择器一样的组件,放在 activeIndex 或 items 任意一方中都是不太合适的,因为这个算是二者共有的;
  51 + - 轮播图 props 主要代码如下:[代码链接](https://github.com/luban-h5-components/lbp-slide/blob/master/src/component/entry.vue#L50-L67):
  52 +
  53 + ```js
  54 + props: {
  55 + activeIndex: {
  56 + type: Number,
  57 + default: 0,
  58 + editor: {
  59 + custom: true
  60 + }
  61 + },
  62 + items: {
  63 + type: Array,
  64 + default: () => [
  65 + { value: 'https://img.yzcdn.cn/vant/apple-1.jpg' },
  66 + { value: 'https://img.yzcdn.cn/vant/apple-2.jpg' }
  67 + ],
  68 + editor: {
  69 + custom: true
  70 + }
  71 + }
  72 + }
  73 + ```
  74 +
  75 +- 如何解决呢:
  76 + - 还记得我们上面讲过的,将按钮 放置到 中间画布上的操作吗?
  77 +
  78 + ***鲁班会自动遍历`按钮组件` 的 `props`,构造一个包含了组件基本属性和其默认值的配置对象:`pluginProps`***
  79 +
  80 + - 我们可以写一个组件,比如叫 `slideEditor` (轮播编辑器,叫啥随你,最好有相关性,清晰易懂即可,最好加注释)
  81 + - 我们要解决的问题是,点击一个按钮,会修改多个属性的值,多个属性的值和其值存在哪里呢?其实就在 `pluginProps` 中
  82 + - 我们把 `pluginProps` 作为属性传入到 `slideEditor`(也就说将轮播图组件的所有 props和其值 都传入到 slideEditor 中),这样就可以在 slideEditor 中更新这个 pluginProps 了,换句话说,所有的 props和值都给你了,你可以改多个 props 的值了
  83 + - show me the code,让我们看下 slideEditor 是如何实现的吧,主要代码如下:[完整代码链接](https://github.com/luban-h5-components/lbp-slide/blob/master/src/component/editor.vue)
  84 + ```vue
  85 + <!--
  86 + 轮播组件属性自定义编辑器(增强编辑器)
  87 + 文档:https://github.com/luban-h5/vue-cli-plugin-lbhc/wiki
  88 + -->
  89 + <template>
  90 + <div>
  91 + <a-pagination
  92 + :current="current"
  93 + @change="handleSelectPage"
  94 + size="small"
  95 + :total="innerItems.length"
  96 + :defaultPageSize="1"
  97 + :itemRender="itemRender"
  98 + />
  99 + <lbs-image-gallery
  100 + style="margin: 16px 0"
  101 + :value="currentItem.value"
  102 + @change="handleSelectImage"
  103 + />
  104 + </div>
  105 + </template>
  106 +
  107 + <script>
  108 + export default {
  109 + props: {
  110 + /**
  111 + * 通过 new Vue.component('plugin-name').$optioins.props 收集组件的属性
  112 + * 作为 Object,传递给 props editor,从而从过属性自定义编辑器 来更新属性值
  113 + */
  114 + pluginProps: {
  115 + type: Object,
  116 + default: () => ({
  117 + items: [],
  118 + activeIndex: 0
  119 + })
  120 + }
  121 + },
  122 + methods: {
  123 + itemRender (current, type, originalElement) {
  124 + // 减号按钮
  125 + if (type === 'prev') {
  126 + return <a-button style={{ marginRight: '8px' }} size="small" icon="minus" onClick={() => this.minus(current)} disabled={this.innerItems.length === 1}></a-button>
  127 + } else if (type === 'next') {
  128 + return <a-button style={{ marginLeft: '8px' }} size="small" icon="plus" onClick={this.add}></a-button>
  129 + }
  130 + return originalElement
  131 + },
  132 + // 点击减号的 callback:items.splice 和 activeIndex--
  133 + minus (index) {
  134 + if (this.innerItems.length === 1) return
  135 + this.pluginProps.items.splice(index, 1)
  136 + this.pluginProps.activeIndex = Math.max(index - 1, 0)
  137 + }
  138 + }
  139 + }
  140 + </script>
  141 + ```
  142 +
  143 +大概的原理到这里就差不多,这也是鲁班H5的自定义组件和其编辑器的核心原理了
  144 +
  145 +下一章来讲讲,如何利用鲁班H5 官网提供的`自定义组件-脚手架`来`快速开发`自定义组件
... ...
docs/zh/plugin-development/how-it-works/custom-editor-single-prop.md 0 → 100755
  1 +# 原理篇:单属性自定义编辑器
  2 +> 自定义组件/插件/Plugin 原理概览
  3 +
  4 +通过`自定义属性编辑器`来配置组件的某些属性的`复杂编辑需求`
  5 +
  6 +举个例子:图片的 imgSrc 属性,采用自定义编辑器的方法如下,[图片演示](https://user-images.githubusercontent.com/12668546/69001396-6a916500-0918-11ea-8f39-5e27a688d2fe.png)
  7 +
  8 +```js
  9 +props: {
  10 + imgSrc: {
  11 + type: String,
  12 + defualt: '',
  13 + editor: {
  14 + custom: true
  15 + // 如果写了 custom: true,则会采用 editor.vue 或者 editor.js 来配置组件的相关属性
  16 + // 自定义组件的加载目前在 mini-editor/panel/props.js 的 loadCustomEditorForPlugin 方法中加载并注册
  17 + // 这样,就可以通过自定义属性编辑器来配置组件的某些复杂属性了
  18 + // 图片演示:https://user-images.githubusercontent.com/12668546/69001396-6a916500-0918-11ea-8f39-5e27a688d2fe.png
  19 + }
  20 + }
  21 +}
  22 +```
  23 +
  24 +- 1. 从上面来看,其实我们自定义的这个图片选择器,只影响到了 imgSrc 这一个属性
  25 +- 2. 其实可以把它抽象出来作为一个组件(比如叫做 `luban-support-image-gallery`(鲁班辅助支撑组件-图片库))
  26 +- 3. 发布到 npm 上,作为全局组件引入即可
  27 +
  28 +简单改造下 imgSrc 的属性配置:
  29 +```js
  30 +props: {
  31 + imgSrc: {
  32 + type: String,
  33 + defualt: '',
  34 + editor: {
  35 + type: 'luban-support-image-gallery'
  36 + }
  37 + }
  38 +}
  39 +```
... ...
docs/zh/plugin-development/how-it-works/simple-prop.md 0 → 100755
  1 +# 原理篇:简单属性编辑器
  2 +> 自定义组件/插件/Plugin 原理概览
  3 +
  4 +## [鲁班H5 按钮组件](https://github.com/luban-h5-components/lbc-button)
  5 +- 这个组件本质上就是一个 vue 组件
  6 +- [核心代码](https://github.com/luban-h5-components/lbc-button/blob/master/src/component/entry.js)
  7 + - 可以看出来,核心代码其实非常简单,和大家平时写按钮组件差不多,基本上是配置一些 props,比如颜色、字体、内容、背景色、前景色、border 等
  8 + - 以 color 为例:
  9 + ![image](https://user-images.githubusercontent.com/12668546/73135438-f8a66c00-407c-11ea-9f7c-1b110ea3b2b3.png)
  10 +
  11 + ```js
  12 + props: {
  13 + color: {
  14 + type: String,
  15 + // 注意,根据 MDN 文档,颜色选择器的 value 只能是:# + 6个16进制字符串
  16 + // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/color#Value
  17 + // The value of an <input> element of type color is always a DOMString which contains a 7-character string specifying an RGB color in hexadecimal format.
  18 + default: '#000000',
  19 + editor: {
  20 + type: 'el-color-picker',
  21 + label: '文字颜色',
  22 + // !#zh 为编辑组件指定 prop
  23 + prop: {
  24 + size: 'mini',
  25 + showAlpha: true
  26 + },
  27 + require: true
  28 + }
  29 + },
  30 + }
  31 + ```
  32 + - 可以看到相对于平时我们写的 Vue 或者 React 组件,这里的 color 的 prop 多了一个 key: `editor`
  33 + - 这个 `color.editor` 就是 颜色的`属性编辑器`了,因为鲁班默认集成了 element-ui 的颜色选择器组件,因此我们可以直接使用 `'el-color-picker'` 来作为颜色属性的自定义编辑器
  34 + - 当然,鲁班也集成了 ant-design-vue 的全部组件,但因为 ant-design-vue 的颜色选择器目前功能上没有 element-ui 的颜色选择器强大(不支持透明度),因此我们选择了 element-ui 的颜色选择器
  35 +
  36 +
  37 + - 在把`按钮` 从左侧`拖拽放置`到 `编辑器`中间的画布上的时候,鲁班会自动执行如下代码:
  38 + - 遍历`按钮组件`的`props`
  39 + - 构造 pluginProps 对象,作为画布中按钮元素的描述信息(也是数据库中存储的信息)
  40 + ```js
  41 + // init prop of plugin
  42 + getDefaultPluginProps (props) {
  43 + const pluginProps = {
  44 + uuid: this.uuid // uuid 用于在组件树中定位组件
  45 + }
  46 + Object.keys(props).forEach(key => {
  47 + const defaultValue = props[key].default
  48 + pluginProps[key] = typeof defaultValue === 'function' ? defaultValue() : defaultValue
  49 + })
  50 + return pluginProps
  51 + }
  52 + ```
  53 +
  54 + - 得到的结果大致如下,也就代表着,按钮在画布上的颜色、文字、边框、对齐、字体等信息如下
  55 + ```js
  56 + pluginProps = {
  57 + "uuid": 1580038843434,
  58 + "text": "按钮",
  59 + "vertical": false,
  60 + "backgroundColor": "rgba(255, 255, 255, 0.2)",
  61 + "color": "#000000",
  62 + "fontSize": 14,
  63 + "lineHeight": 1,
  64 + "borderWidth": 0,
  65 + "borderRadius": 0,
  66 + "borderColor": "#ced4da",
  67 + "textAlign": "center"
  68 + }
  69 + ```
  70 +
  71 +## 简单属性编辑器小结
  72 +如果组件的某些属性比较简单,比如文本、数字,则可以使用 [ant-design-vue](https://www.antdv.com/docs/vue/introduce-cn/) 组件来配置组件的属性
  73 +
  74 +举个例子:图片的 imgSrc 配置,[图片演示](https://user-images.githubusercontent.com/12668546/69001390-42096b00-0918-11ea-85b4-0ec868e44769.png)
  75 +
  76 +```js
  77 +props: {
  78 + imgSrc: {
  79 + type: String,
  80 + defualt: '',
  81 + editor: {
  82 + type: 'a-input'
  83 + // 调用 ant-design-vue 的 input(输入框) 组件来配置 imgSrc,直接复制粘贴图片的链接即可
  84 + // 图片演示:https://user-images.githubusercontent.com/12668546/69001390-42096b00-0918-11ea-85b4-0ec868e44769.png
  85 +
  86 + // 这样比较简单,但是有时候,用户可能希望编辑图片的时候,可以自己上传 或 从图片库中选择图片
  87 + // 图片演示:https://user-images.githubusercontent.com/12668546/69001396-6a916500-0918-11ea-8f39-5e27a688d2fe.png
  88 + // 这时候,简单的 input(输入框) 就无法满足需求了,这时候给组件属性配置自定义编辑器就有了用武之地了,具体请往下看。
  89 + }
  90 + }
  91 +}
  92 +```
... ...
docs/zh/plugin-development/plugin-default-inject-props.md 0 → 100755
  1 +# 组件默认属性
  2 +> 鲁班向自定义组件 默认注入了一些属性,便于开发
  3 +
  4 +### editorMode 编辑器当前模式
  5 + * preview: 预览模式
  6 + * edit: 编辑模式
  7 +
  8 +```js
  9 +props: {
  10 + editorMode: {
  11 + type: String,
  12 + default: 'edit'
  13 + },
  14 +}
  15 +```
  16 +
  17 +
  18 +```js
  19 +/**
  20 + * #!zh: 编辑器当前模式:
  21 + * preview: 预览模式
  22 + * edit: 编辑模式
  23 + *
  24 + * 通常用在轮播图、单选、多选、提交按钮、视频
  25 + * 因为他们在编辑模式和预览模式下有不同的表现
  26 + *
  27 + * 举例:
  28 + * ================================================================================================================================
  29 + * | 组件名称 | 编辑模式表现 | 预览模式表现 |
  30 + * ================================================================================================================================
  31 + * | 轮播图 | 正在编辑的图片 | 轮播图 |
  32 + * --------------------------------------------------------------------------------------------------------------------------------
  33 + * | 提交按钮 | 仅可点击, 但不会提交表单 | 可点击, 且可以提交表单 |
  34 + * --------------------------------------------------------------------------------------------------------------------------------
  35 + * | 视频 | 视频占位 icon | 可播放的视频 |
  36 + * --------------------------------------------------------------------------------------------------------------------------------
  37 + *
  38 + *
  39 + *
  40 + * #!en: current mode for editor
  41 + * preview: preview mode
  42 + * edit: edit mode
  43 + *
  44 + * commonly used for carousel, checkbox, radio, form submit button、video etc...
  45 + * Because they have different behaviour in edit mode and preview mode.
  46 + *
  47 + * Examples:
  48 + * ================================================================================================================================
  49 + * | Component | Edit Mode Behaviour | Preview Mode Behaviour |
  50 + * ================================================================================================================================
  51 + * | carousel | editing image | carousel |
  52 + * --------------------------------------------------------------------------------------------------------------------------------
  53 + * | form submit button | only clickable, but will not submit the form | clickable, can submit the form |
  54 + * --------------------------------------------------------------------------------------------------------------------------------
  55 + * | video | video placeholder icon | playable video |
  56 + * --------------------------------------------------------------------------------------------------------------------------------
  57 + *
  58 + */
  59 +```
0 60 \ No newline at end of file
... ...
docs/zh/plugin-development/quick-start.md
1 1 # 快速开始
2   -TODO
  2 +> 以下内容与 [vue-cli-plugin-lbhc README](https://github.com/luban-h5/vue-cli-plugin-lbhc) 相同
3 3  
4   -### 如何进行插件开发
  4 +> vue-cli-plugin-lbhc 全称为:vue-cli-plugin-luban-h5-component
5 5  
6   -我现在的认知里面,做成插件的模式,还是需要clone 下来 debug 插件的实际效果的
7   -不过可以改进插件的开发流程,让插件作者尽量低成本的开发,只要注重插件本身的逻辑就可以了
  6 +## 安装
8 7  
9   -它山之石:Vuepress、Grafana
  8 +### 使用preset自动安装插件
  9 +```
  10 +vue create --preset luban-h5/vue-cli-plugin-lbhc my-luban-component-demo
  11 +```
10 12  
11 13  
12   ----
  14 +### 目录结构
13 15  
14   -<Vssue issueId="10" />
15 16 \ No newline at end of file
  17 +```bash
  18 +mini-editor 模拟鲁班H5的核心编辑器功能
  19 +component 你要编写组件的目录
  20 + index.js 组件入口
  21 + editor.js 组件的编辑面板配置
  22 +
  23 +```
  24 +
  25 +
  26 +### 开发流程
  27 +
  28 +```bash
  29 +vue create --preset luban-h5/vue-cli-plugin-lbhc lbc-demo
  30 +cd lbc-demo
  31 +yarn serve
  32 +
  33 +# 构建、发布个人组件
  34 +yarn build
  35 +npm login
  36 +npm publish
  37 +
  38 +
  39 +# 构建发布 scope 组件
  40 +yarn build
  41 +npm login
  42 +npm publish --access publish
  43 +```
... ...
docs/zh/plugin-development/reference.md 0 → 100755
  1 +# 参考资料
  2 +
  3 +1. Vue Cli3+
  4 +2. Grafana
  5 +3. Figma
  6 +
  7 +---
  8 +
  9 +<Vssue issueId="10" />
0 10 \ No newline at end of file
... ...