首页 > 其他分享 > Vue3 企业级优雅实战 - 组件库框架 - 3 搭建组件库开发环境

Vue3 企业级优雅实战 - 组件库框架 - 3 搭建组件库开发环境

时间:2022-11-11 15:13:16浏览次数:54  
标签:demo 企业级 yyg ui Vue3 组件 foo 目录

前文已经初始化了 workspace-root,从本文开始就需要依次搭建组件库、example、文档、cli。本文内容是搭建 组件库的开发环境。

1 packages 目录

前面在项目根目录下创建了 packages 目录,该目录存放组件库的所有组件组件库的入口。该目录中已经创建了两个子目录 fooyyg-demo-ui。这两个目录是干嘛用的呢?

1.1 foo 目录

foo 目录代表一个示例组件,后面咱们会使用该组件来测试组件库在 example 和组件库文档中是否能正常运行。后续要开发的所有组件(如高级卡片组件、JSON Schema 表单组件等)都与 foo 组件的文件目录结构保持一致。

1.2 yyg-demo-ui 目录

该目录与整个组件库工程的名称相同,所以你本地的这个目录不一定叫这个名称。该目录是组件库的入口模块,该模块会安装组件库的所有组件(即 packages 目录下的其他包)作为依赖,并引入全部组件,统一暴露。此外还是打包组件库的入口。可以将它理解为组件库的聚合模块。

2 实现 foo 示例组件

2.1 初始化 package.json

foo 目录存放示例组件,它也是一个包,所以需要在命令行中进入 packages/foo 目录,使用 pnpm 初始化:

pnpm init

修改生成的 package.json 中的 name 属性值为 foo,在 monorepo 中,子包的 name 属性通常会命名为 @组织名/foo,由于咱是个组件库,可以将其命名为 @组件库名/foo,即 @yyg-demo-ui/foo。我修改了 package.json 的下面几个属性:

{
  "name": "@yyg-demo-ui/foo",
  "version": "1.0.0",
  "description": "示例组件",
  "author": "程序员优雅哥 youyacoder",
  "main": "index.ts",
...
}

2.2 初始化 foo 目录结构

在命令行中进入 foo 目录:

  1. 创建 index.ts 文件,该文件为组件的入口文件:
touch index.ts
  1. 创建 src 目录,该目录存放组件的实现源码。在 foo/src/ 中创建 index.tsxtypes.ts,前者是组件的具体实现,后者是组件的 props 定义及类型:
mkdir src
touch src/index.tsx src/types.ts

如此一来,示例组件 foo 的目录结构便创建完成,目录结构如下:

packages/
|- foo/
		|- index.ts
		|- src/
				|- index.ts
				|- types.ts
|- yyg-demo-ui/

2.3 定义 foo 组件的 props

foo/src/types.ts 中定义 foo 组件的 props,并提取其类型:

import { ExtractPropTypes } from 'vue'

export const fooProps = {
  msg: {
    type: String,
    required: false,
    default: ''
  }
}

export type FooProps = ExtractPropTypes<typeof fooProps>

上面的代码定义了一个非必填的属性 msg,并使用 vue 中提供的 ExtractPropTypes 提取 props 的类型。

2.4 实现 foo 组件

foo/src/index.tsx 中实现 foo 组件:

import { defineComponent } from 'vue'
import { fooProps } from './types'

const NAME = 'yyg-foo'

export default defineComponent({
  name: NAME,
  props: fooProps,
  setup (props, context) {
    console.log(props, context)
    const onBtnClick = () => {
      console.log('点击按钮测试', props.msg)
    }
    return () => (
      <div class={NAME}>
        <h1>yyg-demo-ui Foo</h1>
        <p class={NAME + '__description'}>msg is: { props.msg }</p>
        <el-button type='primary' onClick={onBtnClick}>点击我</el-button>
      </div>
    )
  }
})

该组件仅简单展示文本和 Element Plus 的按钮,用于测试。

2.5 定义 foo 组件入口文件

foo/index.ts

import { App } from 'vue'
import Foo from './src'

Foo.install = (app: App) => {
  app.component(Foo.name, Foo)
}

export default Foo

该文件将组件导入并导出,并且为该组件提供 install 方法。这样便完成了 foo 组件的代码编写。

3 实现 yyg-demo-ui

完成 foo 示例组件后,就需要开始开发组件库入口 yyg-demo-ui 了。第一步仍是初始化 package.json

3.1 初始化 package.json

在命令行中进入 packages/yyg-demo-ui 目录:

pnpm init

同上修改生成的 package.json 文件的 name 属性:

