uni-app 新版本(3.4.9之后)pages.json使用媒体查询报错 但老版本(3.4.9之前)正常运行
uni-app 新版本(3.4.9之后)pages.json使用媒体查询报错 但老版本(3.4.9之前)正常运行
操作步骤:
- 使用新版本 如 3.0.0-alpha-3041320220527003,在pages.json中使用媒体查询。
预期结果:
- 正常运行
实际结果:
- 报错,页面空白
bug描述:
- pages.json中按图一正常使用媒体查询时, 老版本能正常运行 如: 3.0.0-alpha-3040920220506001 但新版本却运行报错 如: 3.0.0-alpha-3041320220527003
- 新版本报错见图二
- 我目前临时修改了uniapp的源码,修改完后暂时可以使用,修改部分见图三。
- 但我看之前源码这部分都是一样的,也能正常运行,应该是其他部分更新后导致报错了。
- 希望官方能尽快排查修复下哦
HBuilderX alpha 3.4.13+ 已修复
在 uni-app 的新版本(3.4.9 之后)中,pages.json
中使用媒体查询(@media
)可能会报错,而在老版本(3.4.9 之前)中却可以正常运行。这可能是由于 uni-app 在新版本中对 pages.json
的解析逻辑进行了调整,导致不再支持某些语法或功能。
可能的原因
- 语法支持变化:新版本可能对
pages.json
的解析更加严格,不再支持某些非标准的语法或功能。 - 媒体查询的兼容性:
pages.json
本身并不是为 CSS 设计的,因此在新版本中可能移除了对媒体查询的支持。 - 配置项调整:新版本可能对
pages.json
的配置项进行了调整,导致某些功能不再适用。
解决方案
-
检查官方文档:首先,查看 uni-app 的官方文档,确认
pages.json
在新版本中是否仍然支持媒体查询。如果官方文档中没有明确说明,可以尝试在社区或 GitHub 上寻找相关讨论。 -
使用条件编译:如果媒体查询的目的是为了在不同平台或设备上应用不同的样式或配置,可以考虑使用 uni-app 的条件编译功能。例如:
{ "pages": [ { "path": "pages/index/index", "style": { "navigationBarTitleText": "首页", // 条件编译示例 #ifdef H5 "backgroundColor": "#ffffff", #endif #ifdef MP-WEIXIN "backgroundColor": "#f0f0f0", #endif } } ] }
-
使用动态样式:如果需要在不同设备上应用不同的样式,可以在页面或组件的
style
标签中使用动态样式,结合 JavaScript 判断设备类型或屏幕宽度来动态设置样式。 -
降级版本:如果新版本的改动对你的项目影响较大,且暂时无法找到合适的解决方案,可以考虑暂时降级到老版本(3.4.9 之前)继续开发,同时关注 uni-app 的更新动态,等待官方修复或提供替代方案。
-
反馈问题:如果你认为这是一个 bug 或功能缺失,可以向 uni-app 官方反馈问题,提供详细的复现步骤和代码示例,帮助官方更好地理解和解决问题。
示例代码
假设你在 pages.json
中使用了媒体查询:
{
"pages": [
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "首页",
"@media (max-width: 600px)": {
"backgroundColor": "#f0f0f0"
}
}
}
]
}
在新版本中,这种写法可能会报错。你可以尝试使用条件编译或动态样式来替代:
{
"pages": [
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "首页",
#ifdef H5
"backgroundColor": "#ffffff",
#endif
#ifdef MP-WEIXIN
"backgroundColor": "#f0f0f0",
#endif
}
}
]
}
或者在页面中使用动态样式:
<template>
<view :style="pageStyle">
<!-- 页面内容 -->
</view>
</template>
<script>
export default {
data() {
return {
pageStyle: {
backgroundColor: window.innerWidth <= 600 ? '#f0f0f0' : '#ffffff'
}
};
}
};
</script>