随着公司不断的成长,团队也在逐渐的扩大。为了提升开发效率,须要开发一套符合公司内部的一套移动端UI组件库。很是的幸运,这份一劳永逸的差事最终由我来负责。咱们公司技术栈是vue,因此UI组件库就基于vue来开发。css
本文主要讲我在开发的过程当中的一些思路和解决问题的方式方法,至于代码你们能够自行参考(在本文的底部有连接)
。组件的开发并很少,圈子里有不少优秀的库更加值得你去学习,接下来就说说个人思路和实践。vue
制定目录结构webpack
文件夹 | 说明 |
---|---|
build | 打包编译目录 |
config | 参数配置目录 |
dist | 文档打包目录 |
docs | 说明文档目录 |
examples | 组件案例目录 |
lib | 组件打包目录 |
packages | 组件目录 |
src | 资源目录 |
test | 单元测试目录 |
技术选型git
资源管理工具我选用webpack 和 gulp, 选用gulp的缘由是组件样式和功能分开打包,gulp的task写起来既简单又方便。说到样式我选用的less,由于我工做中一直在使用less。单元测试选用的karma。还有一些其余辅助工具如babel、eslint、postcss等。详细内容能够看package.json文件。github
我的习惯,先把服务搞起来在说,安装了dev-server,配置了dev脚本,在build文件夹里编写webpack.dev.config,entry指向的是examples文件夹目录,以后开发组件都要在这里调试。examples里的目录结构与vue-cli脚手架相似,这里用到flexible.js,公司项目就用到这个,为了符合其余成员开发习惯,在案例调试中一样采用该方式。一样为了符合团队规范在postcss-pxtorem配置中我设置了rootValue,若是看代码的你这里要注意一下。在组件打包的时候我也作了一些处理,这个地方后面再讲。web
服务搞起来以后,就开始写组件了。这部分精力主要放在packages文件夹内,简单说一下个人设计思路,每一个组件按照功能名称命名建立子文件夹,由index.js输出,这里方便以后按需加载的需求。在src内编写组件的功能代码。最后全部的组件在根目录的src内index.js文件输入并输出。这里我用了一个小技巧,为了防止组件开发不断增多,致使import写的愈来愈多,我这里使用了require.context
进行代码优化。以后凡是大量并有规律的引入文件的地方,我都使用该方案进行优化修改。vue-cli
组件开发中不可避免的会使用到icon,这里我使用了gulp的两个插件gulp-iconfont
和gulp-iconfont-css
将svg文件转换为字体样式引入使用。若是你未使用gulp,能够查找对应的插件库引入使用。json
组件写好了以后,在examples里的main.js引入,效果以下:gulp
功能都开发好了,接下来作一个能够看的文档介绍页。这部分在docs里开发,为了用户体验好一些,文档兼容了PC和移动端,采用的是media。不少其余UI组件文档中,移动端会有手机的样式模型的展现,我观察了几个,他们都是用的iframe里引入的github.io的服务。特地说明一下这里,我并无这么作,个人作法是把examples打包到dist目录,在启动docs服务进行开发的时候,手机模型引入的是事先打包好的examples静态文件。若是你想要得到最新的examples文件,须要先打包一遍examples,再启动docs服务,这里会有可能存在一个让人不舒服的地方,那就是example和docs同时开发,这里我没有设计成同时提供开两个服务,也没有把两个整合在一块儿。个人理由是若是你想写案例就把案例写完,若是你先写文档就不要去写其余的。bash
打包在build文件夹内,分别是webpack对js的混淆压缩和用gulp处理样式文件,上面说到为了更符合团队开发习惯,我在examples使用到flexible,由于在工做中咱们一样使用了它,我在样式打包的时候,每一个组件单独样式分别压缩两版,分别是以rem为单位和px为单位,rem是通过pxtorem处理的。更细节东西就很少介绍了,你们能够看个人代码。
module.exports = {
plugins: {
"postcss-pxtorem": {
"rootValue": 75,
"propList": ["*"]
}
}
}
复制代码
最后是单元测试,这部分还在学习中,就很少说了。
到这里组件库的0到1的工做完成了,简单总结一下个人开发心得:
先想再写,会少走弯路。这一个月的工做,让我积累很多开发经验,对个人结构思惟能力提高了很多,总体来讲仍是不错的。最后附地址,欢迎回复一齐进步。
祝工做顺利
邓文斌
2019年2月14日