如何给APP开发属于自己的小程序

前言

  工欲善其事,必先利其器

  首先,我们需要知道微信小程序是什么?微信小程序内核是什么?微信小程序的开发语言什么?这样才能更好的开发微信小程序,以及解决遇到的问题。

一、微信小程序是什么

微信小程序是一个依托于微信,微信提供一个接口运行浏览器内核上的一个程序。

  微信小程序是一个小程序可以有很多页面,每个页面承载不同的功能,页面之间可以互相跳转。小程序分为渲染层和逻辑层,渲染层中包含了多个 WebView,每个 WebView 对应到我们的小程序里就是一个页面 Page,每一个页面都独立运行在一个页面层级上。它也可以做得很丰富,就像native app一样,可以调用原生的各种接口,像网络状态、罗盘,重力,拨打电话等

二、微信小程序内核是什么

微信小程序的编译内核环境根据不同平台而不同。

  • 在 iOS 上,小程序的 javascript 代码是运行在 JavaScriptCore 中
  • 在 Android 上,小程序的 javascript 代码是通过 X5 内核来解析
  • 在 开发工具上, 小程序的 javascript 代码是运行在 nwjs(chrome内核) 中

JavaScriptCore

JavaScriptCores是开源的,下载地址:https://github.com/phoboslab/JavaScriptCore-iOS

OS X Mavericks 和 iOS 7 引入了 JavaScriptCore 库,它把 WebKit 的 JavaScript 引擎用 Objective-C 封装,提供了简单,快速以及安全的方式接入世界上最流行的语言。不管你爱它还是恨它,JavaScript 的普遍存在使得程序员、工具以及融合到 OS X 和 iOS 里这样超快的虚拟机中资源的使用都大幅增长。(参考iOS官方文档:https://developer.apple.com/documentation/javascriptcore?language=objc)

X5 内核

唯一一个属于国人开发,大鹅厂自己的浏览器解析内核

nwjs

原名:node-webkit 当然也是开源的:https://github.com/nwjs/nw.js/

nw.js 是基于 Chromium和 Node.js运行的, 以前也叫nodeWebkit。这就给了你使用HTML和JavaScript来制作桌面应用的可能。在应用里你可以直接调用Node.js的各种api以及现有的第三方包。因为Chromium和 Node.js的跨平台,那么你的应用也是可以跨平台的。现在已经有很多知名的应用是基于NW.js实现,

三、微信小程序的开发语言是什么

1.微信小程序的开发

  微信小程序使用了前端技术栈 JavaScript/WXML/WXSS

  • JavaScript: 微信小程序的 JavaScript 运行环境即不是 Browser 也不是 Node.js。它运行在微信 App 的上下文中,不能操作 Browser context 下的 DOM,也不能通过 Node.js 相关接口访问操作系统 API。所以,严格意义来讲,微信小程序并不是 Html5,虽然开发过程和用到的技术栈和 Html5 是相通的。
  • WXML: 作为微信小程序的展示层,并不是使用 Html,而是自己发明的基于 XML 语法的描述。
  • WXSS: 用来修饰展示层的样式。官方的描述是 “ WXSS (WeiXin Style Sheets) 是一套样式语言,用于描述 WXML 的组件样式。WXSS 用来决定 WXML 的组件应该怎么显示。” “我们的 WXSS 具有 CSS 大部分特性...我们对 CSS 进行了扩充以及修改。”基于 CSS2 还是 CSS3?大部分是哪些部分?是否支持 CSS3 里的动画?不得而知。

四、微信小程序

1.小程序与普通网页开发的区别

小程序的主要开发语言是 JavaScript ,所以通常小程序的开发会被用来同普通的网页开发来做对比。两者有很大的相似性,对于前端开发者而言,从网页开发迁移到小程序的开发成本并不高,但是二者还是有些许区别的。

网页开发渲染线程和脚本线程是互斥的,这也是为什么长时间的脚本运行可能会导致页面失去响应,而在小程序中,二者是分开的,分别运行在不同的线程中。网页开发者可以使用到各种浏览器暴露出来的 DOM API,进行 DOM 选中和操作。而如上文所述,小程序的逻辑层和渲染层是分开的,逻辑层运行在 JSCore 中,并没有一个完整浏览器对象,因而缺少相关的DOM API和BOM API。这一区别导致了前端开发非常熟悉的一些库,例如 jQuery、 Zepto 等,在小程序中是无法运行的。同时 JSCore 的环境同 NodeJS 环境也是不尽相同,所以一些 NPM 的包在小程序中也是无法运行的

网页开发者需要面对的环境是各式各样的浏览器,PC 端需要面对 IE、Chrome、QQ浏览器等,在移动端需要面对Safari、Chrome以及 iOS、Android 系统中的各式 WebView 。而小程序开发过程中需要面对的是两大操作系统 iOS 和 Android 的微信客户端,以及用于辅助开发的小程序开发者工具,小程序中三大运行环境也是有所区别的.如表1-1所示。

<center>表1-1 小程序的运行环境</center>

运行环境逻辑层渲染层
iOSJavaScriptCoreWKWebView
安卓X5 JSCoreX5浏览器
小程序开发者工具NWJSChrome WebView

2.WebView

WebView的运行流程和一些弊端。

流程:
打开一个 WebView 通常会经历以下几个阶段:

  • 交互无反馈
  • 到达新的页面,页面白屏
  • 页面基本框架出现,但是没有数据;页面处于 loading 状态
  • 出现所需的数据

WebView 启动过程大概分为以下几个阶段:

WebView启动过程

存在的问题:
在加载WebView页面时,时常出现白屏现象:

加载WebView出现白屏


除了白屏,影响 Web 体验的问题还有缺少操作的反馈,主要表现在两个方面:页面切换的生硬和点击的迟滞感。

3.微信小程序

1)通信模型

