鸿蒙系统中的 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 相关文章推荐
浅析jQuery的链式调用之each函数
Dec 03 Javascript
JS继承--原型链继承和类式继承
Apr 08 Javascript
点击进行复制的JS代码实例
Aug 23 Javascript
js中settimeout方法加参数
Feb 28 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
Apr 08 Javascript
js控制iframe的高度/宽度让其自适应内容
Apr 09 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
Sep 18 jQuery
vue 实现剪裁图片并上传服务器功能
Mar 01 Javascript
vue+axios新手实践实现登陆的示例代码
Jun 06 Javascript
jQuery实现的自定义轮播图功能详解
Dec 28 jQuery
vue-router实现编程式导航的代码实例
Jan 19 Javascript
微信小程序如何实现点击图片放大功能
Jan 21 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
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
PHP URL路由类实例
2013/11/12 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
简单了解node npm cnpm的具体使用方法
2019/02/27 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
微信小程序swiper左右扩展各显示一半代码实例
2019/12/05 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
跟老齐学Python之print详解
2014/09/28 Python
Python的re模块正则表达式操作
2016/05/25 Python
Django 实现下载文件功能的示例
2018/03/06 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
Python集合操作方法详解
2020/02/09 Python
python如何调用字典的key
2020/05/25 Python
python爬虫中采集中遇到的问题整理
2020/11/27 Python
天猫精选:上天猫,就够了
2016/09/21 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
消防安全责任书范本
2014/04/15 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
小学中等生评语
2014/12/29 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
springboot入门 之profile设置方式
2022/04/04 Java/Android
MySQL数据库 任意ip连接方法
2022/05/20 MySQL
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS