广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何让小程序支持JSX语法
  • 591
分享到

如何让小程序支持JSX语法

2024-04-02 19:04:59 591人浏览 泡泡鱼
摘要

今天小编给大家分享一下如何让小程序支持jsX语法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下

今天小编给大家分享一下如何让小程序支持jsX语法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

现有思路的局限

在介绍新的思路之前,我们先来看下Taro(最新版1.3),nanachi是怎么在小程序端处理JSX语法的。简单来说,主要是通过在编译阶段把JSX转化为等效的小程序wxml来把React代码运行在小程序端的。

举个例子,比如React逻辑表达式:

xx && <Text>Hello</Text>

将会被转化为等效的小程序wx:if指令:

<Text wx:if="{{xx}}">Hello</Text>

这种方式把对JSX的处理,主要放在了编译阶段,他依赖于编译阶段的信息收集,以上面为例,它必须识别出逻辑表达式,然后做对应的wx:if转换处理。

那编译阶段有什么问题和局限呢?我们以下面的例子说明:

class App extends React.Component {

    render () {

        const a = <Text>Hello</Text>

        const b = a

        return (

            <View>

                {b}

            </View>

        )

    }

}

首先我们声明 const a = <Text>Hello</Text>,然后把a赋值给了b,我们看下最新版本Taro 1.3的转换,如下图:

这个例子不是特别复杂,却报错了。

要想理解上面的代码为什么报错,我们首先要理解编译阶段。本质上来说在编译阶段,代码其实就是&lsquo;字符串&rsquo;,而编译阶段处理方案,就需要从这个&lsquo;字符串&rsquo;中分析出必要的信息(通过AST,正则等方式)然后做对应的等效转换处理。

而对于上面的例子,需要做什么等效处理呢?需要我们在编译阶段分析出b是JSX片段:b = a = <Text>Hello</Text>,然后把<View>{b}</View>中的{b}等效替换为<Text>Hello</Text>。然而在编译阶段要想确定b的值是很困难的,有人说可以往前追溯来确定b的值,也不是不可以,但是考虑一下 由于b = a,那么就先要确定a的值,这个a的值怎么确定呢?需要在b可以访问到的作用域链中确定a,然而a可能又是由其他变量赋值而来,循环往复,期间一旦出现不是简单赋值的情况,比如函数调用,三元判断等运行时信息,追溯就宣告失败,要是a本身就是挂在全局对象上的变量,追溯就更加无从谈起。

所以在编译阶段 是无法简单确定b的值的。

我们再仔细看下上图的报错信息:a is not defined。

为什么说a未定义呢?这是涉及到另外一个问题,我们知道<Text>Hello</Text>,其实等效于React.createElement(Text, null, 'Hello'),而React.createElement方法的返回值就是一个普通JS对象,形如

// ReactElement对象

{

   tag: Text,

   props: null,

   children: 'Hello'

   ...

}

所以上面那一段代码在JS环境真正运行的时候,大概等效如下:

class App extends React.Component {

    render () {

        const a = {

            tag: Text,

            props: null,

            children: 'Hello'

            ...

        }

        const b = a

        return {

            tag: View,

            props: null,

            children: b

            ...

        }

    }

}

但是,我们刚说了编译阶段需要对JSX做等效处理,需要把JSX转换为wxml,所以<Text>Hello</Text>这个JSX片段被特殊处理了,a不再是一个普通js对象,这里我们看到a变量甚至丢失了,这里暴露了一个很严重的问题:代码语义被破坏了,也就是说由于编译时方案对JSX的特殊处理,真正运行在小程序上的代码语义并不是你的预期。这个是比较头疼。

新的思路

正因为编译时方案,有如上的限制,在使用的时候常常让你有“我还是在写React吗?”这种感觉。

下面我们介绍一种全新的处理思路,这种思路在小程序运行期间和真正的React几无区别,不会改变任何代码语义,JSX表达式只会被处理为React.createElement方法调用,实际运行的时候就是普通js对象,最终通过其他方式渲染出小程序视图。下面我们仔细说明一下这个思路的具体内容。

第一步:给每个独立的JSX片段打上唯一标识uuid,假定我们有如下代码:

const a = <Text uuid="000001">Hello</Text>

const y = <View uuid="000002">

    <Image/>

    <Text/>

