鸿蒙系统中的 JS 开发框架


Posted in Javascript onSeptember 18, 2020

今天鸿蒙终于发布了,开发者们也终于“沸腾”了。

源码托管在国内知名开源平台码云上,https://gitee.com/openharmony

我也第一时间下载了源码,研究了一个晚上,顺带写了一个 hello world 程序,还顺手给鸿蒙文档提了 2 个 PR。

当然我最感兴趣的就是鸿蒙的 JS 框架 ace_lite_jsfwk,从名字中可以看出来这是一个非常轻量级的框架,官方介绍说是“轻量级 JS 核心开发框架”。

当我看完源码后发现它确实轻。其核心代码只有 5 个 js 文件,大概也就 300-400 行代码吧。(没有单元测试)

runtime-core\src\core\index.js
runtime-core\src\observer\observer.js
runtime-core\src\observer\subject.js
runtime-core\src\observer\utils.js
runtime-core\src\profiler\index.js

从名字可以看出来,这些代码实现了一个观察者模式。也就是说,它实现了一个非常轻量级的 MVVM 模式。通过使用和 vue2 相似的属性劫持技术实现了响应式系统。这个应该是目前培训班的“三大自己实现”之一了吧。(自己实现 Promise,自己实现 vue,自己实现 react)

鸿蒙系统中的 JS 开发框架

utils 里面定义了一个 Observer 栈,存放了观察者。subject 定义了被观察者。当我们观察某个对象时,也就是劫持这个对象属性的操作,还包括一些数组函数,比如 push、pop 等。这个文件应该是代码最多的,160 行。observer 的代码就更简单了,五六十行。

而当我们开发的时候,通过 Toolkit 将开发者编写的 HML、CSS 和 JS 文件编译打包成 JS Bundle,然后再将 JS Bundle 解析运行成C++ native UI 的 View 组件进行渲染。

“通过支持三方开发者使用声明式的 API 进行应用开发,以数据驱动视图变化,避免了大量的视图操作,大大降低了应用开发难度,提升开发者开发体验”。基本上就是一个小程序式的开发体验。

鸿蒙系统中的 JS 开发框架

在 src\core\base\framework_min_js.h 文件中,这段编译好的 js 被编译到了 runtime 里面。编译完的 js 文件不到 3K,确实够轻量。

js runtime 没有使用 V8,也没有使用 jscore。而是选择了 JerryScript。JerryScript 是用于物联网的超轻量 JavaScript 引擎。它能够在内存少于 64 KB 的设备上执行 ECMAScript 5.1 源代码。这也是为什么在文档中说鸿蒙 JS 框架支持 ECMAScript 5.1 的原因。

从整体看这个 js 框架大概使用了 96% 的 C/C++ 代码,1.8% 的 JS 代码。在 htm 文件中写的组件会被编译为原生组件。而 app_style_manager.cpp 和同级的七八个文件则用来解析 css,最终生成原生布局。

虽然在 SDK 中有几个 weex 包,也发现了 react 的影子。但是在 C/C++ 代码中并没有看到 yoga 相关的内容(全局搜索没发现)。而 SDK 中的那些包仅仅是做 loader 用的,大概是为了在 webpack 打包时解析 htm 组件用的。将 htm 的 template 编译为 js 代码。

整体而言,比我预想的要好一些。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE浏览器PNG图片透明效果代码
Sep 02 Javascript
JavaScript 无符号右移赋值操作
Apr 17 Javascript
javascript读写json示例
Apr 11 Javascript
js实现背景图片感应鼠标变化的方法
Feb 28 Javascript
学JavaScript七大注意事项【必看】
May 04 Javascript
Bootstrap 组件之按钮(二)
May 11 Javascript
客户端验证用户名和密码的方法详解
Jun 16 Javascript
Jquery实现上下移动和排序代码
Oct 17 Javascript
js仿拉勾网首页穿墙广告效果
Mar 08 Javascript
带你了解session和cookie作用原理区别和用法
Aug 14 Javascript
React+EggJs实现断点续传的示例代码
Jul 07 Javascript
JavaScript中如何调用Java方法
Sep 16 Javascript
React倒计时功能实现代码——解耦通用
Sep 18 #Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
Sep 17 #Javascript
vue项目中播放rtmp视频文件流的方法
Sep 17 #Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
Sep 17 #Javascript
vue项目实现多语言切换的思路
Sep 17 #Javascript
vue实现放大镜效果
Sep 17 #Javascript
JavaScript封装单向链表的示例代码
Sep 17 #Javascript
You might like
isset和empty的区别
2007/01/15 PHP
phpQuery占用内存过多的处理方法
2013/11/13 PHP
将二维数组转为一维数组的2种方法
2014/05/26 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
javascript call和apply方法
2008/11/24 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
JS:window.onload的使用介绍
2013/11/13 Javascript
Jquery对数组的操作技巧整理
2014/03/25 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
javascript的BOM汇总
2015/07/16 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
利用vue + element实现表格分页和前端搜索的方法
2017/12/25 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
Python连接PostgreSQL数据库的方法
2016/11/28 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
Python科学画图代码分享
2017/11/29 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
Python查找文件中包含中文的行方法
2018/12/19 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
公司会计主管岗位责任制
2014/03/01 职场文书
房屋买卖协议书范本
2014/04/10 职场文书
2014年租房协议书范本
2014/10/30 职场文书
2015年安全月活动总结
2015/03/26 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
2022/03/23 MySQL
Nginx报错104:Connection reset by peer问题的解决及分析
2022/07/23 Servers