项目结构目录

  1. ├─build // 构建相关的脚本和配置
  2. ├─examples // 用于展示Element组件的demo
  3. ├─lib // 构建后生成的文件,发布到npm包
  4. ├─packages // 组件代码
  5. ├─src // 引入组件的入口文件
  6. ├─test // 测试代码
  7. ├─Makefile // 构建文件
  8. ├─components.json // 组件列表,显示每个组件的入口和名称
  9. └─package.json

package.json作用

查看一个项目,最开始应该从package.json文件入手,该文件包含了入口文件main、脚本scripts、版本version等信息。

main项目入口文件

在使用element-ui时,import Element from ‘element-ui’ 就是从入口文件进行导入。
而element-ui的入口文件

  1. "main": "lib/element-ui.common.js"

lib/element-ui.common.js是 commonjs规范,也就是node中使用的规范
另外lib/index.js是umd规范。

files指定发布包的文件

把一个包发布到npmjs中,不能把所有的源代码都进行发布,否则下载包时会非常大非常耗时。
element-ui指定了files的内容,可以查看npm i element-ui 下载的包,只包含了这些目录。

  1. "files": [
  2. "lib",
  3. "src",
  4. "packages",
  5. "types"
  6. ],

typings

Typescripts入口文件

unpkg

把包发布到npm,同时应该可以在unpkg中获取,这样代码就能在node环境和浏览器环境中运行。
因此发布一个包时,umd打包是必须的。由webpack.conf.js生成,lib/index.js就是umd规范。

style

样式的入口文件。

scripts执行不同功能的脚本

components.json文件

记录了组件名和组件的路径,在自动化生成文件以及入口时会使用。

  1. "pagination": "./packages/pagination/index.js",
  2. "dialog": "./packages/dialog/index.js",
  3. "autocomplete": "./packages/autocomplete/index.js",
  4. // ...
  5. "avatar": "./packages/avatar/index.js",
  6. "drawer": "./packages/drawer/index.js",
  7. "popconfirm": "./packages/popconfirm/index.js"
  8. }

packages存放组件目录

存放着组件库的源码和组件样式文件。

packages文件夹是分开去处理每个组件。

以alert和row为例进行查看。alert组件使用了template模板语法,row使用了render语法。

alert组件

image.png目录结构
index.js入口文件进行组件的注册。

  1. import Alert from './src/main';
  2. /* istanbul ignore next */
  3. Alert.install = function(Vue) {
  4. Vue.component(Alert.name, Alert);
  5. };
  6. export default Alert;

引入组件,并提供了install方法,让Vue实例可以通过Vue.use(Alert);进行单组件引入

关于install可以看官方文档

row组件

image.png
可以看出来src/row.js使用的js文件,不是用vue结尾。该组件的语法和Alert有些不同,但是Alert的template写法最终还是会被编译为render结构。
查看下row.js文件

  1. export default {
  2. name: 'ElRow',
  3. componentName: 'ElRow',
  4. // ....
  5. render(h) {
  6. return h(this.tag, {
  7. class: [
  8. 'el-row',
  9. this.justify !== 'start' ? `is-justify-${this.justify}` : '',
  10. this.align ? `is-align-${this.align}` : '',
  11. { 'el-row--flex': this.type === 'flex' }
  12. ],
  13. style: this.style
  14. }, this.$slots.default);
  15. }
  16. };

packages/theme-chalk

image.png
存放所有组件的相关样式,src存放的是scss文件,lib是css文件。
index.scss是全局引入库时使用的入口,其它每个scss文件对应按需引入组件时使用的文件。

src

该目标把所有组件做了一个统一处理,包含自定义指令、项目整体入口、组件国际化、组件 mixins、动画的封装和公共方法。

构建流程梳理

elementui 架构分析
element UI源码分析
组件库开发: