鸿蒙系统中的 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中的Split使用方法与技巧
Mar 09 Javascript
Jquery中对数组的操作代码
Aug 12 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
Jun 04 Javascript
jquery实现的横向二级导航效果代码
Aug 26 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
Nov 15 Javascript
Vue.js实现文章评论和回复评论功能
May 30 Javascript
Vue.js鼠标悬浮更换图片功能
May 17 Javascript
使用JavaScript实现点击循环切换图片效果
Sep 03 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
Jul 03 Javascript
vue实现标签云效果的方法详解
Aug 28 Javascript
js实现秒表计时器
Dec 16 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
Feb 28 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中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
jQuery如何实现点击页面获得当前点击元素的id或其他信息
2014/01/09 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
详解小程序云开发数据库
2019/05/20 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
[38:39]KG vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
使用Python Pandas处理亿级数据的方法
2019/06/24 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
Python中常见的数制转换有哪些
2020/05/27 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
电大自我鉴定
2013/10/27 职场文书
车间主任岗位职责
2014/03/16 职场文书
我的理想演讲稿
2014/04/30 职场文书
供电工程专业求职信
2014/08/09 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
努力工作保证书
2015/02/28 职场文书
考博导师推荐信范文
2015/03/27 职场文书
子女赡养老人协议书
2016/03/23 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
nginx服务器的下载安装与使用详解
2021/08/02 Servers
JavaScript 数组去重详解
2021/09/15 Javascript
Javascript webpack动态import
2022/04/19 Javascript
python绘制云雨图raincloud plot
2022/08/05 Python