怎么阅读?

  1. 首先,找到入口文件
  2. 找到样式文件与组件文件
  3. 有没有一些复用的小组件,由这些小组件组成的大组件有哪些

入口文件

项目启动文件:

"scripts": {"bootstrap": "yarn || npm i","build:file": "node build/bin/iconInit.js & node build/bin/build-entry.js & node build/bin/i18n.js & node build/bin/version.js","build:theme": "node build/bin/gen-cssfile && gulp build --gulpfile packages/theme-chalk/gulpfile.js && cp-cli packages/theme-chalk/lib lib/theme-chalk","build:utils": "cross-env BABEL_ENV=utils babel src --out-dir lib --ignore src/index.js","build:umd": "node build/bin/build-locale.js","clean": "rimraf lib && rimraf packages/*/lib && rimraf test/**/coverage","deploy:build": "npm run build:file && cross-env NODE_ENV=production webpack --config build/webpack.demo.js && echo element.eleme.io>>examples/element-ui/CNAME","deploy:extension": "cross-env NODE_ENV=production webpack --config build/webpack.extension.js","dev:extension": "rimraf examples/extension/dist && cross-env NODE_ENV=development webpack --watch --config build/webpack.extension.js","dev": "npm run bootstrap && npm run build:file && cross-env NODE_ENV=development webpack-dev-server --config build/webpack.demo.js & node build/bin/template.js","dev:play": "npm run build:file && cross-env NODE_ENV=development PLAY_ENV=true webpack-dev-server --config build/webpack.demo.js","dist": "npm run clean && npm run build:file && npm run lint && webpack --config build/webpack.conf.js && webpack --config build/webpack.common.js && webpack --config build/webpack.component.js && npm run build:utils && npm run build:umd && npm run build:theme","i18n": "node build/bin/i18n.js","lint": "eslint src/**/* test/**/* packages/**/* build/**/* --quiet","pub": "npm run bootstrap && sh build/git-release.sh && sh build/release.sh && node build/bin/gen-indices.js","test": "npm run lint && npm run build:theme && cross-env CI_ENV=/dev/ BABEL_ENV=test karma start test/unit/karma.conf.js --single-run","test:watch": "npm run build:theme && cross-env BABEL_ENV=test karma start test/unit/karma.conf.js"}

从文件中可以看出启动文件有以下步骤:

  • node build/bin/iconInit.js 读取packages/theme-chalk/src/icon.scss文件,获取icon样式

  • node build/bin/build-entry.js 读取components.json 文件,这个文件记录了所有组件的入口文件,并以json格式保存,并定义了三个模板数组:
    var includeComponentTemplate = [];
    var installTemplate = [];
    var listTemplate = [];
    之后遍历components.json文件,将所有组件都通过 json-templater/string 插件,渲染为 import {{name}} from’…/packages/{{package}}/index.js’; 保存到 includeComponentTemplate 数组;
    将key中包含[‘Loading’, ‘MessageBox’, ‘Notification’, ‘Message’, ‘InfiniteScroll’]中的任意一个的排除外,其余的 {{name}}都保存到 installTemplate 数组;
    然后将不是Loading的组件名都保存到listTemplate 数组;
    之后在通过join(操作系统的行尾符的常量)将各数组拼接,渲染到MAIN_TEMPLATE,这个模板就是组件注册的模板:
    var MAIN_TEMPLATE = `/* Automatically generated by ‘./build/bin/build-entry.js’ */

    {{include}}
    import locale from 'element-ui/src/locale';
    import CollapseTransition from 'element-ui/src/transitions/collapse-transition';const components = [
    {{install}},CollapseTransition
    ];const install = function(Vue, opts = {}) {locale.use(opts.locale);locale.i18n(opts.i18n);components.forEach(component => {Vue.component(component.name, component);});Vue.use(InfiniteScroll);Vue.use(Loading.directive);Vue.prototype.$ELEMENT = {size: opts.size || '',zIndex: opts.zIndex || 2000};Vue.prototype.$loading = Loading.service;Vue.prototype.$msgbox = MessageBox;Vue.prototype.$alert = MessageBox.alert;Vue.prototype.$confirm = MessageBox.confirm;Vue.prototype.$prompt = MessageBox.prompt;Vue.prototype.$notify = Notification;Vue.prototype.$message = Message;};/* istanbul ignore if */
    if (typeof window !== 'undefined' && window.Vue) {install(window.Vue);
    }export default {version: '{{version}}',locale: locale.use,i18n: locale.i18n,install,CollapseTransition,Loading,
    {{list}}
    };
    `;
    

    渲染组件注册模板的方法:
    var template = render(MAIN_TEMPLATE, {
    include: includeComponentTemplate.join(endOfLine),
    install: installTemplate.join(’,’ + endOfLine),
    version: process.env.VERSION || require(’…/…/package.json’).version,
    list: listTemplate.join(’,’ + endOfLine)
    });
    最后呢,将渲染的内容写到 src/index.js 文件。

