被 UNIAPP 折磨的一天。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Danswerme
V2EX    分享发现

被 UNIAPP 折磨的一天。

  •  
  •   Danswerme 2022-01-16 11:51:22 +08:00 2770 次点击
    这是一个创建于 1368 天前的主题,其中的信息可能已经有所发展或是发生改变。

    高度

    用 UNIAPP + Vue3 开发 App ,开发环境下真机和模拟器上一切正常,然而正式打包之后部分安卓手机上scroll-view高度失效,尝试了各种方法修复无果。

    我写了个简单的含有scroll-view组件的 DEMO ,分别用 Vue2 和 Vue3 的方式打包了一次, 发现使用 Vue2 时没有任何问题,用 Vue3 打包时就出现这个问题了,无奈打算降回 Vue2 。

    <view class="full-height flex-column"> <slot name="top" /> <view class="scroll-container" style="flex: 1; position: relative;"> <scroll-view scroll-y class="abs-full"> <slot /> </scroll-view> </view> </view> 

    CSS 变量

    正打算降级,突然发现 iOS 上切换页面时Tabbar高度会上下闪烁一下,百思不得其解。最后发现是safe-area-inset-bottom CSS 变量的问题,页面切换时它的值会突然变为 0 ,加载完成后又变回原来的值,而Tabbar组件里为了兼容底部安全区,使用了padding-bottom: calc(var(--safe-area-bottom) + 16rpx)这种方式计算padding

    page { --safe-area-bottom: constant(safe-area-inset-bottom); --safe-area-bottom: env(safe-area-inset-bottom); } .tabbar { padding-bottom: calc(var(--safe-area-bottom) + 16rpx); } 

    在 HbuilderX 上个版本里这个 CSS 变量是直接无效为 0 ,当时我是在应用启动时获取了底部安全区的高度,然后把高度写入 style 提供给Tabbar组件。前几天看官方说修复了,这才几天过去又出了这种幺蛾子问题?官方说修复好的时候我切换回了使用safe-area-inset-bottom变量的方式,现在又不得不切换回去。

    组件加载

    修好页面闪烁的问题,花了一天时间吭哧吭哧的把所有的代码从 Vue3 降级回到了 Vue2 。 切换完之后开始调试,首先是全局组件全部找不到; 我是将所有的全局组件列为一个数组,并使用Vue.component(name, component)的方式进行加载。

    看了一下文档,说是 UNIAPP 为了编译到多平台,使用了静态分析代码,不支持动态加载组件,建议使用他们的easycom方式进行组件注册。那为什么之前 Vue3 我用这种方式就可以动态加载呢?

    好吧,那就使用easycom进行注册,按照他们的配置要求开启了easycom,并配置了匹配components文件夹内组件的正则表达式。配置完成后重新编译,提示我找不到文件@/components/slot/index.vue,绝了,这是把slot也当组件给我解析了?得,我手动全部引用一遍吧。

    "easycom": { "autoscan": true, "custom": { "(.*)": "@/components/$1/index.vue" } } 

    搜了下,20 年 3 月就有这个问题,现在还没修?https://ask.dcloud.net.cn/question/91597

    NVUE

    这个 App 里有视频播放的页面,所以用了 UNIAPP 的nvue来开发。首先发现布局全部炸了,分析了一遍之后发现是flex全部从columnrow了。 按照 UNIAPP 文档的说法,nvue里所有的元素默认都是flex元素,且flex方向默认都是column。可以在manifest.json配置文件里修改flex默认的方向。

    之前用 Vue3 写的时候,为了和平时开发保持一致,我在配置文件里设置里默认方向为row,然而并没有生效。我就按照默认flex-direction: column的方式来开发了。 切换回 Vue2 之后,这个配置文件又生效了,当然布局就炸了。

    修好布局,发现进入nvue页面后总是提示没有登录。这个项目里 api 请求是封装过的,在请求前会从 store 里检查登录状态并从中获取 token 。console.log看了一下,只要是nvue页面调用的 api ,获取 store 里的状态永远是初始值。 看了下文档,哦,nvue页面不支持直接引入 store 使用,只能用$store或者辅助函数,这是连引入的api都影响到了? 行吧,的确是我的锅,没有认真看文档,那为啥Vue3下面又正常呢?

    Mock 失效

    Vue3开发时,我使用了better-mock,一切正常。到了Vue2,Mock 失效了,劫持不到请求。无奈只能在公用的 HTTP 请求工具里动手脚,根据请求 url 手动执行 Mock 返回数据。

    import Mock from "better-mock/dist/mock.mp.esm"; 

    无法形容的 BUG

    之前使用Vue3开发时,nvue页面如果调用了含有store的 API ,页面就白屏了,猜测是尚未适配Vue3的 store 。于是我把nvue页面用到的几个接口单独import一个文件里并export出去,在App.vue页面里将这几个接口挂载到globalData上供nvue页面使用,在使用Vue3时一切正常。

    切换到Vue2之后,store可以正常调用了,也就不用在App.vue里进行中转了。这时候我发现Mock里有几个接口失效了,排查一番后发现Mockapi接口文件里引入的 HTTP 请求路径为undefined

    这些 HTTP 请求路径都是const定义的常量字符串,不存在被重写的可能。而且在别的文件里引用都正常,我有些怀疑人生了。 我重启系统并重装了HbuilderX,因为之前也有类似的奇奇怪怪的问题重装HbuilderX之后就正常了。

    然而这次并没有生效,我都打算关电脑睡觉了,突然发现Mock引入 HTTP 请求路径之后爆undefinedapi文件都是之前用Vue3时在中转文件里曾经引入过的api文件。可是现在使用了Vue2之后根本就没用到这个中转文件,只是在App.vue里引入了一下。

    我去App.vue里注释掉引入后就不爆undefined了,这是什么魔幻问题???

    // api/user.js import http from "@/utils/http"; export const GET_USERINFO_PATH = "/user/info"; export const getUserInfo = () => http.get(GET_USERINFO_PATH); 
    // bus/nvue.js import { getUserInfo } from "@/api/user.js" export default { getUserInfo }; 
    // mock/config.js import Mock from "better-mock/dist/mock.mp.esm"; import { GET_USERINFO_PATH } from "@/api/user.js" console.log(GET_USERINFO_PATH); // 只要`App.vue`里引入上面那个文件,这里就变成`undefined`了,为啥? 
    // App.vue import nvue from "@/bus/nvue.js"; // 只要引入了这一行,Mock 里就爆`undefined` 
    10 条回复    2022-06-25 21:54:20 +08:00
    Danswerme
        1
    Danswerme  
    OP
       2022-01-16 12:15:31 +08:00
    我疯了都,刚想说删了`App.vue`里面引入的文件就好了,现在别的文件又开始爆`undefined`了?你凭啥爆这个啊?

    wukongkong
        2
    wukongkong  
       2022-01-16 12:15:35 +08:00 via Android
    Vue3 开发,不考虑低版本手机吗
    Danswerme
        3
    Danswerme  
    OP
       2022-01-16 12:20:13 +08:00
    @wukongkong 写着玩的,不是公司的,再说了可以用 X5 内核垫底。
    uclort
        4
    uclort  
       2022-01-16 13:01:57 +08:00 via iPhone
    试着降级 hbuilderx 版本,他们的 ide 不同版本也会造成不同的问题。
    exploreexe
        5
    exploreexe  
       2022-01-16 15:32:03 +08:00
    曾经被折磨过,千万别用 uniapp 搞 APP 折磨自己
    EdwinHui
        6
    EdwinHui  
       2022-06-25 21:05:46 +08:00
    搞不懂,为什么要用 hbuilder 开发来折磨自己呢?用 vscode 不好吗?
    Danswerme
        7
    Danswerme  
    OP
       2022-06-25 21:07:42 +08:00
    @EdwinHui 接手的 UNIAPP 项目只能用 Hbuilder 来编译运行
    EdwinHui
        8
    EdwinHui  
       2022-06-25 21:20:18 +08:00
    @Danswerme 遇到 uniapp 项目我都是转成 cli 模式,用 vscode 上 eslint+prettier ,volar 什么的,就更不用说了。用 eslint 规范代码后,那些莫名其妙的问题就少了很多。暂时用 vue3 开发,仅遇到一个 v-model 会报 undefined 的问题。不过看到这个博客后将它的 emit 改为写在 computed 里就没问题了。
    EdwinHui
        9
    EdwinHui  
       2022-06-25 21:20:37 +08:00
    Danswerme
        10
    Danswerme  
    OP
       2022-06-25 21:54:20 +08:00
    @EdwinHui 好的非常感谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3056 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 00:31 PVG 08:31 LAX 17:31 JFK 20:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86