Vue组件库 VV-UI 开始接受PR啦,有兴趣小伙伴可以一起参与开源哦。

前言:

刚开源出来的VV-UI目前刚刚起步,组件不是很多,非常欢迎大家的pr和Star。
项目地址: https://github.com/VV-UI/VV-UI
演示地址: https://vv-ui.github.io/VV-UI/#/
目前组件库已经引入meta-info管理单页面title meta link等常用的seo问题。
回归正题,如何搭建一套基于Vue的组件库呢?

1. 环境准备

我们搭建组件库,需要准备一系列环境,首先我们要考虑一下问题:

  1. 脚手架如何搭建
  2. 如何规划目录结构
  3. 如何编写文档

首先,对于脚手架环境的问题,目前已经有非常成熟的vue官方的脚手架,我们拿来用就好了

# 全局安装 vue-cli
$ npm install --global vue-cli
# 创建一个基于 webpack 模板的新项目
$ vue init webpack my-project
# 安装依赖,走你
$ cd my-project
$ npm install
$ npm run dev

接着我们看第二个问题,如何规划好我们组建的目录结构?首先我们需要有一个目录存放组件,有一个目录存放示例。所以我们要对vue-cli 生成的项目结构做一下改造:

.
...
|-- examples      // 原 src 目录,改成 examples 用作示例展示
|-- packages      // 新增 packages 用于编写存放组件
...
.

这样的话 我们需要再把我们webpack配置文件稍作一下调整,首先是把原先的编译指向src的目录改成examples,其次为了 npm run build 能正常编译 packages 我们也需要为 babel-loader 再增加一个编译目录:

{
   test: /\.js$/,
   loader: ‘babel-loader‘,
   include: [resolve(‘examples‘), resolve(‘test‘), resolve(‘packages‘)]
}

这样我们搭建起来一个简易的目录结构。
紧接着我们需要考虑如何编写文档。对于文档的编写,自然是markdown最合适不过了,那么怎么让我们在vue下可以去写 markdown 文档呢?答案当然是 vue-markdown-loader。然后我们按照文档配置了相关的插件信息:

rules: [
   {
     test: /\.md$/,
     loader: ‘vue-markdown-loader‘
   }
 ]

好了,我们可以开始尝试写文档了,在 example/docs 目录下新建 test.md。

# test
> Hello World

同时创建一个新的路由,指向我们的md文件:

{
  path: ‘/test‘,
  name: ‘test‘,
  component: r => require.ensure([], () => r(require(‘../docs/test.md‘)))
}

打开我们的浏览器http://localhost:8080/#/test 哈哈 真的成功了。别高兴的太早.... 问题还在后面:我们期望的文档不仅能编译markdown,而且最好能识别demo代码块一方面做演示,一方面可以显示演示代码最好了,就像这样:

那我们需要怎么做呢?vue-mark-down 功能肯定不止这些!于是我们继续阅读它的文档,发现其实他就是封装了 markdown-it,支持 options 选项。这样我们就可以为我们的markdown定义独特的标识符,这里我用 demo 标识需要显示代码块的地方,所以我需要配置options 选项 :

const vueMarkdown = {
  preprocess: (MarkdownIt, source) => {
    MarkdownIt.renderer.rules.table_open = function () {
      return ‘<table class="table">‘
    }
    MarkdownIt.renderer.rules.fence = utils.wrapCustomClass(MarkdownIt.renderer.rules.fence)
    return source
  },
  use: [
    [MarkdownItContainer, ‘demo‘, {
      // 用于校验包含demo的代码块
      validate: params => params.trim().match(/^demo\s*(.*)$/),
      render: function(tokens, idx) {

        var m = tokens[idx].info.trim().match(/^demo\s*(.*)$/);

        if (tokens[idx].nesting === 1) {
          var desc = tokens[idx + 2].content;
          // 编译成html
          const html = utils.convertHtml(striptags(tokens[idx + 1].content, ‘script‘))
          // 移除描述,防止被添加到代码块
          tokens[idx + 2].children = [];

          return `<demo-block>
                        <div slot="desc">${html}</div>
                        <div slot="highlight">`;
        }
        return ‘</div></demo-block>\n‘;
      }
    }]
  ]
}

