深入了解-微信开发者工具

这篇具有很好参考价值的文章主要介绍了深入了解-微信开发者工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主要介绍微信开发者工具如何编译小程序代码,如何实现小程序模拟器以及如何调试小程序。

1 简介

虽然在开发语言层面小程序与传统的网页差别不大:是使用JavaScript 脚本语言编写逻辑代码、使用类似于HTML的WXML来描述页面的结构、使用类似于CSS的WXSS来描述节点的样式,但是由于小程序渲染和逻辑分离的运行机制与传统的网页存在差异,所以无法使用传统的网页的开发调试工具,因此我们使用小程序开发生态一站式IDE——微信开发者工具。开发者可以借助微信开发者工具完成小程序的代码开发、编译运行、界面和逻辑调试、真机预览和提交发布版本等功能。

微信开发者工具,微信小程序入门,javascript,前端,开发语言,微信小程序,微信开发者工具

图1 微信开发者工具

微信开发者工具是一个基于nw.js ,使用node.js、chromium以及系统API来实现底层模块,使用React、Redux等前端技术框架来搭建用户交互层,实现同一套代码跨Mac和Windows 平台使用。

微信开发者工具,微信小程序入门,javascript,前端,开发语言,微信小程序,微信开发者工具

图2 微信开发者工具底层框架


2 代码编译

微信开发者工具和微信客户端都无法直接运行小程序的源码,因此我们需要对小程序的源码进行编译。代码编译过程包括本地预处理本地编译和服务器编译。为了快速预览,微信开发者工具模拟器运行的代码只经过本地预处理、本地编译,没有服务器编译过程,而微信客户端运行的代码是额外经过服务器编译的。

 

1 编译WXML 

WXML(WeiXin Markup Language)是小程序框架设计的一套标签语言,用于构建出页面的结构。小程序的渲染层的运行环境是一个WebView,而WebView无法直接理解WXML标签,所以需要经过编译。
微信开发者工具内置了一个二进制的WXML编译器,这个编译器接受WXML代码文件列表,处理完成之后输出JavaScript代码,这段代码是各个页面的结构生成函数

微信开发者工具,微信小程序入门,javascript,前端,开发语言,微信小程序,微信开发者工具

图3 WXML的编译过程

编译过程将所有的WXML代码最终变成一个JavaScript 函数,预先注入在WebView中。在运行时确定了页面路径之后,将路径作为参数传递给这个函数得到该页面的结构生成函数,页面结构生成函数接受页面数据,输出一段描述页面结构的JSON,最终通过小程序组件系统生成对应的HTML

代码清单1 如何使用页面结构生成函数

//$gwx 是WXML编译后得到的函数
//根据页面路径获取页面结构生成函数
var generateFun = $gwx('name.wxml')
//页面结构生成函数接受页面数据,得到描述页面结构的JSON
var virtualTree = generateFun({
   name:  'miniprogram'
})
/** virtualTree == {
   tag: 'view',
   children: [{
       tag: 'view',
       children: ['miniprogram']
     }]
 }**/
 //小程序组件系统在虚拟树对比后将结果渲染到页面上
 virtualDom.render(virtualTree)

上传代码时,微信开发者工具直接将本地的WXML代码文件提交到后台,由后台进行WXML编译,后台的WXML编译器和开发者工具本地内置的WXML编译器是同一套代码生成的。

2 编译WXSS

WXSS (WeiXin Style Sheets) 是一套样式语言,用来决定 WXML 的组件应该怎么显示。为了适应广大的前端开发者,WXSS 具有 CSS 大部分特性。同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改。与 CSS 相比,WXSS 扩展的一些特性,包括rpx尺寸单位和样式导入语法,这些特性都是WebView无法直接理解的。
微信开发者工具内置了一个二进制的WXSS编译器,这个编译器接受WXSS文件列表,分析文件之间的引用关系,同时预处理rpx,输出一个样式信息数组,如图4,每个WXSS文件对应于这个数组中的一项。

微信开发者工具,微信小程序入门,javascript,前端,开发语言,微信小程序,微信开发者工具

图4 WXSS的编译过程

在运行时,根据当前的屏幕宽度,计算出1rpx对应多少像素单位,然后将样式信息数组转换成最终的样式添加到页面中。
由于样式在微信客户端存在兼容性问题,为了方便开发者,微信开发者工具提供了上传代码时样式自动补全的功能,利用PostCSS 对WXSS文件进行预处理,自动添加样式前缀。

3 编译JavaScript

微信客户端在运行小程序的逻辑层的时候只需要加载一个JS文件(我们称为app-service.js),而小程序框架允许开发者将 JavaScript 代码写在不同的文件中,所以在代码上传之前,微信开发者工具会对开发者的JS 文件做一些预处理,包括ES6转ES5和代码压缩(开发者可以选择关闭预处理操作),在服务器编译过程将每个JS文件的内容分别包裹在define域中,再按一定的顺序合并成 app-service.js 。其中对于页面JS和app.js需要主动require。

微信开发者工具,微信小程序入门,javascript,前端,开发语言,微信小程序,微信开发者工具

微信开发者工具,微信小程序入门,javascript,前端,开发语言,微信小程序,微信开发者工具

图5 JavaScript的编译过程


3.模拟器

小程序模拟器模拟小程序在微信客户端的逻辑和界面表现,方便开发者实时查看代码效果。由于系统差异以及微信客户端特有的一些交互流程,少部分的API无法在模拟器上进行模拟,但对于绝大部分的 API 均能够在模拟器上呈现出正确的状态。同时微信开发者工具提供多种机型尺寸以及自定义机型尺寸功能,方便开发者进行界面样式的机型适配。

微信开发者工具,微信小程序入门,javascript,前端,开发语言,微信小程序,微信开发者工具

图6 小程序模拟器

2 逻辑层模拟

在iOS微信客户端上,小程序的JavaScript代码是运行在JavaScriptCore中,在Android微信客户端上,小程序的JavaScript代码是通过 X5 JSCore来解析的。而在微信开发者工具上我们采用了一个隐藏着的Webivew来模拟小程序的逻辑运行环境

微信开发者工具,微信小程序入门,javascript,前端,开发语言,微信小程序,微信开发者工具

图7 微信客户端小程序运行环境模型简图

微信开发者工具,微信小程序入门,javascript,前端,开发语言,微信小程序,微信开发者工具

图8 微信开发者工具小程序运行环境模型简图

在微信开发者工具上WebView是一个chrome的 <webview /> 标签。与<iframe />标签不同的是,<webview/>标签是采用独立的线程运行的。
用于模拟小程序逻辑层的<webview/> 加载的链接是

http://127.0.0.1:9973/appservice/appservice

我们在开发者工具底层搭建了一个本地HTTP服务器来处理小程序模拟器的网络请求。其中:

./__asdebug/asdebug.js: 是开发者工具注入的脚本。

./__dev__/WAService.js:是小程序逻辑层基础库。

./util.js、./app.js、./index.js:开发者JS代码。

WebView在请求开发者JS代码时,开发者工具读取JS代码进行必要的预处理后,将处理结果返回,然后由WebView解析执行。虽然开发者工具上是没有对JS代码进行合并的,但是还是按照相同的加载顺序进行解析执行

微信开发者工具,微信小程序入门,javascript,前端,开发语言,微信小程序,微信开发者工具

图9 appservice内容

WebView是一个浏览器环境,而JsCore是一个单纯的脚本解析器,浏览器中的BOM对象无法在JSCore中使用,开发者工具做了一个很巧妙的工作,将开发者的代码包裹在define域的时候,将浏览器的BOM对象局部变量化,从而使得在开发阶段就能发现问题。

微信开发者工具,微信小程序入门,javascript,前端,开发语言,微信小程序,微信开发者工具

图10 BOM对象局部变量化

3 渲染层模拟

微信开发者工具使用chrome的 <webview />标签来加载渲染层页面,每个渲染层WebView加载

http://127.0.0.1:9973/pageframe/pageframe.html

开发者工具底层搭建的HTTP本地服务器在收到这个请求的时候,就会编译WXML文件和WXSS文件,然后将编译结果作为HTTP请求的返回包。当确定加载页面的路径之后,如index页面,开发工具会动态注入如下一段脚本:

// 改变当前webview 的路径,确保之后的图片网络请求能得到正确的相对路径

history.pushState('', '', 'pageframe/index')

// 创建自定义事件,将页面结构生成函数派发出去,由小程序渲染层基础库处理

document.dispatchEvent(new CustomEvent("generateFuncReady", {

   detail: {

     generateFunc: $gwx('./index.wxml')

   }

}))

// 注入对应页面的样式,这段函数由WXSS编译器生成

setCssToHead()

4 客户端模拟

微信客户端为丰富小程序的功能提供了大量的API。在微信开发者工具上,通过借助BOM(浏览器对象模型)以及node.js访问系统资源的能力,同时模拟客户端的UI和交互流程,使得大部分的API能够正常执行。
借助BOM,如wx.request使用XMLHttpRequest 模拟、wx.connectSocket 使用 WebSocket、wx.startRecord 使用MediaRecorder、wx.playBackgroundAudio 使用 <audio/>标签;
借助node.js,如使用fs实现wx.saveFile、wx.setStorage、wx.chooseImage等API功能。
借助模拟UI和交互流程,实现wx.navigateTo、wx.showToast、wx.openSetting、wx.addCard等。

5 通讯模拟

上文已经叙述了小程序的逻辑层、渲染层以及客户端在微信开发者工具上的模拟实现,除此之外,我们需要一个有效的通讯方案使得小程序的逻辑层、渲染层和客户端之间进行数据交流,才能将这三个部分串联成为一个有机的整体。
微信开发者工具的有一个消息中心底层模块维持着一个WebSocket服务器,小程序的逻辑层的WebView和渲染层页面的WebView通过WebSocket与开发者工具底层建立长连,使用WebSocket的protocol字段来区分Socket的来源。
代码清单2 逻辑层中的消息模块文章来源地址https://www.toymoban.com/news/detail-849153.html

// <webview/>的userAgent是可定制的
// 通过userAgent中获取开发者工具WebSocket服务器监听的端口
var port = window.navigator.userAgent.match(/port\/(\d*)/)[1]
// 通过指定 protocol == 'APPSERVICE' 告知开发者工具这个链接是来自逻辑层
var ws = new WebSocket(`ws://127.0.0.1:${port}`, 'APPSERVICE')
ws.onmessage = (evt) => {
  let msg = JSON.parse(evt.data)
  // …处理来自开发者工具的信息
   }
// 调用API接口 wx.navigateBack
ws.send(JSON.stringify({
  command: 'APPSERVICE_INVOKE',
  data: {
     api: 'navigateBack',
     args: {}
  }
}))

到了这里,关于深入了解-微信开发者工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【微信小程序】--注册小程序账号&安装开发者工具(一)

    💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘   大家好,又见面了,

    2024年01月17日
    浏览(114)
  • 【微信小程序】微信Web开发者工具下载及安装

    🏆今日学习目标:微信Web开发者工具下载及安装 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰预计时间:25分钟 🎉专栏系列:微信小程序开发 什么是微信小程序? 小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者

    2024年02月09日
    浏览(86)
  • 快速上手微信小程序(纯原生)基于微信开发者工具+云开发

    最近开发一个小程序。因为体量实在不大,两张表,几个接口。便打算写原生的代码。没有使用uniapp等框架。记录一下一个小程序从搭建到审核发布的那些坑和经验做为学习笔记。 几个网站请收藏 你的小程序需要开发工具: 保姆级传送门 你的小程序需要一个身份证: 微信公

    2024年02月10日
    浏览(85)
  • 微信小程序实现简单的点击切换功能(微信开发者工具)

    📚文章目录 🔗首先创建一个简单的切换按钮📋 如图下  📋wxml代码  📋wxss代码 🔗但是这个元素是无法点击的,所以要添加一个点击事件到这两个元素里面  📋js代码(在page({})里面添加) 📋wxml代码  🔗class使用三元表达式来继续点击判断  🔗使用bindtap绑定事件  事件的

    2024年02月09日
    浏览(210)
  • 【HbuilderX+微信小程序开发者工具解决报错问题】

    一定要正确的配置运行终端 包括 浏览器 、 小程序 安装路径等,还包括小程序的appid,并且要和申请的帐号匹配的登录才能正常的运行 进入微信公众平台https://mp.weixin.qq.com/登录 扫码确认 点击 首页-》配置服务-》开发设置 ,查询appId 如下图 问题描述 [微信小程序开发者工具

    2024年02月09日
    浏览(71)
  • 微信小程序 ---在Vscode上编辑,微信开发者工具上预览,快速上手

    成功 导入一个已经在开发中项目 设置高亮 拷贝到 settings.json 重启 vscode 打开 wxml 文件 观察 有没有高亮 安装小程序开发插件 全局配置 app.json pages 字段 只能在微信开发者工具中 编辑 pages字段,按下保存 才生效!!! pages 快速创建页面的时候 在里面创建即可 作用 : 快速创

    2024年02月01日
    浏览(83)
  • HBuilder X运行微信小程序项目至微信开发者工具失败

    在HBuilder X中运行微信小程序项目时,此步于以下过程,无法进一步打开界面   解决方案: 导入项目即可,但是需要注意导入项目的路径信息。 需要是当前项目unpackage==dist==dev==mp-weixin下面的文件,微信开发者工具才能识别。    

    2024年02月11日
    浏览(71)
  • 微信小程序开发者工具真机调试和预览连接本地服务器

    网上参考了很多方法只有这个方法能解决本地服务器在微信开发者工具预览或者真机调试的连接,话不多说看图。 win+R,CMD输入ipconfig查看本地电脑服务器地址 微信开发者工具里设置代理 js代码的地址对应IPv4 地址 最后你的wifi网络要和手机上的网络一致,不然真机调试或者预

    2024年02月11日
    浏览(103)
  • 创建一个微信小程序——如何注册账号,安装微信开发者工具,创建一个小程序(详细步骤版)

    注册地址 注册地址:微信公众平台 注册 右上角——【立即注册】。 选择【小程序】。 按照步骤完成注册。 按照步骤激活邮箱后,在信息登记这里选择个人。 填写相关信息。 完成注册。 这一步可以先保留,后续在创建小程序时会用到AppID——点击【前往小程序】,复制A

    2024年02月06日
    浏览(85)
  • Uni-app运用HBuilderX和微信web开发者工具做微信小程序

    目录 Uni-app、HBuilderX和微信web开发者工具的介绍 使用HBuilderX时需配置的工具 通过HBuilderX构建项目  配置微信开发者工具 通过HBuilderX将项目运行到微信小程序中  Uni-app中常用的组件及方法 扩展组件的使用方法 结语 Uni-app的介绍: uni-app是一个使用vue.js开发所有前端应用的框架

    2024年02月16日
    浏览(102)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包