如题,SPA (Single Page Application - 单页应用) 这个话题已经在 Weex 社区讨论了有一段时间,在传统的前端开发领域中大家也在长期探讨这个话题。这里谈谈我个人的理解和看法。
SPA 往往和 Router、页面间通信、页面间数据共享这些词汇联系在一起,不少同学直接问到这些词汇,实际上都是以 SPA 为前提的,因为脱离 SPA 的概念,这些词汇将失去它原有的意义,或者变成了完全不同的东西。
那 SPA 不是理所当然、天经地义、不容挑战的吗?干嘛要脱离 SPA 的概念讨论这些问题?
我觉得不是
SPA 背后的命题是如何管理复杂的页面关系,最终构成一个产品的整体。传统的页面之间是通过简单粗暴的“页面跳转”和“浏览器前进/后退”建立联系的,SPA 提出的观念是在浏览器中模拟页面的跳转、切换和前进/后退,相关的很多周边命题也随之而生。
(其实你不觉得这也是个"全家桶"么……)
所以我们先把问题回归到如何管理复杂的页面关系
我觉得有以下几个子命题 —— 在这之前,我想先把接下来所有的讨论,从形态上收敛到手机应用,PC 端的暂时不涉及。
怎么把一个完整的产品以页面为维度进行拆分,这里是有学问的。
其中最关键的一个认知问题就是页面的颗粒度是否就是整个手机屏幕同时可以呈现的所有内容?
如果是,那么页面本身的结构就是简单的一维模型,即所有的页面都可以完全独立工作运行。
如果不是,那么有可能某个页面是另外一个页面的一部分,两者之间有包含关系。这样的话页面结构就变成了多维的。
在 PC 上,答案显然是后者,因为 PC 的屏幕比手机要大得多,所有页面都要整屏更换和依赖,显然是不合理的,但是在手机屏幕上,我们有机会简化为前者。
也可以从另外一个角度讲,不说怎么解耦,而是不同的页面之间保留了哪些耦合。
这个地方的设计直接决定了大规模并行研发产品的可能性和实际的效率效果
<a> 链接、location 设置、历史管理 API等手机淘宝的工程传统是一种非常简单粗暴直接有效的理念 —— 可能你看下来会有这种感觉
首先我们没有实践 SPA —— 准确的讲鲜有成功实践的 SPA 案例,但解决上述问题有一些自己细节上的思考
<iframe> 可以使用 Web Messaging API 来进行通信,但总体上确实场景非常少所以大家会发现,我们为了更好的工程实践和大规模并行研发方面做了一定的取舍
经过上述分析和论述,我们也逐步滤清了 Weex 在这个复杂问题上的思路:如何解决 Weex 中路由管理的问题?如何在 Weex 上进行 SPA 实践?如何让 Weex 页面之间通信或共享数据?其实面对这么多看似复杂混乱的问题,只要从上述几个角度抓住重点问题,提出关键解法,就可以把复杂问题逐一解开。
<web>/<embed> 这样的组件,可以管理子页面,但这里我们延续了手机淘宝对待子页面状态定位的看法,不做中心化的设计,每个页面可以自由定义识别规则 —— 当然这个规则范围就不包含 path 了 —— 因为这需要模拟页面的跳转和切换,所以只有 query 和 hash 可以识别<a> 链接和 openURL() 方法,对于 <web>, <embed> 中产生的跳转和切换命令,我们目前还没有具体的设计和实现,将来可以提供类似 a[target] 的配置项,让页面跳转和切换的时候可以指定父页面或子页面作为目标最后总结下来,如果大家认可我们上述的设想和取舍的话,Weex 在应用级别的工程实践上还欠缺这么几个地方:
a[target] 的配置项,在页面跳转或切换时可以指定目标页面这里首先谈了谈个人对 SPA 的认识,同时觉得 SPA 背后的命题本质上是“如何管理复杂的页面关系”。然后列出了几个关键的维度,包括如何拆分页面、如何管理耦合、如何跳转和切换页面、页面间如何通信和数据共享等等,并对比了 SPA 在这方面的表现,和手机淘宝传统的实践经验和取舍判断,最后按照相同的思维模型得出了 Weex 在这方面的选择,列出了接下来的 Actions。在整个过程中,我们可能还是会在细节问题上展开更具体的讨论,届时我们可以再伺机探讨。
谢谢
如题,SPA (Single Page Application - 单页应用) 这个话题已经在 Weex 社区讨论了有一段时间,在传统的前端开发领域中大家也在长期探讨这个话题。这里谈谈我个人的理解和看法。
SPA 往往和 Router、页面间通信、页面间数据共享这些词汇联系在一起,不少同学直接问到这些词汇,实际上都是以 SPA 为前提的,因为脱离 SPA 的概念,这些词汇将失去它原有的意义,或者变成了完全不同的东西。
那 SPA 不是理所当然、天经地义、不容挑战的吗?干嘛要脱离 SPA 的概念讨论这些问题?
我觉得不是
SPA 背后的命题是如何管理复杂的页面关系,最终构成一个产品的整体。传统的页面之间是通过简单粗暴的“页面跳转”和“浏览器前进/后退”建立联系的,SPA 提出的观念是在浏览器中模拟页面的跳转、切换和前进/后退,相关的很多周边命题也随之而生。
(其实你不觉得这也是个"全家桶"么……)
所以我们先把问题回归到如何管理复杂的页面关系
我觉得有以下几个子命题 —— 在这之前,我想先把接下来所有的讨论,从形态上收敛到手机应用,PC 端的暂时不涉及。
怎么把一个完整的产品以页面为维度进行拆分,这里是有学问的。
其中最关键的一个认知问题就是页面的颗粒度是否就是整个手机屏幕同时可以呈现的所有内容?
如果是,那么页面本身的结构就是简单的一维模型,即所有的页面都可以完全独立工作运行。
如果不是,那么有可能某个页面是另外一个页面的一部分,两者之间有包含关系。这样的话页面结构就变成了多维的。
在 PC 上,答案显然是后者,因为 PC 的屏幕比手机要大得多,所有页面都要整屏更换和依赖,显然是不合理的,但是在手机屏幕上,我们有机会简化为前者。
也可以从另外一个角度讲,不说怎么解耦,而是不同的页面之间保留了哪些耦合。
这个地方的设计直接决定了大规模并行研发产品的可能性和实际的效率效果
<a> 链接、location 设置、历史管理 API等手机淘宝的工程传统是一种非常简单粗暴直接有效的理念 —— 可能你看下来会有这种感觉
首先我们没有实践 SPA —— 准确的讲鲜有成功实践的 SPA 案例,但解决上述问题有一些自己细节上的思考
<iframe> 可以使用 Web Messaging API 来进行通信,但总体上确实场景非常少所以大家会发现,我们为了更好的工程实践和大规模并行研发方面做了一定的取舍
经过上述分析和论述,我们也逐步滤清了 Weex 在这个复杂问题上的思路:如何解决 Weex 中路由管理的问题?如何在 Weex 上进行 SPA 实践?如何让 Weex 页面之间通信或共享数据?其实面对这么多看似复杂混乱的问题,只要从上述几个角度抓住重点问题,提出关键解法,就可以把复杂问题逐一解开。
<web>/<embed> 这样的组件,可以管理子页面,但这里我们延续了手机淘宝对待子页面状态定位的看法,不做中心化的设计,每个页面可以自由定义识别规则 —— 当然这个规则范围就不包含 path 了 —— 因为这需要模拟页面的跳转和切换,所以只有 query 和 hash 可以识别<a> 链接和 openURL() 方法,对于 <web>, <embed> 中产生的跳转和切换命令,我们目前还没有具体的设计和实现,将来可以提供类似 a[target] 的配置项,让页面跳转和切换的时候可以指定父页面或子页面作为目标最后总结下来,如果大家认可我们上述的设想和取舍的话,Weex 在应用级别的工程实践上还欠缺这么几个地方:
a[target] 的配置项,在页面跳转或切换时可以指定目标页面这里首先谈了谈个人对 SPA 的认识,同时觉得 SPA 背后的命题本质上是“如何管理复杂的页面关系”。然后列出了几个关键的维度,包括如何拆分页面、如何管理耦合、如何跳转和切换页面、页面间如何通信和数据共享等等,并对比了 SPA 在这方面的表现,和手机淘宝传统的实践经验和取舍判断,最后按照相同的思维模型得出了 Weex 在这方面的选择,列出了接下来的 Actions。在整个过程中,我们可能还是会在细节问题上展开更具体的讨论,届时我们可以再伺机探讨。
谢谢