前言
上回说到,用`C++`来写`UI`界面的开发效率不如`JS+HTML`来的高,但设备开发又免不了要通过内核态来操作硬件,这里我们就要先打通从`JS框架`到设备驱动之间的联系。本章基于`HDF驱动`和`JS+CSS+HTML`的技术上进行,相关内容可以回顾`用鸿蒙开发AI应用(五)HDF 驱动补光灯`和`用鸿蒙开发AI应用(六)UI篇`这两篇。
JS应用开发框架原理
在第六篇里,我们已经体验了一下使用JS
开发界面的流程,这里简单分析ace
的实现原理。
![](https://i-blog.csdnimg.cn/blog_migrate/d155af93edd91bd92e6161d327b78d21.png)
先看框架图,类小程序的Web应用先编译成js bundle
包,通过JS Data binding
来获取对象映射。其中Observer
实现了一个极简的MVVC模型,用于将DOM
上的对象分为4种类型(render、data、styleSheet、function),采用数据劫持机制分别挂载到观察者的原型函数上,并转化到C++
函数执行。
查看源码就会发现,JS
的部分是极简的,JS 引擎采用了JerryScript
,每一个标签对应了一个C++
的Component
类。绝大部分功能实际都由C++
实现,包括事件注册和触发,页面路由,控件的更新,超时,文件操作,命令行输出等等... 所有API的100%对接不禁让我想起了一个动画片。
进入C++
领域后就方便很多了,此时的ACE
仍处于用户态,用HDF
上的消息机制就能触达内核,无非是再包装一层API的套娃操作。
内置模块
这里有一系列@system.xxx
的模块提供了访问APP、Router、Audio、Sensor等等的设备能力。ohos_module_config.h
定义了JS框架
中模块的别名到模块初始化函数的对应关系。其中app
,dfx
,router
模块是必有的。
// Config information for built-in JS modules of OHOS platform
const Module OHOS_MODULES[] = {
#ifdef ENABLE_MODULE_REQUIRE_TEST
{"sample", InitSampleModule},
#endif
{"app", InitAppModule},
#ifdef FEATURE_MODULE_AUDIO
{"audio", InitAudioModule},
#endif // FEATURE_MODULE_AUDIO
{"dfx&#