这里简单的描述一下这段代码是干什么的:首先把内容里面vue片段编译成html,用于显示,另一方面用highlight来高亮代码块。demo-block本身是我们定义好的组件:

<template>
  <div class="docs-demo-wrapper">
      <div :style="{maxHeight: isExpand ? ‘700px‘ : ‘0‘}" class="demo-container">
        <div span="14">
          <div class="docs-demo docs-demo--expand">
            <div class="highlight-wrapper">
              <slot name="highlight"></slot>
            </div>
          </div>
        </div>
      </div>
    <span
           class="docs-trans docs-demo__triangle"
           @click="toggle">{{isExpand ? ‘隐藏代码‘ : ‘显示代码‘}}</span>
  </div>
</template>

这样,我们的 test.md 便可以这么去写了:

2. 如何编写组件

环境准备完毕,紧接着要开始编写组件,考虑的是组件库,所以我们竟可能让我们的组件支持全局引入和按需引入,如果全局引入,那么所有的组件需要要注册到Vue component 上,并导出:

const install = function(Vue) {
  if (install.installed) return;
  components.map(component => Vue.component(component.name, component));
};

export default {
  install
};

接着要实现按需加载,我们只需要单个导出组件即可:

import Button from ‘./button/index.js‘;
import Row from ‘./row/index‘
import Col from ‘./col/index‘

const components = [
  Button,
  Row,
  Col
];

const install = function(Vue) {
  if (install.installed) return;
  components.map(component => Vue.component(component.name, component));
};

if (typeof window !== ‘undefined‘ && window.Vue) {
  install(window.Vue);
}

export default {
  install,
  Button,
  Row,
  Col
};

其次,我们还需要考虑一个问题:既然是单页面应用,必然要去解决样式冲突问题,如果组件内使用soped,那么样式就无法从组件内抽离出来,达不到可定制化主题颜色的目的。我们需要一套可以分离处理的样式,可以自行编译,可以相互不污染。这时候css 的BEM规范就显得尤为重要。如果你还不知道什么是BEM 参考: http://www.w3cplus.com/css/css-architecture-1.html
说到这里,目前对BEM规范支持较好的插件就是postcss了,他允许我们配置BEM之间的连接符和缩写:

{
  "browsers": ["ie > 8", "last 2 versions"],
  "features": {
    "bem": {
      "shortcuts": {
        "component": "b",
        "modifier": "m",
        "descendent": "e"
      },
      "separators": {
        "descendent": "__",
        "modifier": "--"
      }
    }
  }
}

这样我们就可以把样式单独的抽离出来,通过gulp进行打包编译:

