前言
学了怎么写vue后总感觉还是没咋入门,然后看了各种库,什么vue-rx,vue-class-component啥的。
然后被大佬批了,明示菜鸡不应该东看看西看看这些库,建议我去看源码,看API是咋写的,自己能不能实现出来。
……然后我就开始了源码学习之路(本笔记是看了大佬们的文章总结的内容)。
正文
源码目录
在正式进入源码的海洋前,首先看看Vue.js的目录。
src | 功能 |
---|---|
compiler | 编译相关 |
core | 核心代码 |
platforms | 不同平台的支持 |
server | 服务端渲染 |
sfc | .vue文件解析 |
shared | 共享代码 |
compiler负责编译相关的代码,名字很直接,不用解释;core是核心代码,是Vue.js各种功能的实现的代码,包括Virtual Dom、全局API、实例化等;platforms分成两个入口,分别是web端和weex;server负责服务端渲染,这部分我还没看..这部分代码好像是跑在服务端的Node.js;sfc负责把.vue文件解析成js对象的代码;shared则是一些共享的工具方法。
看完源码目录,大致了解了Vue.js这个项目是如何构成的。(分得真的是一目了然啊…)接下来看看Vue.js源码是如何构建的。(v1)
构建脚本
Vue.js的源码构建脚本是如下这样子的:
{
"script":{
"build":"node scripts/build.js",
"build:ssr":"npm run build -- web-runtime-cjs,web-server-renderer",
"build:weex":"npm run build --weex"
}
}
这一段就是与package.json一样的,配置script作为NPM的执行脚本,这三条作用都是构建Vue.js,后两条分别是web和weex的环境参数。
看完构建脚本后再来看看构建过程:
let builds = require('./config').getAllBuilds()
//filter builds via command line arg
if(process.argv[2]) {
const filters = process.argv[2].spilt(',')
builds = builds.filter(b => {
return filters.some(f => b.output.file.indexOf(f) > -1 || b._name.indexOf(f) > -1)
})
} else {
//filter out weex builds by default
builds = builds.filter(b => {
return b.output.file.indexOf('weex') === -1
})
}
build(builds)
这一串代码还是比较简短的,先从config配置文件读取配置,然后通过命令函参数进行过滤,过滤出不同环境。