前言
- 最近在学习vue源码,看到了一个特别亮眼的操作,函数柯里化
- 之前也了解过,但看完就往,没深刻理解它的意义
- 大概就是看过就忘,用了也不知道为啥这么用,目前没找到写的特别中意文章,函数柯里化使用的意义和目的到底是啥
vue中的函数柯里化
最重要用途:提升性能,使用柯里化可以缓存一部分能力
vue中案例说明
- 判断元素
- 虚拟DOM的render方法
vue本质上市使用HTML的字符串作为模板的,将字符串的模板转换为AST,再转换为VNode
3个过程
- 模板->AST(抽象语法树)
- AST->VNode
- VNode->DOM
AST知识相关了解学习
最消耗性能 是第1个阶段,即对字符串的解析过程
在vue中,每一个标签可以是真正的HTML标签,也可以是自定义组件,如何区分?
在vue的源码中,将所有可用得HTML标签已经存起来了
假设这里只考虑几个标签:
let tags = `div,p,a,ui,li`.split(',')
复制代码
我需要一个函数,判断一个标签名是否为内置标签,
function isHTMLTag(tagName){
tagName = tagName.toLowerCase()
for(let i =0;i<tags.length;i++){
if(tagName ===tags[i]){
return true
}
\\或
if(tags.indexOf(tag)>-1){
return true
}
return false
}
}
复制代码
模板是任意去编写的,可以简单,也可以复杂,(使用indexOf情况,indexOf内部也是循环的)
如果有6个内置标签,而模板中有个10个标签需要判断,那么需要执行60次循环
let tags = `div,p,a,ui,li`.split(',')
function makeMap(keys){
let set = {}
keys.forEach(key=>{
set[key] = true
})
reutrn function (tagName){
return !!set[tagName].toLowerCase()
}
}
let isHtmlTag = makeMap(tags);//返回的是函数
复制代码
Map和Set
假设有10个标签需要判断,这时已经没有循环存在了,时间复杂度降低,(闭包保存数据)就是相当于用空间换取了时间
思考:vue项目模板转换为抽象语法树需要执行几次
- 页面一开始加载需要渲染
- 每个属性在发生变化的时候要渲染
- watch computed 等等
如果每次修改,模板就解析一次,这样会大大影响性能(操作DOM是非常影响性能的)
render的作用是将虚拟DOM转换为真正得DOM加到页面中
虚拟DOM可以降级理解为AST
一个项目运行的时候模板是不会变的,就标识AST是不会变的
我们可以将代码进行优化,将虚拟DOM缓存起来,生成一个函数,函数只需要传入数据就可以得到真正的DOM
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END