gulp.task(‘compile‘, function() {
  return gulp.src(‘./src/*.css‘)
    .pipe(postcss([salad]))
    .pipe(cssmin())
    .pipe(gulp.dest(‘./lib‘));
});

最后生成我们的样式代码。

好了开始我们的测试:

import VVUI from ‘../packages/index‘
import ‘../packages/theme-default/lib/index.css‘

Vue.use(VVUI)

一切显得那么美好....

优化与不足

  • 组件导出代码暂不支持自动化生成:比如我们的组件index文件,每次添加组件都需要不断地改写,我们2*
    可以尝试进行webpack配置,npm run dev 的时候自动进行组件检测,然后帮我们写好导出代码。
  • 缺少单测
  • 目录结构划分缺陷:目前所有内容仅支持中文,如果想要做到支持国际化,那么还需要重新调整目录结构。
  • 发布tag: 需要编写脚本支持tag发布
  • 组件太少:文档刚写,组件还不是很多,慢慢去维护,相信会越来越多的组件,做业务的过程中也可以把常用的组件加进去,这样更加方便自己以后的维护和学习

结语:

项目github地址:github
项目演示地址: 演示
欢迎 PR 一起维护,欢迎 Star

时间: 2024-10-09 16:31:59

Vue组件库 VV-UI 开始接受PR啦,有兴趣小伙伴可以一起参与开源哦。的相关文章

e组件库 VV-UI 开始接受PR啦,有兴趣小伙伴可以一起参与开源哦。

e组件库 VV-UI 开始接受PR啦,有兴趣小伙伴可以一起参与开源哦.前言: 刚开源出来的VV-UI目前刚刚起步,组件不是很多,非常欢迎大家的pr和Star.项目地址: https: http://p.baidu.com/itopic/main/qlog?qid=adeb6162633939323732623000&type=questionlog http://p.baidu.com/itopic/main/qlog?qid=aeeb6162633738663664323000&type

如何打造一套vue组件库

开篇组件库能帮我们节省开发精力,无需所有东西都从头开始去做,通过一个个小组件拼接起来,就得到了我们想要的最终页面.在日常开发中如果没有特定的一些业务需求,使用组件库进行开发无疑是更便捷高效,而且质量也相对更高的方案. 目前的开源组件库有很多,不管是react还是vue的体系里都有很多非常优秀的组件库,比如我经常使用的就有elementui和iview.当然也还有其他的一些组件库,他们的本质其实都是为了节省重复造基础组件这一轮子的过程.也有的公司可能会对自己公司的产品有特别的需求,不太愿意使用开源

Vue组件库开发

市面上目前已有各种各样的UI组件库,比如 Element 和 iView,他们的强大毋庸置疑.但是我们面临的情况是需求越来越复杂,当它们不能再满足我们需求的时候,这个时候就有必要开发一套属于自己团队的组件库了. 为何要进行组件库开发 如果你所在的公司对于页面的样式没有什么要求,那么你只要随便拿一个组件库来用就行了,比如element.iView等等,不用再重复造轮子了: 如果你目前只有个人用一个组件,或者是只对个别组件有要求,那么只要在你的工程里面开发一个.vue单文件组件就可以了:如果你的团队

将 Vue 组件库发布到 npm

制作了一套自己的组件库,并发布到npm上,项目代码见 GitHub . 前期准备 有一个npm账号 安装了vue-cli 搭建项目 vue init webpack hg-vcomponents cd hg-vcomponents cnpm install 目录结构 - vue-flag-list + build + dist // 存放发布到npm的代码 - src - components // 存放组件源代码 和 README.md - arrows arrows.vue README.m

vue组件库(一):前期准备工作

前言 将近期项目内自行开发一个vue组件,做个总结,记录下自己的思维过程~~~ 正文 接到这个任务后,还是要做些准备工作的. 主要内容如下: 1.优化下所在团队前端开发流程 服务器搭建gitlab,采用git进行代码版本管理 服务器搭建npm私服(基于verdaccio) 2.继续学习webpack4 3.学习借鉴两个vue组件,element-ui和ant-desigin-vue 总结 很遗憾,所在团队前端开发流程不够规范和完善,想借此次组件开发,推一些前端的新技术并多多产出一些团队共享资源

Vue组件库

Vux (这个大家都知道的) https://vuxjs.gitbooks.io/vux/content/ vue-strap (bootstrap 的 Vue 版 1.0的)http://yuche.github.io/vue-strap/ n3-components(电脑端UI,貌似刚出来的,没下面几个好看)https://n3-components.github.io/N3-components/ iview(电脑端,vue1.0)https://www.iviewui.com/ vue-

Vue 组件库 Element 脚手架 入门教程

https://blog.csdn.net/u012359995/article/details/79702157 前提是安装了nodejs(6.0+),npm 验证安装成功 node –version npm –version Element官网地址: http://element-cn.eleme.io/#/zh-CN Element 脚手架 代码git地址: https://github.com/ElementUI/element-starter.git git clone下来后,进入el

vue 组件库

百度地图:https://github.com/Dafrok/vue-baidu-mapgoogle地图:https://github.com/GuillaumeLeclerc/vue-google-maps高德地图:https://github.com/ElemeFE/vue-amap图表:https://github.com/hchstera/vue-charts

介绍推荐优秀的Vue UI组件库

Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正式使用.开发团队在使用Vue.js框架和UI组件库以后,开发效率大大提高,自己写的代码也少了,很多界面效果组件已经封装好了.在选择Vue UI组件库的过程中,通过GitHub上根据star数量.文档丰富程度.更新的频率以及维护等因素,也收集整理了一些优秀的Vue UI组件库. 下载资源:www.yi