c++ sdk框架_鸿蒙系统中的 JS 开发框架

2023-11-05

今天鸿蒙终于发布了,开发者们也终于“沸腾”了。

源码托管在国内知名开源平台码云上,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)

64e56dddcde4d250df8034404820863f.png

utils 里面定义了一个 Observer 栈,存放了观察者。subject 定义了被观察者。当我们观察某个对象时,也就是劫持这个对象属性的操作,还包括一些数组函数,比如 push、pop 等。这个文件应该是代码最多的,160 行。observer 的代码就更简单了,五六十行。

而当我们开发的时候,通过 Toolkit 将开发者编写的 HML、CSS 和 JS 文件编译打包成 JS Bundle,然后再将 JS Bundle 解析运行成C++ native UI 的 View 组件进行渲染。

“通过支持三方开发者使用声明式的 API 进行应用开发,以数据驱动视图变化,避免了大量的视图操作,大大降低了应用开发难度,提升开发者开发体验”。基本上就是一个小程序式的开发体验。

20bcd2d68a9a43c1b38a5557f89845c8.png

在 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 代码。

整体而言,比我预想的要好一些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ sdk框架_鸿蒙系统中的 JS 开发框架 的相关文章

  • 在 React 组件中等待异步函数并显示 Spinner

    初学者在这里 尝试从服务器获取一些数据并在获取后将其显示在我的反应组件中 但是 我在将异步函数集成到我的反应组件中时遇到了麻烦 import React useState from react import request from gra
  • Pug 从模板内的另一个文件调用 js 函数

    我花了将近四个小时都无法解决这个问题 而且我找不到任何针对此类问题的有用文档 这就是问题 我正在使用 pug jade 模板 我想调用 pug 模板内的函数来转换一些数据 这是主要模板 main template section each
  • python 可以检测它运行在哪个操作系统下吗?

    python 可以检测操作系统 然后为文件系统构建 if else 语句吗 我需要将 Fn 字符串中的 C CobaltRCX 替换为 FileSys 字符串 import os path csv from time import strf
  • querySelector 搜索直接子级[重复]

    这个问题在这里已经有答案了 我有一些类似 jquery 的函数 function elem return gt someselector elem 问题是我怎样才能做同样的事情querySelector 问题是 gt 选择器中querySe
  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • React Native 无法访问 Cloud Firestore 后端

    我之前使用的是 firebase 实时数据库 但现在想切换到 Cloud Firestore 但即使经过身份验证 也会收到以下错误 我目前正在使用 Android Simulator 尝试禁用我的实时数据库 但找不到解决方案 Firebas
  • 如何从外部模块导出符号?

    我在内核源代码树之外进行编码 有两个模块 第一个printt有一个功能printtty 将字符串打印到当前 tty 以及第二个模块hello这会调用printtty 在初始化期间 我已经添加了EXPORT SYMBOL printtty 在
  • 在动态创建的元素的onclick函数的属性中传递一个字符串

    我试图在动态创建的锚元素的 onClick 事件处理函数的参数中传递一个字符串 请参阅小提琴http jsfiddle net shmdhussain bXYe4 http jsfiddle net shmdhussain bXYe4 我无
  • 为什么“script”命令会生成 ^[ 和 ^M 字符以及如何使用 vim 搜索和替换删除它们?

    在linux上 使用bash shell 当我使用script命令时 生成的文件称为typescript 当我用 vim 打开该文件时 每一行都包含 M字符 并且有几行 由于我的彩色命令提示符 包含一个字符 我想用任何东西替换这些字符 从而
  • 仅从功能区打开一个对话框

    我有一个带有登录按钮的功能区 可打开登录对话框 我想将对话框的数量限制为一个 我正在使用函数 displayDialogAsync startAddress options callback https learn microsoft co
  • 为什么Promise中的代码会同步执行? [复制]

    这个问题在这里已经有答案了 在我的项目中 我有一个很长时间运行的操作 所以我决定将其放入Promise因为我认为这样我就可以在里面的代码继续执行其他操作Promise正在跑步 调试的时候发现外面的代码Promise仅当里面的代码执行Prom
  • document.write 在同一页面上显示内容。

    我对 javascript document write 方法有疑问 大多数情况下 当我使用 document write 时 它会向我显示在不同页面中使用该方法编写的内容 例如 如果我写这样的命令 document write Hello
  • 是否有跨浏览器的方式在Javascript中设置style.float?

    通常 如果您需要在 JavaScript 中设置样式属性 您可以这样说 element style attribute value 虽然略有不同 但属性名称通常与 HTML 属性名称类似 尽管是驼峰式 对我来说问题是 float 属性不起作
  • 有没有办法只安装mysql客户端(Linux)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有不需要安装整个mysql db安装包的Linux mysql命令行工具 我想做的是从服务器 1 应用程序服务器 执行将在服务器 2
  • 为什么浏览器允许onmousedown JS改变href?

    我很长时间以来都注意到 当您尝试复制链接位置或在 Facebook 上打开链接时 它会修改链接并将其传递给l php 例如 我可以被发送到 http www facebook com l php u http 3A 2F 2Fwww goo
  • JS:修改 JS 对象中的值/对

    我正在尝试找出修改对象的最佳方法 而无需三次写出类似的对象 所以我有这三个对象 var object1 start start end end type 1 var object2 start start end end type 2 va
  • VSCODE 在 Linux 上不适用于我

    刚刚了解 VSCODE 很高兴尝试一下 我下载 解压并运行可执行文件 我得到 Code 2183 0429 201254 ERROR browser main loop cc 170 Running without the SUID san
  • 如何捕获文本区域上的 Enter 按键而不是 Shift+Enter? [复制]

    这个问题在这里已经有答案了 I m doing it for texarea A function should be called when the user press Enter but nothing should be done
  • 为什么 proc/ID/maps 有多个共享库条目

    我正在查看嵌入式Linux下的proc ID maps 我注意到一些共享库在进程的内存映射中出现了几次 为什么会这样呢 40094000 400d9000 r xp 00000000 b3 09 723 system lib libc so
  • jQuery appendTo(), json 在 IE 6,7,8 中不起作用

    我这两天绞尽脑汁想找到解决办法 我使用 jQuery ajax 从数据库中获取值 以便在另一个框发生更改时更新一个框 php 脚本从数据库中获取值 然后输出 json 它在 FF 中工作正常 但在所有版本的 IE 中 选择框都不会更新 我已

随机推荐

  • SpringCloud系列-SpringCloudLoadBalancer是如何通过@BalanceLoad使用nacos中的微服务

    前言 SpringCloud作为Spring家族的衍生平 扮演着微服务框架的重要角色 本篇主要涉及到SpringCloud的源代码中 LoadBalance注解是如何生效的 使用的开发环境中 注册中心使用的是nacos 负载均衡使用的是sp
  • nginx负载均衡查看后端服务器信息,命令行检查nginx负载均衡状态

    命令行检查nginx负载均衡状态 内容精选 换一换 负载均衡 LoadBalancer 可以通过弹性负载均衡从公网访问到工作负载 与弹性IP方式相比提供了高可靠的保障 一般用于系统中需要暴露到公网的服务 负载均衡访问方式由公网弹性负载均衡E
  • 利用SSH工具远程连接Ubuntu失败

    利用SSH工具远程连接Ubuntu失败 1 查看ssh服务是否开启 sudo service ssh status active running 这就表名运行正常 如果没有开启 输入下列命令开启 etc init d ssh start 2
  • 九月十月百度,迅雷,华为,阿里巴巴,最新校招笔试面试五十题

    题记 本博客自2010年10月11日开通以来 已经帮助了一大批人找到工作 特别是连续三年在每一年的9 10月份陪伴了至少三届毕业生找工作的旅程 包括校招中的笔试面试 今年也不会例外 我会在本博客开通3周年之际一如既往的陪伴大家一起成长 本文
  • C++ 智能指针

    一 智能指针特点 智能指针封装了裸指针 内部还是裸指针的调用 智能指针使用RAII特点 将对象生命周期使用栈来管理 智能指针区分了所有权 因此使用责任更为清晰 智能指针大量使用操作符重载和函数内联特点 调用成本和裸指针无差别 二 原子操作
  • ARM汇编.global .extern 和.text

    在ARM汇编中 常搞不清 global和 extern的区别 下面就简要阐述一下这两个的区别 1 gt global global关键字用来让一个符号对链接器可见 可以供其他链接对象模块使用 global start 让 start符号成为
  • 成功解决“谷歌浏览器打开是毒霸网址大全”问题,亲测有效(同样适用被hao123,或者2345浏览器篡改)

    最开始一定要把电脑安装的360和电脑管家之类的退出 第一步 发现问题的存在 在谷歌网址中输入 chrome version 再按enter键 如果返回如图 那说明你的谷歌被hao123浏览器篡改了 如果你返回的蓝色部分是www duba等字
  • python做兼职收入_创业点子 小哥用Python兼职月入过万,用Python做项目有多挣钱?...

    今天我想和大家分享一些Python项目两个主兼职工作 老板想说 无论你是自学或者参加培训班 只要你学好Python 钱自然会来 问题 兼职工作和Python可以用来赚钱吗 1兼职费用够杂项费用 生活费用 在学校我碰巧接管一些外包 嗯 足够的
  • 自定义MVC框架优化

    目录 一 前言 二 优化问题 1 子控制器的初始化配置问题 2 页面跳转优化代码冗余问题 3 优化参数封装问题 三 进行优化 1 解决子控制器初始化配置 2 解决页面跳转的代码冗余问题 3 解决优化参数封装问题 4 中央控制器 一 前言 在
  • 爬下artstation关注的画师信息制作为json文件

    原始网站 https www artstation com Author xiaozhu sai 本文章仅供学习交流 请勿交流梯子以及版权问题 1 爬取数据目的 后续处理 方便后续对各个画师作品的个人下载 个人练习 用户关注 的推荐算法与其
  • kali Linux笔记

    第一章 kali Linux简介 1 Linux操作系统的基础知识 Linux 的起源和发展 了解 Linux 操作系统的起源 发展和主要的发行版 如Linux 内核的诞生 GNU项目的贡献以及常见的 Linux 发行版如Ubuntu De
  • 旋转图像(二维数组的旋转)——LeetCode数组算法题

    旋转图像
  • 利用无人机(手机)和Unity3D软件制作自己的VR全景软件

    市面上做全景的网站和公司有很多 这里不列举了 自己百度一下VR和 全景之类的就会跳出很多 一 全景相片制作 1 无人机制作全景相片 1 1大疆无人机全景相片制作 利用软件DJI GO4中一键720全景完成制作 1 2手动制作720全景完成制
  • OBS斗鱼直播弹幕插件效果

    我没有安装任何OBS插件 一样达到了美化版弹幕效果
  • windows10配置远程桌面多用户同时登录

    目录 一 单用户同时登录 二 多用户同时登录 一 单用户同时登录 系统属性 gt 远程 勾选以下选项 运行 gpedit msc 选择 计算机配置 gt 管理模板 gt Windows组件 gt 远程桌面服务 gt 远程桌面会话主机 gt
  • 秒杀系统架构优化思路

    秒杀系统架构优化思路 上周参加Qcon 有个兄弟分享秒杀系统的优化 其观点有些赞同 大部分观点却并不同意 结合自己的经验 谈谈自己的一些看法 一 为什么难 秒杀系统难做的原因 库存只有一份 所有人会在集中的时间读和写这些数据 例如小米手机每
  • logback.xml文件未被加载

    起初 将logback xml放到了src下面 结果运行后发现只能在控制台输出日志 而不能将日志输出到文件中 于是网上搜索 首先将logback xml root标签中的ALL改为OFF 再次运行程序 看是否能够加载logback xml文
  • Katex的markdown常用语法中一些关于Latex数学符号或公式等的笔记

    文章目录 数学符号 设变量时常用的希腊字母 大小关系 分数 开方 同余 一般符号 二项式 符号上下添加额外信息 上标符号 上下标 上下划线 箭头 集合 省略号 矩阵 小括号形式 中括号形式 行列式 带省略号的形式 带横线或竖线分隔的形式 逻
  • CentOS7编译安装Openvswitch 2.3.0 LTS

    1 安装依赖包 yum y install openssl devel wget kernel devel 2 安装开发工具 yum groupinstall Development Tools 3 添加用户 adduser ovswitc
  • c++ sdk框架_鸿蒙系统中的 JS 开发框架

    今天鸿蒙终于发布了 开发者们也终于 沸腾 了 源码托管在国内知名开源平台码云上 https gitee com openharmony 我也第一时间下载了源码 研究了一个晚上 顺带写了一个 hello world 程序 还顺手给鸿蒙文档提了