小程序的渲染层和逻辑层分别由2个线程管理:渲染层的界面使用了WebView 进行渲染;逻辑层采用JsCore线程运行JS脚本。一个小程序存在多个界面,所以渲染层存在多个WebView线程,这两个线程的通信会经由微信客户端(下文中也会采用Native来代指微信客户端)做中转,逻辑层发送网络请求也经由Native转发,小程序的通信模型如下图所示。

渲染过程

这就是小程序双线程模型的由来:

  • 逻辑层:创建一个单独的线程去执行 JavaScript,在这个环境下执行的都是有关小程序业务逻辑的代码
  • 渲染层:界面渲染相关的任务全都在 WebView 线程里执行,通过逻辑层代码去控制渲染哪些界面。一个小程序存在多个界面,所以渲染层存在多个 WebView 线程.

2)双线程下的界面渲染

小程序的逻辑层和渲染层是分开的两个线程。在渲染层,宿主环境会把WXML转化成对应的JS对象,在逻辑层发生数据变更的时候,我们需要通过宿主环境提供的setData方法把数据从逻辑层传递到渲染层,再经过对比前后差异,把差异应用在原来的Dom树上,渲染出正确的UI界面,如下图所示。

界面渲染

小程序的渲染的整体流程:

  • 1.在渲染层把 WXML 转化成对应的 JS 对象。
  • 2.在逻辑层发生数据变更的时候,通过宿主环境提供的 setData 方法把数据从逻辑层传递到 Native,再转发到渲染层。
  • 3.经过对比前后差异,把差异应用在原来的 DOM 树上,更新界面。

总之,小程序通过双线程的方式解决WebView存在的各种问题,让小程序更加想Native的体验。

任何程序错误,以及技术疑问或需要解答的,请添加

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xamarin开发笔记—WebView双项事件调用

