鸿蒙系统中的 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 相关文章推荐
在JavaScript中遭遇级联表达式陷阱
Mar 08 Javascript
图片格式的JavaScript和CSS速查手册
Aug 20 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
Nov 21 Javascript
基于jQuery的图片左右无缝滚动插件
May 23 Javascript
自己写的Javascript计算时间差函数
Oct 28 Javascript
Javascript实现可旋转的圆圈实例代码
Aug 04 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
Oct 12 Javascript
JavaScript实现下拉菜单的显示和隐藏
Jan 05 Javascript
Vue.js每天必学之内部响应式原理探究
Sep 07 Javascript
addeventlistener监听scroll跟touch(实例讲解)
Aug 04 Javascript
JavaScript 中的 this 简单规则
Sep 19 Javascript
vuex存储token示例
Nov 11 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
php 遍历数据表数据并列表横向排列的代码
2009/09/05 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
控制PHP的输出:缓存并压缩动态页面
2013/06/11 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
php-app开发接口加密详解
2018/04/18 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
Javascript客户端脚本的设计和应用
2006/08/21 Javascript
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
2015/01/28 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
JS简单实现数组去重的方法分析
2017/10/14 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
启动targetcli时遇到错误解决办法
2017/10/26 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
美国眼镜网站:LensCrafters
2020/01/19 全球购物
锐步香港官方网上商店:Reebok香港
2020/11/05 全球购物
会计自荐信范文
2014/03/09 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
总经理致辞
2015/07/29 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL