鸿蒙系统中的 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 相关文章推荐
DD_belatedPNG,IE6下PNG透明解决方案(国外)
Dec 06 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 Javascript
jQuery toggleClass应用实例(附效果图)
Apr 06 Javascript
JavaScript面向对象之私有静态变量实例分析
Jan 14 Javascript
jQuery Html控件基本操作(日常收集整理)
Mar 11 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
Aug 02 Javascript
深入掌握 react的 setState的工作机制
Sep 27 Javascript
在vue项目中引入highcharts图表的方法(详解)
Mar 05 Javascript
Vue.js实现大转盘抽奖总结及实现思路
Oct 09 Javascript
Node.js API详解之 Error模块用法实例分析
May 14 Javascript
实例讲解React 组件
Jul 07 Javascript
Antd中单个DatePicker限定时间输入范围操作
Oct 29 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
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
2019/08/02 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python编程入门的一些基本知识
2015/05/13 Python
django富文本编辑器的实现示例
2019/04/10 Python
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
美国医疗用品、医疗设备和家庭保健用品商店:Medical Supply Depot
2018/07/08 全球购物
服装店营销方案
2014/03/10 职场文书
法人代表授权委托书
2014/04/08 职场文书
离职感谢信怎么写
2015/01/22 职场文书
六一儿童节开幕词
2015/01/29 职场文书
2015年班组工作总结
2015/04/20 职场文书
学校百日安全活动总结
2015/05/07 职场文书
环保宣传语大全
2015/07/13 职场文书
2016见义勇为事迹材料汇总
2016/03/01 职场文书
2019 入党申请书范文
2019/07/10 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
python的html标准库
2022/04/29 Python