1.Xamarin调用WebView&#xff1a; 原理&#xff1a;Xamarin.Forms WebView内置方法xx.Eval(..)可以调用到页面里面的js函数。 WebView展示的代码如下&#xff1a; var htmlSource new HtmlWebViewSource();htmlSource.Html "<html><head><meta charse…

数据仓库入门(实验10)在Excel中查询层次结构

一、连接到SSAS二、导入数据三、选择数值、行标签、列标签1. 选择数值2. 选择行标签3. 选择列标签四、过滤五、完成转载于:https://blog.51cto.com/jimshu/1339522

MFC中CString类字符串用法小结

一、 赋值运算 二、 比较运算 注意&#xff1a;如果s1小于s2;则z等于-1&#xff1b;如果s1大于s2;则z等于1&#xff1b;如果s1等于s2;则z等于0&#xff1b; 三、 删除函数 四、 插入函数 五、 计算字符总个数函数 更加详细内容参考VS2010 MSDN

设置 Google Analytics(分析)全局网站统计代码

设置 Google Analytics&#xff08;分析&#xff09;全局网站统计代码 本文包含的主题&#xff1a; 基本说明根据您的网站类型设置数据收集验证您的全局网站代码是否正常工作相关资源 基本说明 无论您要从哪些网站收集数据&#xff0c;如果您尚未为每个目标网站分别创建 Goog…

Xamarin开发笔记—百度在线语音合成

续《是时候开始用C#快速开发移动应用了》刷屏之后&#xff0c;把C#开发移动应用的技术 > Xamarin&#xff0c;在这里和大家做一个分享&#xff01; 语音合成&#xff1a;也被称为文本转换技术&#xff08;TTS&#xff09;&#xff0c;它是将计算机自己产生的、或外部输入的…

《Oracle comment on注释信息方法论》

更多精彩内容尽在leonarding.blog.51cto.com《Oracle comment on注释信息方法论》引言&#xff1a;在DBA日常工作中写注释信息可能会经常有&#xff0c;但用Oracle命令来写和使用我想应该不是很多&#xff0c;其实Oracle给我们提供了非常丰富的语言表述语法&#xff0c;而我们日…

利用MFC按钮使能(或禁用)属性使按钮变正常色(或灰色)

利用MFC按钮使能&#xff08;或禁用&#xff09;属性使按钮变正常色&#xff08;或灰色&#xff09; GetDlgItem(IDC_XXX)->EnableWindow(FALSE)//IDC_XXX为你想变灰的按钮的ID 利用你找到的handle&#xff0c;或者窗体&#xff08;按钮也是一个窗体&#xff09;指针&#…

js处理16进制hex转str出现的中文乱码问题

昨天從FB下載了一份包含所有對話紀錄的JSON檔&#xff0c;但裡面的中文字編碼有問題&#xff0c;通通變成下面這個樣子 "\u00e7\u0094\u009f\u00e6\u0097\u00a5"本來想說這種事情應該很簡單&#xff0c;就把他每個字元當成char轉存不就得了&#xff0c;結果轉出來的東…

CentOS 6.2 本地安装YUM

一般学习linux的同学都是先学习的Red hat吧&#xff0c;小编也是如此&#xff0c;但是在生产环境中&#xff0c;大多数企业用的是基于redhat 内核的 centos &#xff0c;小编最近在接触centos时&#xff0c;就发现了不少问题&#xff0c;今天先从本地YUM说起。 redhat配置本地Y…

MFC设置对话框背景色及控件颜色

MFC设置对话框背景色及控件颜色 一、使用背景图片更改对话框背景色 在对话框源文件void CxxDlg::OnPaint()函数中 if (IsIconic()) { (这里省略) } else { CDialogEx::OnPaint(); } else里面添加下列代码&#xff1a; 效果如下图所示&#xff1a; 二、使用颜色更改对话…

Stacked Hourglass Networks 人体姿态检测