</View>

我们给a片段,y片段 添加了uuid属性

第二步:把React代码通过babel转义为小程序可以识别的代码,例如JSX片段用等效的React.createElement替换等

const a = React.createElement(Text, {

  uuid: "000001"

}, "Hello");

第三步:提取每个独立的JSX片段,用小程序template包裹,生成wxml文件

<template name="000001">

    <Text>Hello</Text>

</template>

<template name="000002">

    <View uuid="000002">

        <Image/>

        <Text/>

    </View>

</template>

<!--占位template-->

<template is="{{uiDes.name}}" data="{{...uiDes}}"/>

注意这里每一个template 的name标识和 JSX片段的唯一标识uuid是一样的。最后,需要在结尾生成一个占位模版:<template is="{{uiDes.name}}" data="{{...uiDes}}"/>。

第四步:修改ReactDOM.render的递归(React 16.x之后,不在是递归的方式)过程,递归执行阶段,聚合JSX片段的uuid属性,生成并返回uiDes数据结构

第五步:把第四步生成的uiDes,传递给小程序环境,小程序把uiDes 设置给占位模版<template is="{{uiDes.name}}" data="{{...uiDes}}"/>,渲染出最终的视图。

我们以上面的App组件的例子来说明整个过程,首先js代码会被转义为:

class App extends React.Component {

    render () {

        const a = React.createElement(Text, {uuid: "000001"}, "Hello");

        const b = a

        return (

          React.createElement(View, {uuid: "000002"} , b);

        )

      }

}

同时生成wxml文件:

<template name="000001">

    <Text>Hello</Text>

</template>

<template name="000002">

    <View>

        <template is="{{child0001.name}}" data="{{...child0001}}"/>

    </View>

</template>

<!--占位template-->

<template is="{{uiDes.name}}" data="{{...uiDes}}"/>

使用我们定制之后render执行ReactDOM.render(<App/>, parent)。在render的递归过程中,除了会执行常规的创建组件实例,执行生命周期之外,还会额外的收集执行过程中组件的uuid标识,最终生成 uiDes 对象

const uiDes = {

    name: "000002",

    child0001: {

        name: 000001,

        ...

   }

   ...

}

小程序获取到这个uiDes,设置给占位模版<template is="{{uiDes.name}}" data="{{...uiDes}}"/>。 最终渲染出小程序视图。

在这整个过程中,你的所有JS代码都是运行在React过程中的,语义完全一致,JSX片段也不会被任何特殊处理,只是简单的React.createElement调用,另外由于这里的React过程只是纯js运算,执行是非常迅速的,通常只有几ms。最终会输出一个uiDes数据到小程序,小程序通过这个uiDes渲染出视图。

现在我们在看之前的赋值const b = a,就不会有任何问题了,因为a 不过是普通对象。另外对于常见的编译时方案的限制,比如任意函数返回JSX片段,动态生成JSX片段,for循环使用JSX片段等等,都可以完全解除了,因为JSX片段只是js对象,你可以做任何操作,最终ReactDOM.render会搜集所有执行结果的片段的uuid标识,生成uiDes,而小程序会根据这个uiDes数据结构渲染出最终视图。

可以看出这种新的思路和以前编译时方案还是有很大的区别的,对JSX片段的处理是动态的,你可以在任何地方,任何函数出现任何JSX片段, 最终执行结果会确定渲染哪一个片段,只有执行结果的片段的uuid会被写入uiDes。这和编译时方案的静态识别有着本质的区别。

以上就是“如何让小程序支持JSX语法”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网JavaScript频道。

--结束END--

本文标题: 如何让小程序支持JSX语法

本文链接: https://www.lsjlt.com/news/94338.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何让小程序支持JSX语法
    今天小编给大家分享一下如何让小程序支持JSX语法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2022-10-19
  • 如何让微信小程序支持cookie的方式
    这篇文章主要讲解了“如何让微信小程序支持cookie的方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何让微信小程序支持cookie的方式”吧!Intro微信原生的 wx.request...
    99+
    2023-06-26
  • 微信小程序如何支持npm
    这篇文章主要介绍了微信小程序如何支持npm,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。npm 支持从小程序基础库版本 2.2.1 或以上、...
    99+
    2022-10-19
  • 如何突破canvas语法限制让他支持链式语法
    这篇文章给大家分享的是有关如何突破canvas语法限制让他支持链式语法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 先来看一段正常的canvas画...
    99+
    2022-10-19
  • 如何让ASP应用程序支持异步编程?
    ASP是一种常用的Web应用程序框架,它在Web开发领域中具有广泛的应用。但是,在处理大量数据或执行复杂操作时,ASP应用程序可能会遇到性能瓶颈。为了解决这个问题,我们可以使用异步编程技术来提高ASP应用程序的性能。本文将介绍如何让ASP应...
    99+
    2023-11-13
    数组 ide 异步编程
  • 小程序支持text换行如何做
    这篇文章主要介绍了小程序支持text换行如何做的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇小程序支持text换行如何做文章都会有所收获,下面我们一起来看看吧。  // text.js  var text_fu...
    99+
    2023-06-26
  • 小程序如何实现rich-text对富文本支持
    这篇文章给大家分享的是有关小程序如何实现rich-text对富文本支持的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。小程序富文本解析目前小程序使用比较多的富文本方案一个是小程序自...
    99+
    2022-10-19
  • 聊天素材支持小程序打开如何使用
    本篇内容介绍了“聊天素材支持小程序打开如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  功能介绍  微信聊天内素材(图片、视频和we...
    99+
    2023-06-26
  • 微信小程序如何实现支持ES6中Promise特性
    小编给大家分享一下微信小程序如何实现支持ES6中Promise特性,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!遇到的问题微信开发者工具更新版本后, 移除了开发者工具对 ES6 中 Pro...
    99+
    2022-10-19
  • Fundebug如何支持监控微信小程序HTTP请求错误
    这篇文章主要介绍了Fundebug如何支持监控微信小程序HTTP请求错误,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。接入插件接入Funde...
    99+
    2022-10-19
  • vscode不支持es6语法如何解决
    这篇文章主要讲解了“vscode不支持es6语法如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vscode不支持es6语法如何解决”吧! ...
    99+
    2022-10-19
  • idea中es6语法不支持如何解决
    这篇文章主要介绍“idea中es6语法不支持如何解决”,在日常操作中,相信很多人在idea中es6语法不支持如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”idea中e...
    99+
    2022-10-19
  • 【微信小程序】web-view 无法打开该页面不支持打开
    本文相关文献: https://developers.weixin.qq.com/community/develop/doc/00084a350b426099ab46e0e1a50004%2Fbl...
    99+
    2023-08-31
    javascript
  • 如何理解编程语言的IDE支持
    本篇内容主要讲解“如何理解编程语言的IDE支持”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解编程语言的IDE支持”吧!语法分析对于开发工具来说,语法分析有几个重要的功能:语法高亮,是指根...
    99+
    2023-06-16
  • 如何使用kbone解决Vue项目同时支持小程序问题
    这篇文章主要为大家展示了“如何使用kbone解决Vue项目同时支持小程序问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用kbone解决Vue项目同时支...
    99+
    2022-10-19
  • 微信小程序如何实现wxml文件和wxss文件支持webstrom
    这篇文章主要介绍微信小程序如何实现wxml文件和wxss文件支持webstrom,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!ebstrom默认不支持wxml文件和wxss文件,所以...
    99+
    2022-10-19
  • vscode不支持nvue语法高亮如何解决
    本篇内容介绍了“vscode不支持nvue语法高亮如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题描述例如:vscode中使用*....
    99+
    2023-07-05
  • windows安装程序包的语言不受系统支持如何解决
    这篇文章主要介绍“windows安装程序包的语言不受系统支持如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“windows安装程序包的语言不受系统支持如何解决”文章能帮助大家解决问题。解决方法...
    99+
    2023-07-01
  • win10安装程序包的语言不受系统支持如何解决
    这篇文章主要介绍了win10安装程序包的语言不受系统支持如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win10安装程序包的语言不受系统支持如何解决文章都会有所收获,下面我们一起来看看吧。解决方法打开此...
    99+
    2023-06-30
  • 微信小程序如何实现实时聊天并支持图片预览
    这篇文章给大家分享的是有关微信小程序如何实现实时聊天并支持图片预览的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先看一下界面,界面很简单,就是首页刚进来获取了用户信息头像,昵称...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作