webpack入口文件

webpack.demo.js:项目根据是isProd还是isPlay环境进行打包,打包的入口是 ./examples/entry.js还是./examples/play.js,由于 const isPlay = !!process.env.PLAY_ENV; ,所以,是 examples/entry.js。出口文件为: path.resolve(process.cwd(), ‘./examples/element-ui/’) ,当前工作目录下 下的examples/element-ui目录下。

项目入口文件examples/entry.js

这个文件相当与普通vue文件的main.js,

有路由:

import VueRouter from 'vue-router';
import routes from './route.config';

有vue实例与入口模板:

import Vue from 'vue';
import entry from './app';

有公共组件:

import Element from 'main/index.js';
import demoBlock from './components/demo-block';
import MainFooter from './components/footer';
import MainHeader from './components/header';
import SideNav from './components/side-nav';
import FooterNav from './components/footer-nav';
import title from './i18n/title';Vue.use(Element);
Vue.use(VueRouter);
Vue.component('demo-block', demoBlock);
Vue.component('main-footer', MainFooter);
Vue.component('main-header', MainHeader);
Vue.component('side-nav', SideNav);
Vue.component('footer-nav', FooterNav);

有公共样式:

import 'packages/theme-chalk/src/index.scss';
import './demo-styles/index.scss'; // 组件的基本样式,其中都是@import
import './assets/styles/common.css';
import './assets/styles/fonts/style.css';
import icon from './icon.json';

最后,将所有元素与实例都打到了#appDOM节点上:

new Vue({ // eslint-disable-line...entry,router
}).$mount('#app');

项目是怎么找到组件并渲染的?

通过模板渲染官方文档

在webpack.demo.js中,得知从哪找的首页模板:

new HtmlWebpackPlugin({template: './examples/index.tpl',filename: './index.html',favicon: './examples/favicon.ico'}),

那么,组件的模板是从哪儿找的呢?其实webpack的入口文件已经告诉了我们:

"dev": "npm run bootstrap && npm run build:file && cross-env NODE_ENV=development webpack-dev-server --config build/webpack.demo.js & node build/bin/template.js"

就是build/bin/template.js 文件。

const templates = path.resolve(process.cwd(), './examples/pages/template');
const chokidar = require('chokidar');
let watcher = chokidar.watch([templates]);watcher.on('ready', function() {watcher.on('change', function() {exec('npm run i18n');});
});

使用了chokidar 库来监控 examples/pages/template 下的文件,一旦发现下面的文件发生变化,就执行npm run i18n命令,而在package.json中,可以看到:

"i18n": "node build/bin/i18n.js"

从build.bin.i18n.js,得知:

读取的是 examples/i18n/page.json ,文件描述的是有哪些功能目录;然后判断examples/pages下有没有这些目录文件,没有就创建,使用examples/pages/template/下的模板文件渲染,输出到examples/pages目录下。

通过路由

通过route.config.js可以看到nav.config.json文件,这个记录着element项目文档的目录。

可以看到文档的主要几个执行逻辑:

LOAD_MAP:创建了一个闭包可以读取响应语言的组件(组件要运行后才能产生)
load:return LOAD_MAP
LOAD_DOCS_MAP:读取/docs下的各语言文档
loadDocs:return LOAD_DOCS_MAP
registerRoute: function读取nav.config.json,并生成router对象返回
执行registerRoute
generateMiscRoutes:function生成路由数组
执行generateMiscRoutes
搞了一个v-model模板
...

这个文件主要就是这些功能,而在着其中,使用组件的重要逻辑就是registerRoute

