鸿蒙系统中的 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 全角转换实现代码
Jul 17 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
Jul 18 Javascript
用于deeplink的js方法(判断手机是否安装app)
Apr 02 Javascript
使用JS+plupload直接批量上传图片到又拍云
Dec 01 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
Jan 23 Javascript
javascript将数字转换整数金额大写的方法
Jan 27 Javascript
javascript判断复选框是否选中的方法
Oct 16 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
Jan 29 Javascript
jquery dialog获取焦点的方法
Feb 09 Javascript
详谈DOM简介及节点、属性、查找节点的方法
Nov 16 Javascript
vue路由懒加载的实现方法
Mar 12 Javascript
JavaScript实现栈结构详细过程
Dec 06 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
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
详解PHP中的Traits
2015/07/29 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
VUE页面中加载外部HTML的示例代码
2017/09/20 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
详解React native fetch遇到的坑
2018/08/30 Javascript
Node.js 实现抢票小工具 & 短信通知提醒功能
2019/10/22 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
Python3中多线程编程的队列运作示例
2015/04/16 Python
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
Python reduce()函数的用法小结
2017/11/15 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
2018/10/09 Python
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
JSF的标签库有哪些
2012/04/27 面试题
学生自我鉴定范文
2013/10/04 职场文书
syb养殖创业计划书
2014/01/09 职场文书
求职自荐信怎么写
2014/03/06 职场文书
怎样填写就业意向
2014/04/02 职场文书
教师个人年终总结
2015/02/11 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
交通事故协议书范本
2016/03/19 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL
如何获取numpy array前N个最大值
2021/05/14 Python
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android