本文是人体关键点中非常经典的一篇文章&#xff1a;Stacked Hourglass Networks for Human Pose Estimation 论文地址&#xff1a; https://arxiv.org/abs/1603.06937​arxiv.org 代码地址&#xff1a; wbenbihi/hourglasstensorlfow​github.com​编辑 论文框图&#xff1…

Xamarin开发笔记—设备类amp;第三方弹窗的使用和注意事项

一、设备类是Xamarin重要开发组成部分&#xff0c;下面介绍一下设备类的主要用法&#xff1a; //唤醒打电话Device.OpenUri(new Uri("tel:180xxxxxxxx"));//打开网页Device.OpenUri(new Uri("http://vipstone.cnblogs.com/"));//判断当前运行平台Device.Ru…

Windows Azure 安全最佳实践 - 第 4 部分:需要采取的其他措施

那么&#xff0c;哪些安全威胁应由WindowsAzure环境缓解&#xff1f;哪些安全威胁必须由开发人员缓解&#xff1f; 开发 Windows Azure 应用程序的最佳安全做法一文说明了对于在 Windows Azure 中运行的应用程序而言&#xff0c;什么样的威胁应被视为主要威胁。它还专门说明了 …

逻辑性最强的React Native环境搭建与调试

ReactNative系列文章&#xff1a; 1.《逻辑性最强的React Native环境搭建与调试》 2.《ReactNative开发工具有这一篇足矣》 正文 React Native&#xff08;以下简称RN&#xff09;&#xff0c;已经“火”了好一段时间了&#xff0c;网上的资料相对也很丰富&#xff0c;只是一…

自绘热点按钮

自绘热点按钮 一、1.在VS2010中新建MFC对话框工程&#xff0c;命名“Test”。 2.删除对话框上所有控件&#xff0c;然后在对话框上添加一个按钮&#xff0c;一个组合框&#xff0c;一个编辑框&#xff0c;更改按钮ID为IDC_TRANSFORM_BTN&#xff0c;更改编辑框ID为IDC_EDIT2。…

YOLOv5在建筑工地中安全帽佩戴检测的应用(已开源+数据集)

前言 Amusi 发现一个很棒的开源项目&#xff0c;利用YOLOv5进行目标检测的"落地化"应用&#xff1a;安全帽佩戴检测。 该项目使用了YOLOv5s、YOLOv5m、YOLOv5l来训练安全帽佩戴检测数据集&#xff0c;代码和权重均已开源&#xff01;安全帽佩戴检测数据集也是开源的…

centos上安装adobe flash

1、下载adobe yum源rpm包并安装rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-x86_64-1.0-1.noarch.rpmrpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux2、通过yum命令安装adobe flashyum install flash-plugin nspluginwrapper alsa-plugins-…

linux运行可执行文件,通过c语言调用java的main方法

前言&#xff1a;以前一直在做Android开发&#xff0c;在某本书上看过一句话“Android上面不只有App类的程序可以运行&#xff0c;能在linux下运行的程序&#xff0c;也可以在Android上面运行” 一.编写C语言部分代码 1.定义java.h头文件 #include <jni.h>#ifndef _JAV…

MFC串口通信设置及发送、中断接收程序

前一段做了个串口通信小软件&#xff0c;就是现实利用上位机软件通过串口通信对下位机&#xff08;单片机&#xff09;通信&#xff0c;校时LED点阵万年历&#xff0c;省去按键调节的麻烦&#xff0c;方便校时&#xff0c;省时省力。 为右击 串口通信控件&#xff0c;添加关联…

ReactNative开发工具有这一篇足矣

ReactNative系列文章&#xff1a; 1.《逻辑性最强的React Native环境搭建与调试》 2.《ReactNative开发工具有这一篇足矣》 正文 React Native&#xff08;以下简称RN&#xff09;开发工具的文章很多&#xff0c;几乎千篇一律都是Copy的&#xff08;一毛一样&#xff09;&a…