这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
大佬们好,我是江湖不渡i,前端菜鸡。
写这篇文章的缘由是来自一个朋友找工作过程中的一个面试题:为什么虚拟dom可以实现跨端❓也有之前看学习虚拟dom的时候看到虚拟dom的跨端能力的一些疑问
这个题初一看好像没什么问题,首先我们先区分一下跨平台和跨端的区别,跨平台指的是跨操作系统,而跨端是指客户端。跨平台简单的来说就是一套代码在mac和windows上都能跑,跨端就是跨客户端在web、ios、安卓等跑
然后我们仔细想一下虚拟dom真的可以跨端吗?虚拟dom是什么,他只是一个模拟真实浏览器dom的普通js对象,一个对象想让他去跨端显然是不能的,就比说浏览器dom和原生dom是一样的吗?想要实现跨端,终究一切都要映射成原生的组件和原生通信调用原生的api去实现。
客户端的特点是什么呐?就是他有界面也有逻辑。所以跨端又有逻辑跨端和渲染跨端。当先市面上已经很多比较成熟的跨端技术比如RN、flutter还有已经没落的weex,我们这里抛去逻辑跨端,只说渲染跨端,毕竟逻辑跨端是这些框架注入了一些原生api这些没什么研究。
终于进入正题了,那么虚拟dom和跨端到底有什么关系呐?
我们知道安卓和ios是有自己的原生组件,那么我们在这上面跑js怎么去创建界面呐?用js写web一样直接去创建操作原生组件肯定是不行的,那我们该怎么去实现我们的想法呐?这时候我们就想起来是不是可以做一个中转站,用js先做一个然后通过原生的创建方法给他转化一下?(不知道具体怎么表达合适,有点模糊相信大佬们也能看明白😄)
这时候虚拟dom就发挥了作用,就像vue、react等使用虚拟dom来缓存修改然后整体替换来优化性能,当然也可以用虚拟dom来缓存我们js画的页面,然后通过原生方法渲染出对应的原生组件,实现渲染跨端,正好我们对应dom绑定的方法也可以通过映射原生api实现逻辑跨端。
最后总结一下:虚拟dom的出现和使用,使vue\react这些web框架具备了跨端的能力,结合对原生方法的注入,是我们js对统一三端的目标提供了可靠的解决方案。
实在是语言表达能力欠缺和原理认识不够深入,所以表达有点模棱两可,希望大佬们能多提点宝贵的意见帮我改正,不胜感激!😁
最后祝各位大佬学习进步,事业有成!🎆🎆🎆