V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lyxxxh2
V2EX  ›  微信

uniappx 在微信小程序 proxy 替换的 bug,uniappx 你真的垃

  •  
  •   lyxxxh2 · 2025 年 12 月 15 日 · 966 次点击

    bug 解释

    hubilderx 版本:4.87

    https://i.imgur.com/0rbmcyM.png

    1. console.log(good.value.sku_goods) 可以看到:是个数组

    2. UTS.JSON.stringify之后,sku_goods 成为 null


    由于我是后端,不了解前端原理,难道不能这么用?

    于是我让 ai 参考写份 vue3 代码。

    import { ref, watchEffect } from 'vue'
    
    const good = ref({
      id: "1",
      sku_goods: [{
        sku_spec_values: [
          { name: "颜色", value: "红色" }
        ]
      }]
    })
    
    // 创建响应式引用
    const client_classify = ref(good.value.sku_goods)
    
    // 设置 id 为 client_classify 的引用(注意:这是数组引用)
    good.value.id = client_classify.value
    
    // 序列化
    const jsonString = JSON.stringify(good.value)
    console.log('Serialized:', jsonString)
    
    

    没问题啊,sku_goods 是正常了。


    过程

    让 ai 帮我分析,完全是浪费时间。

    最后受不了,在编译后的小程序源码调试,才找到问题。

    uniappx 调试的坑

    完全看不到 AppData 数据。

    见:https://v2ex.com/t/1164720#r_17087022

    调试是必须的,这么重要的功能,2025 了啊!

    6 条回复    2025-12-16 21:36:49 +08:00
    Yuunie
        1
    Yuunie  
       2025 年 12 月 15 日
    小程序就不要用 x ,用 x 主要是为了 App ,他们根本不可能有这么多时间适配每一端的,推出了主要就是为了 App
    Yuunie
        2
    Yuunie  
       2025 年 12 月 15 日
    不过用条件编译应该就解决了
    molvqingtai
        3
    molvqingtai  
       2025 年 12 月 15 日
    大概率是 uni-appx 在序列化 proxy 时的 bug, 在序列化之前,使用 toRow 获取 proxy 的原始值试试

    stringify(toRow(good.value.sku_goods))
    molvqingtai
        4
    molvqingtai  
       2025 年 12 月 15 日
    fix typo: toRow -> toRaw
    lyxxxh2
        5
    lyxxxh2  
    OP
       2025 年 12 月 16 日
    @molvqingtai
    确实是 proxy,刚用代码试了。
    ```
    <script setup lang="uts">
    import { ref, toRaw } from 'vue'

    // 定义类型( uts 是强类型语言,需要类型定义)
    interface SkuSpecValue {
    name: string
    value: string
    }

    interface SkuGood {
    sku_spec_values: SkuSpecValue[]
    }

    interface GoodType {
    id: string | Array<any> // 注意:id 可能变为数组引用
    sku_goods: SkuGood[]
    }

    // 创建响应式引用
    const good = ref<GoodType>({
    id: "1",
    sku_goods: [{
    sku_spec_values: [
    { name: "颜色", value: "红色" }
    ]
    }]
    })

    // 创建响应式引用 - 注意:这里直接引用 good.value.sku_goods
    const client_classify = ref(good.value.sku_goods)

    // 设置 id 为 client_classify 的引用
    good.value.id = client_classify.value

    // 序列化
    const jsonString = JSON.stringify(good.value)
    console.log('Serialized:', jsonString)


    // 以下是修复
    // 批量转换为原始对象 来自:deepseek
    function convertAllToRaw(obj) {
    if (Array.isArray(obj)) {
    return obj.map(item => {
    if (item && typeof item === 'object') {
    return convertAllToRaw(toRaw(item))
    }
    return item
    })
    } else if (obj && typeof obj === 'object') {
    const result = {}
    for (const key in obj) {
    const value = obj[key]
    if (value && typeof value === 'object') {
    result[key] = convertAllToRaw(toRaw(value))
    } else {
    result[key] = value
    }
    }
    return result
    }
    return obj
    }

    const jsonStringFix = JSON.stringify(
    convertAllToRaw(good.value)
    )
    console.log("fixed",jsonStringFix)
    </script>
    ```


    自己封装个 JSON.stringify 函数来修复就行。
    lyxxxh2
        6
    lyxxxh2  
    OP
       2025 年 12 月 16 日
    已经放弃 uniappx 。
    原生或者 mpx,我选择了 mpx,体验还不错。
    1. 安装自带 eslint
    - uniappx 根本没有 eslint,最近的一个官方 eslint 还是 2022 年更新的
    - 最后还是在 github 找到了个 eslint,虽然能用,但是又不是针对 uts 的

    2. appdata 不会乱码了。
    我想 mpx 应该更稳定,专注小程序端。

    uniappx 步子夸太大了,专为解决 app 性能而生吧。
    然后又没足够精力去维护小程序,调试工具都没有。

    在小程序开发完成,编译到 andorid 全是报错。
    js 大量操作,在 kotlin 根本用不了。
    按照文档的来强制写,应该可以。
    建议出个 eslint 之类的,可以禁止 uts 使用 js 。
    不然兼容的修改,够喝一壶了。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5560 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 03:41 · PVG 11:41 · LAX 19:41 · JFK 22:41
    ♥ Do have faith in what you're doing.