{
  "name": "@yyg-demo-ui/yyg-demo-ui",
  "version": "1.0.0",
  "description": "组件库入口",
  "author": "程序员优雅哥 youyacoder",
  "main": "index.ts",
  ...
}

3.2 安装依赖

fooyyg-demo-ui 都是独立的包,yyg-demo-ui 需要安装 foo 到依赖中,才能引入 foo 组件。在 2.1 中将 foopackage.json name 属性修改为 @yyg-demo-ui/foo,安装时要使用该名称。从控制台中进入 packages/yyg-demo-ui ,执行命令:

pnpm install @yyg-demo-ui/foo

此时查看 packages/yyg-demo-ui/package.jsondependencies,会看到使用 workspace协议依赖了 foo

"dependencies": {
  "@yyg-demo-ui/foo": "workspace:^1.0.0"
}

同时在 node_modules 中也可以看到多了一个 @yyg-demo-ui/foo

image-20221105001615752

3.3 定义入口文件

packages/yyg-demo-ui 下创建 index.ts,导入组件并导出:

import { App } from 'vue'
import Foo from '@yyg-demo-ui/foo'
// import component end
import '../scss/index.scss'

const components = [
  Foo
] // components

// 全局动态添加组件
const install = (app: App): void => {
  components.forEach(component => {
    app.component(component.name, component)
  })
}

export default {
  install
}

到这里咱们基本完成了组件的开发环境搭建,但遗留了三个问题:

  1. 组件及组件库的样式定义
  2. 如何查看组件的效果
  3. 组件库如何构建打包发布

这些问题在后面的文章中会依次解答。下一篇文章将分享组件库的 CSS 架构和 example 搭建。

感谢你阅读本文,如果本文给了你一点点帮助或者启发,还请三连支持一下,点赞、关注、收藏,程序员优雅哥会持续与大家分享更多干货

标签:demo,企业级,yyg,ui,Vue3,组件,foo,目录
From: https://www.cnblogs.com/youyacoder/p/16880496.html

相关文章

  • Android实战简易教程-第十枪(画廊组件Gallery实用研究)
    Gallery组件用于拖拽浏览图片,下面我们就来看一下如何实现。一、实现Gallery1.布局文件很简单:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://......
  • vue中组件化编程
    组件化编程什么是组件化编程传统方式的编写模式组件化编程的模式组件是实现应用中局部功能代码和资源的集合vue中非单文件组件的基本使用点击查看代码<!--Vue......
  • Vue3实现动态导入Excel表格数据
    1. 前言在开发工作过程中,我们会遇到各种各样的表格数据导入,大部分我们的解决方案:提供一个模板前端进行下载,然后按照这个模板要求进行数据填充,最后上传导入,这是其中一种......
  • 从0搭建vue3组件库: Input组件
    本篇文章将为我们的组件库添加一个新成员:Input组件。其中Input组件要实现的功能有:基础用法禁用状态尺寸大小输入长度可清空密码框带Icon的输入框文本域自适应......
  • 关于组件,你真的了解么?
    最近经常听到“组件化开发”,那架构设计里,组件到底如何定义、设计和应用呢,今天我们一起来聊聊。本文主要内容:什么是组件?如何设计组件?如何用组件构建系统?1、什么是组件?组件是......
  • Vue3 的watch 监视属性
    1.监听单个watch(变量,(新值,老值)=>{})2.监听多个watch([变量1,变量2],(新值,老值)=>{})3.监听对象watch(()=>对象,(新值)=>{})4.监听对象属性watch(()=>对象.......
  • Vue3后台系统做一个富文本编辑器
    前言:富文本编辑器的插件网上有很多,有些需要二次开发,有些有框架的限制,也有些稳定性差。我这边开发中由于领导催的紧,所以为了提高一下自己的效率决定使用wangEditor,这个编辑......
  • 学习笔记-组件和事件hook核心原理和案例
    组件和事件的hook核心原理和案例0x01构造方法的hook的例子(java.lang.String这个随便哪个类都行)#构造方法的hookJava.use("java.lang.String").$init.implementation=........
  • Vue3学习笔记(五)——路由,Router
    一、前端路由的概念与原理1.1.什么是路由路由(英文:router)就是对应关系。1.2.SPA与前端路由SPA指的是一个web网站只有唯一的一个HTML页面,所有组件的展示与切换都......
  • Vue3学习(八)
    组件学习:子组件:<template><div:title="msg">{{title}}</div><div>{{cnData}}</div><div>{{user}}</div></template><!--<scriptlang="ts">import{d......