当前位置: 首页 > 编程日记 > 正文

如何设计 Web App 应用架构?「两分钟了解 IOING」

IOING 在做些什么?

IOING 在你的代码和浏览器之间架设了一个中间解释层,该解释层提供了一套新的语法来填补浏览器所不具备的能力。

SPA 开发痛点

开发一个 SPA 应用的痛点是不同模块页面的状态保存,当从一个页面跳转到另一个页面的时候窗口的所有状态都将被清空重载,历史页面与当前页面将不产生任何联系,这个过程是一个拆毁重建的过程,如果你要回到历史同样只能再次拆毁重建,并且在这个过程中不可避免的出现加载期的窗口白屏,显然这样的丑陋效果不符合一个高贵 App 的设定,但正因这种方式前后页面不共存的简单特性也使得开发逻辑变得简单,开发者只需考虑单个页面的逻辑即可,而每一次新页面的加载都能将之前页面进行完全释放,完全不需要担心高耦合和内存无法完全释放的问题,这也算是传统技术的优点,虽然简单粗暴,但是它很管用。那到底有没有两全其美的办法呢?

传统模式带来的挑战

和 SPA 应用不同的是多页面应用往往相对要变得简单,页面与页面之间不需要有复杂的数据交换,也无需保存页面历史状态,因此使用传统技术最适合不过了。

而 SPA 应用则要协调页面间的关系,它的每一个模块都可能是联动的,而且需要保持窗口的数据状态,因而催生了另一个技术的流行,即通过使用 Ajax 和模版将新模块内容载入到当前页面,但这也导致新载入模块的脚本和 DOM 树内容在主文档下不断堆积,且在不需要时也无法将其很好移除和释放(比如 setTimeout 等僵尸事件)。另一种情况是一旦其中一个模块发生错误将很有可能导致整个 SPA 应用崩溃。

除了高耦合问题外,Ajax 每次载入大量的 DOM 结构到主 DOM Tree 下时都将可能会导致这个庞大的 DOM Tree 进行 reflow(回流) 和 repaint(重绘),从而影响整体运行效率

实现方案分析

基于上述分析,我们要得到一个稳定的 SPA 应用时必须改造浏览器使其支持以下特性:

  1. 为保证应用松耦合,浏览器必须具备能够使新加载的模块与已加载模块不产生相互干扰的能力。
  2. 为使浏览器载入大量模块时不会造成内存占用过高,浏览器应能使被移除后的模块能被完全释放。
  3. 浏览器应使模块运行在独立空间中,以保证模块自身错误时不至于导致整个应用停止工作。

只有具备了这些特性时才能保证一个大型 WEB 应用的稳定运行,那么对于上述问题 IOING 是怎么处理的呢?

首先为了保证模块的代码错误不至于影响整个应用的运行,我们需要保证除引擎外的所有不可控脚本都不能运行在主 window 下,而模块脚本自需要运行在单独的沙盒中。

什么是沙盒模块?

沙盒(Sandbox)简单来讲就是: <iframe src="_blank" sandbox="..."></iframe>
无需解释大家也就都懂了,但是很多人在看到 iframe 时就开始各种担心起来,联想起各种文章对 iframe 的负面描述。这里需要解释一下,iframe 直接作为嵌入网页使用时确实会占用当前页面连接池,但其在引擎中其主要目的是作为沙盒使用而并不是为了嵌入网页使用的,当引擎将编译好内容时会先主动创建一个空 iframe,然后直接将编译内容直接丢入其中,注意 iframe 的 src="_blank",这是一个空页面,该情况下 iframe 并不会共享主窗口连接池。

我们设想一下这样一个场景:你在浏览器打开多个窗口分别载入不同的模块页面,然后在你需要打开其他页面时能通过自定义动画使浏览器窗口进行动画过渡将页面展示,当你返回时也能通过反向动画再将之前窗口内容过渡回来,如果浏览器支持这些或许 webApp 看起来将更酷,但现实是浏览器并没有这样的操作?‍♂️。

而这个设想可以通过沙盒来实现,在沙盒中的页面就像新开一个浏览器窗口那样,能够很好的隔离模块的 DOM 元素和变量,也能保存页面状态,并能通过动画控制其转场。

沙盒虽然很稳妥,但其过于独立,这导致模块内元素不能突破沙盒限制显示在模块外区域,比如说一些复合型模块(即嵌入主模块中的模块,沙盒一般适用与独立的全屏模块),当你有这个需求时沙盒特性则不能满足你,此时你应该支持另一种模块运行方式:shadowbox 应运而生。

shadowbox

使用 shadowbox 配置的模块,其模块内容将以一颗新 DOM Tree 插入到主 DOM Tree 中(即 shadowdom 方式),这颗新 DOM Tree 中的 CSS样式 和 元素id 将不会和外部元素耦合,而此时模块的 js 文件则依旧在其沙盒中运行。(若运行浏览器不支持该特性时应自动降级处理)

后续

当然只有一个沙盒模型是远远不够的,比如组件同样需要一套合理运作机制。之后「两分钟了解IOING」将会继续推出以下话题:

  1. 组件设计与通信
  2. 模块刷新机制
  3. 量子 DOM 原理(和 Def 算法不同的数据双向绑定设计)
  4. CSS 引擎的设计思想

更多敬请期待...

往期话题

IOING在开发SPA大型应用时有哪些必要的技术条件?
如何用 js 获取虚拟键盘高度?(适用所有平台)
让 CSS 完成背景图加载完毕后显示 之 解析 IOING 的 onload url 原理

IOING 主要特点图示

IOING 是一款高性能的前端开发引擎。它为创建一个大型应用提供一整套的完备方案,如页面模块化拆分、层级路由控制、可编程CSS、热拔插组件、双向数据绑定、DOM语法扩展、自动兼容处理等

图片描述

联系

扫码二维码关注我的公众号:
图片描述

资源

传送门:IOING 仿ios界面

传送门:官网

传送门:Github 项目地址

相关文章:

ICLR 2019论文投稿近1600篇,强化学习最热门

作者 | 非主流出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;ICLR 2019 的论文提交已经截止。根据官方消息&#xff0c;本届大会共收到近 1600 篇投稿&#xff0c;相比 ICLR 2018 的 935 篇&#xff0c;以及 ICLR 2017 的 490 篇&#xff0c;几乎每…

[Java]学习Java(4)类、接口、语句

1)类多了包的概念2)类继承时与C&#xff0b;&#xff0b;不同&#xff0c;它可以将父类protected的函数重写为public的。3)接口、纯虚函数概念都差不多&#xff0c;语法为&#xff1a;public class A extends B implements IC,ID,IE { ...}4)语句&#xff1a;与C&#xff0b;&a…

php easyui tree 结构,EasyUI Tree树组件无限循环的解决方法

在学习jquery easyui的tree组件的时候&#xff0c;在url为链接地址的时&#xff0c;发现如果最后一个节点的state为closed时&#xff0c;未节点显示为文件夹&#xff0c;单击会重新加载动态(Url:链接地址)形成无限循环。如&#xff1a;tree.json[{"id":1,"text&…

Scikit-learn 发布 0.20版本!新增处理缺失值、合并Pandas等亮点功能

整理 | Jane出品 | AI科技大本营之前一直预告 Scikit-learn 的新版本会在 9 月发布&#xff0c;在马上就要结束的 9 月&#xff0c;我们终于迎来了 Scikit-learn 0.20。此版本修复了大量的错误和功能&#xff0c;增强了 Scikit-learn 库&#xff0c;改善了文档和示例。在此对 …

深挖数据价值 阿里云栖开年大会报道

本文讲的是深挖数据价值 阿里云栖开年大会报道【IT168 云计算】经历风雨&#xff0c;转身看到彩虹。在这个“化云为雨”的时节&#xff0c;造云大咖们角色扮演也逐步渐入佳境&#xff0c;或随需而动&#xff0c;或引领潮流。阿里云作为国内公有云绝对的大咖之一&#xff0c;正以…

使用Facade模式分析

在遇到以下情况时可以考虑使用Facade模式&#xff1a;1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小类。这使得子系统更具可重用性&#xff0c;也更容易对子系统进行定制&#xff0c;但这也给那些不…

我与前端之间不得不说的三天两夜之javaScript

前端基础之JavaScriptJavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套…

难以置信!LSTM和GRU的解析从未如此清晰(动图+视频)

作者 | Michael Nguyen编译 | 蔡志兴、费棋编辑 | Jane出品 | AI科技大本营【导语】机器学习工程师 Michael Nguyen 在其博文中发布了关于 LSTM 和 GRU 的详细图解指南。博文中&#xff0c;他先介绍了 LSTM 和 GRU 的本质&#xff0c; 然后解释了让 LSTM 和 GRU 有良好表现的内…

php 开发restful api,用PHP创建RESTful API?

如果您的服务支持所有CRUD操作,则始终建议实现RESTful接口.这样做并不是很难.我已经概述了下面的一些基础知识.RESTful服务只是做了一些事情&#xff1a;>它使用HTTP请求方法进行CRUD操作的通信>它使用HTTP状态代码来传达响应状态,以及>它使用URI来定义您的资源(您正在…

MySQL服务器的配置教程

1、安装MySQL 这个应该很简单了&#xff0c;而且我觉得大家在安装方面也没什么太大问题&#xff0c;所以也就不多说了&#xff0c;下面我们来讲讲配置。 2、配置MySQL 注意&#xff0c;在Ubuntu下MySQL缺省是只允许本地访问的&#xff0c;如果你要其他机器也能够访问的话&am…

php开发我的世界插件,WorldEdit/开发与API

本页面已存在其他语言的内容&#xff0c;请协助翻译为本地化的中文。点击此处开始翻译。如本模板出现在原文存档页面&#xff0c;请注意更新主页面后&#xff0c;仍需要去除此处该模板如当前页面已经没有需要翻译的内容&#xff0c;请删去待翻译模板有标题的大篇幅文章&#xf…

关于AI,腾讯又有大动作!开发者该如何应对?

时隔 6 年后&#xff0c;腾讯公司的组织架构迎来新一轮的优化调整&#xff0c;在原有七大事业群&#xff08;BG&#xff09;的基础上进行重组整合。 腾讯公司董事会主席兼首席执行官马化腾表示&#xff1a;“作为一家以互联网为基础的科技和文化公司&#xff0c;技术是腾讯公司…

Android存储方式之SQLite

前言 SQLite数据库操作在Android开发中非常常用今天我将带大家全面了解关于SQLite数据库的操作&#xff08;增、删、查、改&#xff09;目录 1. SQLite数据库介绍 SQLite是Android内置的一个小型、关系型、属于文本型的数据库。 > Android提供了对 SQLite数据库的完全支持&a…

最近要换个主机,现在的太慢了

最近在学习wtl&#xff0c;打算做一个文件搜索工具来练手&#xff0c;需要正则表达式处理、数据库存储、键盘HOOK以及UI等技术UI用WTL搞定正则表达式的处理&#xff1a;http://research.microsoft.com/projects/greta/regex_perf.htmlhttp://www.tropicsoft.com/Components/Reg…

oracle数据库配置失败,oracle11g – Oracle 11G XE安装错误:数据库配置失败

在linuxMint上安装后运行oracle配置时&#xff1a;/etc/init.d/oracle-xe configure指定以下错误&#xff1a;sudo /etc/init.d/oracle-xe configureOracle Database 11g Express Edition Configuration-------------------------------------------------This will configure …

显示来自多个表的数据——JOIN

表关系简介 一、语法 SELECT 字段列表FROM TABLE1 [CROSS JOIN TABLE2 ] | [NATURAL JOIN TABLE2 ] | [JOIN TABLE2 USING (字段名) ] | [JOIN TABLE2 ON (TABLE.COLUMN_NAME TABLE2.COLUMN_NAME) ] | [(LEFT | RIGHT | FULL OUT) JOIN TABLE2 ON (TABLE1.COLUMN_NAME TABL…

20年第三次架构大调整,腾讯永远年轻!

整理 | 琥珀出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;凌晨&#xff0c;腾讯官方公众号发布了一则消息&#xff0c;公布了成立 20 周年以来的新一轮整体战略升级。此前&#xff0c;国内各大互联网公司包括阿里、百度、美团、滴滴、京东都相继进…

NHibernate和Cuyahoga(二)(翻译):

原文:http://www.cuyahoga-project.org/home/developers.aspxMappings: 在我们使用像NHibernate这样强大的ORM工具的时候,映射类有时候是相当严格的.这就造成了很大的障碍,尤其是由于没有足够的真实的映射例子(更确切的说,对于Java版本的Hibernate来说,会有更多的例子).…

Enterprise Library Step By Step系列(十二):异常处理应用程序块——进阶篇

一&#xff0e;把异常信息Logging到数据库在日志和监测应用程序块中&#xff0c;有朋友提意见说希望能够把异常信息Logging到数据库中&#xff0c;在这里介绍一下具体的实现方法。1&#xff0e;创建相关的数据库环境&#xff1a;我们可以用日志和监测应用程序块自带的SQL语句来…

观点PK_倘若做不好AI,云服务商还能勇往直前吗?

AI强大却不独立存在&#xff0c;如今已经成为人们普遍接受的理念之一。在这个火热的时代&#xff0c;AI技术不是一个独立的产品&#xff0c;而是一种“基本生产力”&#xff0c;它适用于大部分经济活动&#xff0c;可以让各行各业都产生“增倍效应”&#xff0c;可以预见的是&a…

练习 MongoDB 操作 —— 备份篇(三)

2019独角兽企业重金招聘Python工程师标准>>> mongodb数据备份和还原主要分为二种&#xff0c; 一种是针对于库的mongodump和mongorestore&#xff0c; 一种是针对库中表的mongoexport和mongoimport。 mongodb 数据库操作--备份 还原 导出 导入 导入与导入 导入与导出…

判断是否为闰年oracle,ORACLE 通过日期变量判断是否闰年

最近在做同比环比报表&#xff0c;2月份的日期需要判断是否闰年&#xff0c;在网上查了很多资料&#xff0c;大部分都是用sysdate说明的&#xff0c;不是很理想&#xff0c;自己捣鼓了半天&#xff0c;终于整出来了。跟大家分享下。declarevbdate date;V_LASTDAY NUMBER(2,0);V…

CentOS 6.x中目录结构及用途

目录名称作用/根目录&#xff0c;一般根目录下只存放目录&#xff0c;不要存放文件/bin存放普通用户可执行的系统命令/sbin存放的是超级管理员执行的系统命令/etc系统管理和配置文件存放路径/etc/rc.d启动的配置文件和脚本存放目录/etc/passwd系统用户密码文件&#xff0c;包含…

oracle dataguard 日志 很多no,oracle dataguard 日志传输原理

Services)&#xff0c;它不仅控制着传输redo数据到其它数据库&#xff0c;同时还管理着解决由于网络中断造成的归档文件未接收的过程。一、如何发送数据在primary数据库&#xff0c;DataGuard可以使用归档进程(ARCn)或者日志写进程(LGWR)收集redo数据并传输到standby&#xff0…

“偷鸡”不成的马斯克,终于丢掉了自己的“王位”

整理 | 非主流出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09;昨天&#xff0c;好战的马斯克丢了一血。据多家外媒报道&#xff0c;美国当地时间周六&#xff0c;埃隆马斯克与美国证券交易委员会&#xff08;SEC&#xff09;达成和解协议。马斯克必…

JVM指令详解(上)

文中提及的栈是虚拟机栈中的栈帧的操作数栈&#xff0c;本地变量表是栈帧中的本地变量表&#xff0c;如下图:/*** Author: qlq* Description* Date: 22:44 2018/9/25*/ public class MathTest {public static void main(String a[]){MathTest mathTest new MathTest();System.…

oracle修改时区无效,Oracle 时区问题

oracle中的tz_offset是用来返回给定时区与标准时区(UTC universal of time Coordinate 通用时间坐标)的偏移量&#xff0c;其参数可以是&#xff1a;1.一个合法的时区名2.一个离UTC的标准偏移量3.关键字SessionTimeZone或者是DB_timezone其中合法的时区名可以从系统视图V$TimeZ…

::operator new、sgi stl alloc、dlmalloc测试结果

注&#xff1a; 使用的dlmalloc为2.8.3版本使用GetTickCount()&#xff0c;测试1000000次的new/delete分配空间大小为2的幂&#xff0c;依次递增在Debug模式下sgi-stl alloc > dlmalloc > ::operator new在Release模式下dlmalloc > sgi-stl alloc > ::operator new…

假期快乐!超强面试资源等你Pick,先收藏!

整理 | Jane 出品 | AI科技大本营 【导读】准备面试不是一件简单的事情&#xff0c;本文的作者在过去一段时间先后参加 50 多次面试。过程是艰难的&#xff0c;但是在这个过程中也积累了一些非常有用的资源。今天 AI科技大本营就为大家整理了那些有价值的学习资源&#xff0c;…

oracle判断值是否为0的高数,SQLServer和Oracle的常用函数对比

数学函数1.绝对值S:select abs(-1) valueO:select abs(-1) value from dual2.取整(大)S:select ceiling(-1.001) valueO:select ceil(-1.001) value from dual3.取整(小)S:select floor(-1.001) valueO:select floor(-1.001) value from dual4.取整(截取)S:select cast(-1.002 …