阅读element-ui源码(1)怎么找到样式与组件入口文件相关推荐

  1. 从 Element UI 源码的构建流程看前端 UI 库设计

    引言 由于业务需要,近期团队要搞一套自己的UI组件库,框架方面还是Vue.而业界已经有比较成熟的一些UI库了,比如ElementUI.AntDesign.Vant等. 结合框架Vue,我们选择在Ele ...

  2. rust墙壁升级点什么_分享:如何在阅读Rust项目源码中学习

    今天做了一个Substrate相关的小分享,公开出来. 因为我平时也比较忙,昨天才选定了本次分享的主题,准备比较仓促,细节可能不是很充足,但分享的目的也是给大家提供一个学习的思路,更多的细节大家可以在 ...

  3. webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...

    引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...

  4. golangsha1解码_如何阅读Golang的源码?

    Go 的源码在安装包的 src/ 目录下.怎么看它的源码呢?直接看吧!没人教的情况下,只能自己撸了.当然,这种内容一般也不会有人教. 怎么撸? Go 源码中,应该可分为与语言息息相关的部分,和官方提供 ...

  5. 阅读Skeleton.css源码,改善睡眠质量(尽管它只有419行代码)

    theme: smartblue 本文介绍 点赞就等于学会了! 如果本文对您有帮助,建议点赞收藏(点赞就等于学会了) Skeleton 源码一共只有 419 行(加上注释和换行),非常适合用来学习. ...

  6. Android ---- Ijkplayer阅读native层源码之IjkMediaPlayer_prepareAsync(五)

    整章目录:Android------- IjkPlayer 源码学习目录 本篇会有很多源代码,请注意阅读每行代码上面的注释. 本篇介绍的主要内容为上图红框圈起部分: IjkMediaPlayer_pr ...

  7. 以太坊源码阅读5——POW源码分析

    以太坊源码阅读5--POW源码分析 介绍 POW,proof of work,即工作量证明,是著名公bitcoin所采用的共识算法.简单来说,pow就是一个证明,由矿工使用算力进行计算(挖矿),竞争记 ...

  8. Ubuntu 安裝 GNU Global(gtags) 阅读Linux内核源码

    CSDN GitHub Ubuntu 安裝 GNU Global(gtags) 阅读Linux内核源码 AderXCoding/system/tools/global 本作品采用知识共享署名-非商业性 ...

  9. 知识付费阅读小程序源码,前端+后台+代理+分销

    介绍: 知识付费阅读小程序源码,前端+后台源码,带有代理,分销,课程资源更新等等功能. 没有安装教程,微擎的就不多说了. 网盘下载地址: http://kekewangLuo.net/R9cbFxmn ...

最新文章

  1. 虚拟机+CentOS内核hack7、8、9、17失败记
  2. 共享库中的位置无关代码(PIC)
  3. BFC与IFC概念理解+布局规则+形成方法+用处
  4. [省级大创项目]教育类APP的探索和实践——大学物理实验助手APP开发
  5. C++Primer:函数(参数传递-非引用形参)
  6. Java黑皮书课后题第1章:*1.11(人口估算)编写一个程序,显示未来5年的每年人口数。假设当前的人口是312 032 486,每年有365天
  7. 一个失败的SAP Spartacus路由修改尝试 -在CmsPageGuard的开头触发 OCC API 调用
  8. 删除用户的命令是什么mysql_mysql新添加用户与删除用户具体操作命令_MySQL
  9. Google Mesa概览
  10. js php c语言for循环,小蚂蚁学习C语言(8)——C语言for循环
  11. 朋友面试被问到---静态构造函数
  12. 《Arduino开发实战指南:机器人卷》一3.6 编程原理与示例程序
  13. anaconda安装第三方库两种方式
  14. 如何应用Matlab plot画点
  15. 在线SVG在线编辑器
  16. 设置透明背景和转换图片格式的技巧
  17. 【javafx】如何java查询12306火车票剩余数量
  18. 《关键对话——掌握关键对话》读书笔记(二)
  19. 【学习笔记】英文科技论文常见英语句式积累
  20. saltstack配置管理和数据系统

热门文章

  1. 反相畴的基础知识和一篇论文
  2. 知识图谱算法岗位招聘要求总结
  3. Cisco Packet Tracer基础命令操作以及组织网络实验
  4. 用C语言实现两个整数相加(函数的方法)
  5. 批量删除多个 Word 文档的空白页
  6. 迁移学习系列--领域泛化
  7. (69)zabbix监控惠普打印机
  8. python string类型的英文句子逆序输出
  9. python编程midi键盘按键错乱_电脑键盘按键错乱怎么回事 电脑键盘按键错乱原因【图文】...
  10. 笔记本电脑键盘没坏却无法打字的情况