wendux / DSBridge-IOS

:earth_asia: A modern cross-platform JavaScript bridge, through which you can invoke each other's functions synchronously or asynchronously between JavaScript and native.
1.96k stars 305 forks source link

为什么要引入一个新的DWKWebView,有点没太明白 #68

Closed jiyifanzi closed 5 years ago

jiyifanzi commented 5 years ago

我是先看到WebViewJavascriptBridge的库,才来了解到DSBridge这个

然后都试着对接了一下 WVJB的,感觉很显然易见,不管是JS还是OC,都能清晰的明白如何实现想要的效果,通过库提供的方法,而且几乎没有学习成本。看了下WVJB的,也是协议来持有WebView,来实现JSFramework里面的一些方法,感觉是比较简单的。

然后看了下DSBridge,本质区别不大(而且不清楚作者是否有参考过WVJB的实现,感觉DWKWebView内部实现有异曲同工的地方)。但是引入的DWKWebView,我们好像必须要继承这个类才能实现想要的效果呀

引入命名空间概念,感觉也是集大成,OC本来没有这个机制的,感觉有点奇怪哈。

不知道能否解释一下,想了解作者设计这个库的方案的思路是怎么样的

wendux commented 5 years ago

首先,大多数时候是可以直接使用DWKWebView的,而无需继承它。之所以要提供DWKWebView,是因为一来DSBridge的实现上是有侵入性的,二来,用户直接可以像使用WKWebView一样使用DWKWebView。

DSBridge与WVJB主要有以下不同:

  1. 同步支持;WVJB是不支持同步调用的,这意味着js中的native调用必须是异步的,如果调用过多,又会出现“回调地狱”。而对于一些简单的调用,同步调用会很方便。
  2. 初始化;WVJB需要在js中定义一个函数,来异步获取bridge对象(只有webview初始化成功后,bridge才可以使用),而dsBridge只需要引入一段初始化js后(dsbridge.js)就可以直接使用 ,而无论webview是否初始化成功,因为在webview在未初始化成功时,dsBridge会将调用入队,等到初始化成功后再调用。
  3. API管理;WVJB的API管理是碎片化的,每一个API都需要单独注册,如果API较多(如web app),代码耦合就会较乱。而DSBridge通过将API强制分离到一个类中, 这样一来可以解耦,二来也可以批量管理。另外,命名空间主要是针对原生API较多的APP,比如web APP, 它可以将API分类管理。之所以用“类”来管理,这一来是受到了Android的启发;二来也是语法上的必然,除了类,没有其它机制能将多个函数集中在一个语言的语法实体上。支持通过“类”来管理API集合后,支持命名空间也是水到渠成的事。
jiyifanzi commented 5 years ago

好的,感谢回复,了解了