html5:目前最新的 html 规范,w3c 联盟制定,手机端主要由 webkit 实现规范,对用户来说就是浏览器实现了它
html5+:所谓 "+",扩充了 html5 原本没有的 app 功能对象,"中国 html5 + 产业联盟" 规范了 html5 + 并且实现他们,html5 + 是对常用的原生 API 的 js 封装,包括相机,陀螺仪等 31 个常用 API(android 和 ios 通用),这些 html5 是没有的!
native.js:native.js 技术,简称 NJS,是一种将手机操作系统的原生对象转义,映射为 JS 对象,在 JS 里编写原生代码的技术。上面的 html5 + 就是他的一个实现好的子集。native.js 不是 js 框架,是技术!
如果说 Node.js 把 js 扩展到服务器世界,那么 Native.js 则把 js 扩展到手机 App 的原生世界。
5+Runtime:native.js 的运行时,相当于. net 对 C#,JRE 对于 JAVA,是一个运行环境,有把 Native.js 映射到 java,oc 代码的原生 API 功能,从而实现原生的调用。
对于 5+Runtime 和 native.js 的关系可以理解成:native.js 是一种语言 (语法基于 js),5+runtime 是这语言的运行环境!
html5+sdk:软件开发工具包,它和 android sdk,ios sdk 一样
HTML5+ 的 SDK,是把 5+ runtime 封装为原生 SDK,它有 3 个用途。
然后:当我们使用 dcloud 的 mui 框架做应用开发的时候
有这么几种情况!
即浏览器级的 html5+js+CSS,不需要打包成 app,可以使用 mui 框架里的 css 样式和部分 js,与开发传统的 wap 手机页面相同,相似的其他框架有诸如:jquery mobile,amazeui 等等。
这样开发只适合制作微信公众号,手机网页等等,并且只能在浏览器中使用应用,不过相比于 html4 已经强大不少。
需要在 mui.init() 之后才能使用 mui 这个对象,调用其中部分的 js 方法,为什么说部分是因为。。。请往下看!
mui 中有个 plus 对象,他不是简单的使用 html5 的功能,而是提供了一个叫 html5 + 的 API 集,并且将他们封装在了这个 plus 对象中,里面有陀螺仪,map,定位,相机,文件流等等的原生功能调用接口!
plus 这里面的对象就必须在 mui.plusReady() 之中使用,,而上面说浏览器级别的只能使用 mui 部分的 js 对象和方法就是这个原因!如果不是用 html5+,你并不需要使用 plusReady 方法,只需要在用 mui 之前 mui.init() 一下就可以,这也是经常有人问的 mui.init() 和 plusReady() 的区别。
mui.plusReady() 是为"html5+"而生的,最终通过"html5+sdk" 打包成了 app 级别才能使用,因为这 plus 对象里面的东西最终会被映射成为 java(android sdk),objective-c(ios sdk)的代码,这也是 native.js 的技术咯!
说太多也不好理解,这些底层的实现都已经由 dcloud 团队领导的 "中国 html5 + 产业联盟"(社区)实现了,我们只要知道我们写的 plus 对象的 js 代码都会被转化为原生代码,app 就能实现很多原生功能的调用。
注意:plus 这些东西在浏览器级别是不支持的,所以不可以在普通浏览器中调用这个 plusReady,以及 plus.xxx.xxx 方法等,浏览器用 mui 框架只是一部分可用的而已(刚刚说过了,再啰嗦一下)!
要使用 html5 + 就要求我们打包成 app(使用 html5+sdk),有 5+Runtime,这样即可运行 plus 对象下的对象和方法,这个打包可以由 hbuilder 实现。(称之为:调试基座,html5 + 的功能要在调试基座中实现,即 5+runtime)
这些都是 app 级别的了
完全有这种可能,毕竟 html5 + 是规范性的,不能什么原生 API 都往里面塞对吧,他实现的是基本的,常用的一些原生 API 调用,比如相机,定位,陀螺仪,文件流等等等。。。 (有 31 个,详细请看:http://www.html5plus.org/doc/h5p.html)
其实真正的原生语法有几十万个,提供 API 数不胜数,不可能一一调出来,html5 + 把几个常用的被规范化提出来而已。
要使用其他的原生语法并映射成为 js 就要用到比 html5 + 更厉害的 native.js 了
native.js 是对 html5 + 的扩展(超集),是映射到原生代码的原理,交给原生代码去实现原生开发的功能,可以简单说成是把 js 代码转化为 java 代码了,当然 java 也不过是 JVM 虚拟机上跑的,最终还被转换了二进制,计算机编程实现就是这样一层一层往下丢的啦!
注意:native.js 不是一个 js 框架,和 node.js 命名一样,是一种技术实现,专门把 js 映射成底层代码,或者说是 js 在 app 开发上的一种实现!就像 node 把 js 带入了服务器和系统领域一样的道理。
使用 native.js 需要对原生语法,api 十分的了解,你至少要学过 android 或者 ios 开发,否则你只能 copy 别人代码也不知道为什么这么写!
下面举个例子,就懂了为什么你不懂原生就不能搞 native.js:
- function plusReady(){
- // 导入Native.js需要的原生对象Activity= plus.android.runtimeMainActivity();BitmapFactory= plus.android.importClass("android.graphics.BitmapFactory");StringBuffer= plus.android.importClass("java.lang.StringBuffer")
- Byte= plus.android.importClass("java.lang.Byte");CompressFormat= plus.android.importClass("android.graphics.Bitmap.CompressFormat");bBitmap= plus.android.importClass("android.graphics.Bitmap");ByteArrayOutputStream= plus.android.importClass("java.io.ByteArrayOutputStream");Base64= plus.android.importClass("android.util.Base64");
- //viewClass = plus.android.importClass("android.view.View");
- document.getElementById("btGetCapture").disabled="";
- }
看到没这是一个 html5 + 没有的截屏功能,是通过 native.js 扩展实现的
里面出现了大量的 importClass,写过 java 就明白了,这不是 java 在导入包吗??
是的,native.js 就是实现了 js 导入 java 包,并且最终使用 java 的代码来实现功能
总之
参考别人做好的 native.js 对原生功能调用:http://ask.dcloud.net.cn/article/114
关于其它的 hybrid 框架开发 app:http://www.360doc.com/content/15/0423/18/21412_465487870.shtml
来源: http://www.cnblogs.com/devilyouwei/p/6793609.html