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

2025 年 12 月 15 日
 lyxxxh2

bug 解释

hubilderx 版本:4.87

  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 了啊!

1746 次点击
所在节点    微信
6 条回复
Yuunie
2025 年 12 月 15 日
小程序就不要用 x ,用 x 主要是为了 App ,他们根本不可能有这么多时间适配每一端的,推出了主要就是为了 App
Yuunie
2025 年 12 月 15 日
不过用条件编译应该就解决了
molvqingtai
2025 年 12 月 15 日
大概率是 uni-appx 在序列化 proxy 时的 bug, 在序列化之前,使用 toRow 获取 proxy 的原始值试试

stringify(toRow(good.value.sku_goods))
molvqingtai
2025 年 12 月 15 日
fix typo: toRow -> toRaw
lyxxxh2
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
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 。
不然兼容的修改,够喝一壶了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1179073

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX