uniapp 提供了一种运行于视图层的专属js,微信叫做wxs

news2024/11/18 18:25:26

小程序里有几个谜一样的存在,微信的WXS、支付宝的SJS、百度的Filter。

很多开发者都不明白为什么要造这种语言脚本的轮子出来,甚至很多开发者根本不知道它们的存在。

其实几大小程序平台创造它们,都是为了解决性能问题,但不得不吐槽下,设计的实在是很难用,文档也语焉不详。

uni-app支持将WXSSJSFilter编译到这3家小程序平台,同时还在App和H5实现了WXS的解析。为什么做这些事?也是为了性能。

uni-ui库新版中的swiperaction组件,就是列表项向左滑动时拉出几个挤压式联动的菜单按钮,这种流畅的跟手动画,正是借助于WXS机制实现的。

微信为何要创造WXS

WXS(WeiXin Script)是微信创造的一套脚本语言,它的官方说法是:“WXS 与 JavaScript 是不同的语言,有自己的语法,并不和 JavaScript 一致”。

那微信为何要脱离 JavaScript ,单独创造一套语言呢?这要从微信小程序的底层逻辑(运行环境)讲起。

小程序的运行环境分为逻辑层和视图层,分别由2个线程管理,其中:

  • WXML 模板和 WXSS 样式工作在视图层,界面使用 WebView 进行渲染
  • JavaScript代码工作在逻辑层,运行在JsCore或v8里

小程序在视图层与逻辑层两个线程间提供了数据传输和事件系统。这样的分离设计,带来了显而易见的好处:

  • 逻辑和视图分离,即使业务逻辑计算非常繁忙,也不会阻塞渲染和用户在视图层上的交互

但同时也带来了明显的坏处:

  • 视图层(webview)中不能运行JS,而逻辑层JS又无法直接修改页面DOM,数据更新及事件系统只能靠线程间通讯,但跨线程通信的成本极高,特别是需要频繁通信的场景

什么是需要频繁通讯的场景?最典型的例子就是用户持续交互的情况,比如触摸、滚动等。我们以侧滑菜单为例,假设在页面上滑动A元素,要求B元素跟随移动,一次滑动操作(touchmove)的响应过程如下:

  1. touchmove 事件从视图层(Webview)传递到逻辑层,中间会由微信客户端(Native)做中转

2.逻辑层处理 touchmove 事件,计算需移动的位置,然后再通过 setData 传递到视图层,中间同样会由微信客户端(Native)做中转

 

一次 touchmove 的响应需要经过 视图层、Native、逻辑层三者之间2个完整来回的通信,通信的耗时开销较大,用户的交互就会出现延时卡顿的情况。

除了滚动、拖动交互外,在for循环里对数据做格式修改,也会造成逻辑层和视图层频繁通讯。

其实这类通信损耗问题,在业内由来已久,react native和weex都有类似问题,weex提供了bindingx来解决。

但对于小程序来讲,这类问题解决起来更容易。其实视图层的webview,是有js环境的,只不过过去不给开发者开放。

如果在视图层的js直接处理滚动或拖动交互、直接处理数据格式,就能避免大量通信损耗。

但对于小程序平台而言,大量开放webview里的js编写,违反了它的初衷,比如开发者会直接操作dom,影响性能体验。所以小程序平台提出一种新规范,限制webview里可运行的js的能力。这就是wxs、sjs、filter的由来。

从本质来讲,wxs、sjs、filter是一种被限制过的、运行在视图层webview里的js。它并不是真的发明了一种新语言。

WXS特征及适用场景

WXS具备如下特征:

  • WXS是可以在视图层(webview)中运行的JS
  • WXS无法修改业务数据,仅能设置当前组件的classstyle
  • WXS是被限制过的JavaScript,可以进行一些简单的逻辑运算
  • WXS可以监听touch事件,处理滚动、拖动交互

故可以得出WXS的适用场景,主要包括:

  • 用户交互频繁、仅需改动组件样式(比如布局位置),无需改动数据内容的场景,比如侧滑菜单、索引列表、滚动渐变等
  • 纯粹的逻辑计算,比如文本、日期格式化,通过WXS可以模拟实现Vue框架的过滤器,如下是一个通过wxs便捷实现首字母大写的示例:
<wxs module="m1">
  //首字母大写
  var capitalize = function(value) {
    if (!value) return ''
    value = value.toString()
    return value.charAt(0).toUpperCase() + value.slice(1)
  }
  module.exports = {
    capitalize: capitalize
  }
</wxs>
<view class="content">
  <view class="text-area">
    <!-- title 为当前页面 data 中定义的初始数据 -->
    <text class="title">{{m1.capitalize(title)}}</text>
  </view>
</view>

uni-app如何支持WXS

uni-app遵循Vue单文件组件(SFC)规范,组件/样式/脚本是写在一个.vue文件中的,但微信小程序是多文件分离(wxml/wxss/js/json)的,所以在微信端的主要工作是扩展vue-template-compiler,解析template/style/script节点,并正确生成到对应的wxml/wxss/js文件中,具体编译工作如下图:

Tips-1:关于<wxs>标签重构为<script lang="wxs">的说明:

.vue文件中的<wxs>标签及内嵌WXS代码,在主流前端开发工具(vscode/HBuilderX等)中,均无法实现语法提示、代码高亮及格式化,故uni-app<wxs module="m1">重构为<script module="m1" lang="wxs">,便捷实现了语法提示、代码高亮等,如下为vscode/HBuilderX中对于<wxs>标签重构前后的代码高亮对比,明显重构为<script lang="wxs">后,开发体验更佳:

 

Tips-2:鉴于Vue的自定义标签规范,我们建议将<wxs><script lang="wxs">)和template平级编写

编译器的具体解析扩展工作,这里不详述,仅给出wxs生成的示例代码,让大家有个直观理解:

createFilterTag (filterTag, {
    content,
    attrs
  }) {
    content = content.trim()
    if (content) { //<wxs>标签内直接编写 wxs 代码
      return `<${filterTag} module="${attrs.module}">
        ${content}
        </${filterTag}>`
    } else if (attrs.src) { //外联 .wxs 文件
      return `<${filterTag} src="${attrs.src}" module="${attrs.module}"></${filterTag}>`
    }
  }

在保证编译正确的情况下,微信小程序运行时会正确解析并执行WXS脚本,框架runtime无需干预。

基于 WXS 提升性能体验的实现示例

下面的gif图是借助 WXS 实现的一个swipeaction示例,列表项向左滑动时拉出几个挤压式联动的菜单按钮,跟手动画、回弹动画都很自然流畅。

 该示例的完整源码参考github 

更多平台的兼容性

uni-app的App端也是一个小程序引擎,所以想要在App端实现流畅的跟手拖动,也需要实现类似wxs的机制。

其实H5平台倒不存在逻辑层和视图层通讯折损的问题,但为了平台兼容性拉齐,uni-app在H5端也实现了wxs机制。

这样编写wxs代码,在uni-app中可同时运行在App端、H5端、微信小程序端。

因百度小程序的Filter过滤器、支付宝小程序的SJS和微信小程序的WXS在语法上差异较大,uni-app只支持单独编写百度小程序的Filter过滤器和支付宝小程序的SJS,这两种脚本无法跨多端,仅支持自有平台。开发者若需使用,可分别编写wxs/filter/sjs脚本,然后依次通过script引用,uni-app编译器会根据目标平台,分别编译发行,如下为示例代码:

示例代码要有条件编译

<!-- App/H5/微信小程序平台调用wxs脚本 -->
<script module="utils" lang="wxs" src="./utils.wxs"></script>
<!-- 百度小程序平台调用filter.js脚本 -->
<script module="utils" lang="filter" src="./utils.filter.js"></script>
<!-- 支付宝小程序平台调用sjs脚本 -->
<script module="utils" lang="sjs" src="./utils.sjs"></script>

后续

用运行在视图层的js解决通讯阻塞,可能很多人都没意识到。希望本文能给大家解惑,解开WXS之谜。

其实小程序的性能体验优化,仍然有大量空间。DCloud团队在这个领域研究了6年,清楚当前的优势,也清楚当前的问题。

本文涉及的uni-uiswiperaction组件,代码开源在https://github.com/dcloudio/uni-ui,uni-app框架代码开源在 https://github.com/dcloudio/uni-app,

 

 

 

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

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

相关文章

Spring Boot中配置默认的HikariCP数据源

在了解HiKari之前&#xff0c;我们需要先了解关于数据访问的相关概念&#xff1a; 什么是JDBC JDBC&#xff08;Java Database Connectivity&#xff09;是Java编程语言用于与数据库进行交互的标准API。它提供了一组类和接口&#xff0c;用于执行数据库操作&#xff0c;如连接…

six是6,seven是7,“at sixes and sevens”可不是6、7点钟的意思!柯桥商务英语学校

暴露年纪的时候到了。 你有没有听过一首风靡全球的经典英文歌曲 ——Don’t Cry For Me Argentina 其中一段歌词是这样的&#xff1a; It wont be easy. Youll think it strange 我细诉心底话&#xff0c;大家都会惊讶 When I try to explain how I feel. That I still ne…

reese84

网址:https://beta.makeabooking.flyscoot.com/ 这个基本上会在航空网站上出现&#xff0c;国内的我也没见过&#xff0c;然后这个是我很早很早之前的老友分享的&#xff0c;然后昨天花时间去看了一下&#xff0c;之前经常听其他大佬说&#xff0c;但是我也出来没遇见过。 感觉…

14技术太卷我学APEX-RESTful服务全自动Autorest

Oracle REST 数据服务 (ORDS) 的 AutoREST 功能&#xff0c;该功能允许您将表和视图等自动公开为 RESTful Web 服务。这个太好可不用自己费劲巴拉的定义RESTful数据服务了。 1 先准备测试数据表 登录APEX现在开发平台 [https://apex.oracle.com/pls/apex/r/apex/workspace-si…

无线渗透|Wi-Fi渗透思路

对于WPA2 WPA3的一些渗透思路 0x00 进行渗透时需知晓的基础知识 1.WPA2:是WPA的升级版&#xff0c;是针对保护无线网络安全而设计的无线网络保护系统&#xff0c;引入了PSK&#xff08;预共享密钥模式&#xff09;秘钥&#xff0c;加强了WPA的不足之处&#xff0c;但是因为使…

day45

今日内容 标签的分类 1.单标签 imr br hr <img /> 2.双标签 a h p div <a> </a> 3.按照标签属性分类 &#xff08;1&#xff09;块儿标签 &#xff08;自己独占一行&#xff09; h1-h6 p div &#xff08;2&#xff09;行内(内联)标签 &a…

探求flutter全栈开发

显示一种网络图片 import package:flutter/material.dart; main(){runApp(MaterialApp(theme: ThemeData.dark(),home:Home(),));}class Home extends StatelessWidget{overrideWidget build(BuildContext context) {// TODO: implement buildreturn Scaffold(appBar:AppBar(t…

H5随机短视频滑动版带打赏源码V1.3

全新H5滑动屏幕观看&#xff0c;可封装APP软件或嵌入式观看&#xff0c;网站引流必备源码&#xff01; 数据来源抖音和快手官方短视频链接&#xff0c;无任何违规内容&#xff01; 可自行添加广告等等&#xff01; 手机端完美支持滑动屏幕观看&#xff08;向上或向右&#x…

隔离模块CC10-2405SF-E,嵌入式(MCU) STM32F207IGT7、SPC5742PK1AMLQ9R规格参数

一、CC10-2405SF-E 1.3至10W DC-DC转换器 CC系列DC-DC转换器具有高密度&#xff0c;输出电压为3.3V、5V、12V和15VDC&#xff0c;额定输出功率为3W至30W。CC模块采用通孔或SMT封装&#xff0c;带或不带屏蔽金属外壳。这些器件适用于-40C至85C的扩展温度范围应用&#xff0c;具…

一文浅析Instagram网红经济为什么远远超出其他社媒平台

根据数据显示&#xff0c;网红营销市场规模在短短五年时间内从2016年的17亿美元增长至2022年的164亿美元&#xff0c;累计增速超过了712%。未来&#xff0c;有专家预计该市场预计将进一步增长&#xff0c;将在2023年突破210亿美元。这种惊人的增长趋势源于社交媒体的快速发展以…

Django实战项目-学习任务系统-定时任务管理

接着上期代码框架&#xff0c;开发第4个功能&#xff0c;定时任务管理&#xff0c;再增加一个学习定时任务表&#xff0c;主要用来设置周期重复性的学习任务&#xff0c;定时周期&#xff0c;定时时间&#xff0c;任务标题和内容&#xff0c;预计完成天数&#xff0c;奖励积分和…

PythonWEB

文章目录 前端简介1. 什么是网页2. 网页的组成3. 网页的优势4. 前端三剑客5. 编写步骤6. HTTP协议 HTML51. HTML介绍2. 元素3. 使用4. 基本结构解析5. 常用标签文本标签容器标签列表标签表格标签表单标签 对于文件数据的提交需要满足以下两个条件&#xff1a;6. 标签分类 前端简…

基于SpringBoot的体育馆管理系统

目录 前言 一、技术栈 二、系统功能介绍 管理员功能介绍 商品列表 场地信息管理 场地类型管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff…

精益制造的工具与方法有什么区别?ECRS工时分析软件的功能和价值

精益制造是一套价值创造系统&#xff0c;它强调在生产过程中减少浪费、提高效率和质量&#xff0c;从而实现持续改进和优化。在精益制造的理念下&#xff0c;企业需要运用一系列的工具和方法来提升生产管理水平。这些工具和方法不仅包括传统的精益工具&#xff0c;如5S、持续改…

Java自学者怎么写简历?

Java自学者怎么写简历&#xff1f; 首先&#xff0c;有技术实力的人绝对不会问这个问题。虽然你是自学的&#xff0c;但是一定要有项目&#xff01;没有项目都是空谈。最近很多小伙伴找我&#xff0c;说想要一些Java资料&#xff0c;然后我根据自己从业十年经验&#xff0c;熬夜…

使用 Sealos 一键部署 Kubernetes 集群

Sealos 是一款以 Kubernetes 为内核的云操作系统发行版&#xff0c;使用户能够像使用个人电脑一样简单地使用云。 与此同时&#xff0c;Sealos 还提供一套强大的工具&#xff0c;可以便利地管理整个 Kubernetes 集群的生命周期。 Sealos 不仅可以一键安装一个单节点的 Kubern…

设计模式(21)中介者模式

一、介绍&#xff1a; 1、定义&#xff1a;中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过引入一个中介者对象来降低多个对象之间的耦合度。在中介者模式中&#xff0c;各个对象之间不直接进行通信&#xff0c;而是通过中介者对象…

Nginx 实战指南:暴露出请求的真实 IP

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

跑腿小程序开发解析:技术架构、接口设计和前沿趋势

随着生活节奏的加快和个人需求的增加&#xff0c;跑腿小程序成为了人们生活中不可或缺的一部分。从技术角度来看&#xff0c;一个高效、安全、以及用户友好的跑腿小程序是由多个关键要素构成的&#xff0c;包括技术架构、接口设计和前沿趋势。 技术架构 1. 前端技术选型 选择…

Windows Server 2016磁盘管理使用指南:看完即会!

如何打开Windows Server 2016磁盘管理器&#xff1f; 磁盘管理首先在Windows XP中引入&#xff0c;是一个Windows内置实用程序&#xff0c;可让你管理硬盘和关联的分区或卷。在Windows Server磁盘管理对硬盘进行分区非常方便。你可以通过以下方法之一访问它&#xff1a; 方…