vue

Vue源码学习笔记(一)

不写笔记记不住的病

Posted by zhykirby on July 4, 2019

前言

学了怎么写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配置文件读取配置,然后通过命令函参数进行过滤,过滤出不同环境。