鸿蒙系统中的 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 相关文章推荐
求解开jscript.encode代码的asp函数
Feb 28 Javascript
JQUERY 浏览器判断实现函数
Aug 20 Javascript
ExtJs使用IFrame的实现代码
Mar 24 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
Nov 28 Javascript
JavaScript中判断函数是new还是()调用的区别说明
Apr 07 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
Feb 02 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
May 13 Javascript
JavaScript奇技淫巧44招【实用】
Dec 11 Javascript
vue小白入门教程
Apr 02 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
Sep 03 Javascript
layui radio点击事件实现input显示和隐藏的例子
Sep 02 Javascript
浅谈Vue的computed计算属性
Mar 21 Vue.js
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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
深入探讨PHP中的内存管理问题
2011/08/31 PHP
php实现的替换敏感字符串类实例
2014/09/22 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
jsonp原理及使用
2013/10/28 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
jquery增加和删除元素的方法
2015/01/14 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
2016/01/18 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
跟老齐学Python之数据类型总结
2014/09/24 Python
python dlib人脸识别代码实例
2019/04/04 Python
python实现动态创建类的方法分析
2019/06/25 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
微信公众号token验证失败解决方案
2019/07/22 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
如何查看python关键字
2021/01/17 Python
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
美国在线珠宝商店:SZUL
2017/02/11 全球购物
临床医学专业个人的自我评价
2013/09/27 职场文书
亚运会口号
2014/06/20 职场文书
求职自我推荐信
2014/06/25 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
学生违反校规检讨书
2014/10/28 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
Hive导入csv文件示例
2022/06/25 数据库