从前端到全端:JavaScript逆袭之路

从前端到全端:JavaScript逆袭之路

  1. categorynode.get.xml定义URL拦截器和权限控制;

  2. .get指明是处理GET请求,RESTful;

  3. 在categorynode.get.js中调用已注入的Java Bean处理业务逻辑;

  4. 若为网页请求返回.html.ftl,若为Ajax,返回.json.ftl;

(此处配套使用的是FreeMarker模板引擎)

==> categorynode.get.desc.xml

从前端到全端:JavaScript逆袭之路

==> categorynode.get.js

从前端到全端:JavaScript逆袭之路

==> categorynode.get.html.ftl

从前端到全端:JavaScript逆袭之路

==> categorynode.get.json.ftl

从前端到全端:JavaScript逆袭之路

移动端集成思路&实践:

从前端到全端:JavaScript逆袭之路

React Native中的桥接

React Native目前也是异常火爆,RN程序的运行依赖于Facebook的RN框架。在iOS、Android的模拟器或是真机上,React Native使用的是JavaScriptCore引擎,也就是Safari所使用的JavaScript引擎。但是在iOS上JavaScriptCore并没有使用即时编译技术(JIT),因为在iOS中应用无权拥有可写可执行的内存页(因而无法动态生成代码),在安卓上,理论上是可以使用的。JavaScriptCore引擎也是使用C++编写,在iOS和安卓中,JavaScriptCore都做了一层封装,可以无须关心引擎和系统桥接的那一层。iOS/Android系统通过JavaScriptCore引擎将定制好的各种原生组件注入,如:listview,text等。

Cocos2d-JS中的桥接

cocos2dx是游戏开发中非常常用的游戏渲染引擎,有一系列的产品,如:cocos2dx(C++),cocos2d-lua(lua), cocos2d-js(JavaScript)等多个产品。其中最新退出的是cocos2dx的JS版本的cocos2d-js,编写游戏渲染特效代码相比于C++和lua非常方便。对于做需要经常更新的渲染场景,C++是静态语言,每次修改都需要重新编译才能运行,显然是不合适的。自然也就想到了脚本语言,lua和js,两者有些类似,都是动态语言,只需要集成一个运行引擎,提供一个运行的容器即可运行,同时通过引擎注入底层方法供脚本调用即可。lua好处是精简,语法精简,引擎页很小很精简,所以不可避免的代码量会比js多,同时学习成本比较高。js的好处是有ECMAScrtpt的核心,语法比较丰富,同时有支持一些高级属性。在cocos2d-js中,cocos2dx(C++)集成了SpiderMonkey(C++)作为JS运行引擎,中间做了一个胶水层既是JS Binding,通过引擎注入了一个cc的全局对象,映射的是底层C++的一个单例C++实例。表面上写的是JS代码,实际上操作的是底层的C++。cocos2d-js是代码可以运行在多种环境中,当运行的网页环境中时,使用的是cocos2d-html5引擎,底层操作的是canvas;当运行在客户端上时,使用的是cocos2dx引擎,底层操作的是C++,再由C++去操控openGL做绘制和渲染。提供相同的API,对开发者几乎是透明无差异的,开发者只需要关注实现效果即可。达到一套代码,多端运行(网页端,客户端)。

从前端到全端:JavaScript逆袭之路

JSPatch技术中的桥接

JSPatch是目前比较流行的iOS上的热修复技术,JSPatch 能做到通过 JS 调用和改写 OC 方法最根本的原因是 Objective-C 是动态语言,OC 上所有方法的调用/类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名/方法名反射得到相应的类和方法。JSPatch 的基本原理就是:JS 传递字符串给 OC,OC 通过 Runtime 接口调用和替换 OC 方法。

关键技术之一是 JS 和 OC 之间的消息互传。JSPatch里包含了,一个JS引擎JavaScriptCore(Safari,React Native用的同款)。用到了 JavaScriptCore 的接口,OC 端在启动 JSPatch 引擎时会创建一个 JSContext 实例,JSContext 是 JS 代码的执行环境,可以给 JSContext 添加方法,JS 就可以直接调用这个方法。本质上就是通过JavaScriptCore引擎注入,暴露OC的方法供JS调用来实现动态修改OC的反射。

Demo,iOS热更新,热修复:

  1. 集成JavaScriptCore引擎;

  2. 通过引擎,桥接JS和OC;

  3. 通过JS修改OC反射。

从前端到全端:JavaScript逆袭之路

详细的JSPatch技术介绍请移步:https://github.com/bang590/JSPatch/wiki

关于JavaScript引擎:

在iOS 或 android 上能够运行的JavaScript 引擎有4个:JavaScriptCore,SpiderMonkey,V8,Rhino。下面这个表格展示各个引擎在iOS 和 Android 的兼容性。

从前端到全端:JavaScript逆袭之路

因为iOS平台不支持JIT即时编译,而V8只有JIT模式,所以V8无法在iOS平台使用(越狱设备除外,想体验iOS JIT的同学可以自行越狱)。

所以,目前可以做到横跨iOS和Android双平台的JS引擎,只有两款,即是SpiderMonkey和JavaScriptCore。

JavaScript引擎会受很多东西影响,比如交叉编译器的版本、引擎的版本和操作系统的种类等。

至于如何选择,可以参考:《Part I: How to Choose a JavaScript Engine for iOS and Android Development》

至此,JavaScript从立足于前端,到征战全端的逆袭之路,可以总结为“携引擎以令天下”。

不足之处,还请各位看官轻拍~

参考文章:

bang590/JSPatch中问参考文档

Cocos2d-JS | Cocos2d-x官方参考文档

Alfresco官方参考文档

《Browser Wars: The End or Just the Beginning?》

《Part I: How to Choose a JavaScript Engine for iOS and Android Development》

《React Native 从入门到源码》


分享到:


相關文章: