当前位置: 首页 > news >正文

Uniapp运行环境判断和解决跨端兼容性详解

Uniapp运行环境判断和解决跨端兼容性

开发环境和生产环境

uniapp可通过process.env.NODE_ENV判断当前环境是开发环境还是生产环境,一般用于链接测试服务器或者生产服务器的动态切换。在HX中,点击运行编译出来的代码是开发环境,点击发行编译出来的代码是生产环境。

if(process.env.NODE_ENV === 'development'){console.log('开发环境')
}else{console.log('生产环境')
}

跨端兼容

uniapp已将常用的组件,js api封装到框架中,开发者按照uniapp规范开发即可保证多平台兼容,大部分业务均可直接瞒住,但每个平台有自己的特征,因此会存在一些无法跨平台情况,大量写if else会造成代码执行性能低下和管理混乱,编译到不同的工程后二次修改会让后续升级变得非常麻烦,在C中,通过#ifdef#ifndef的方式,为windows,mac,等不同的OS编译不同的代码,uniapp也参考了这个思路,为uniapp提供了条件编译手段,在一个工程项目里优雅的完成了平台个性化实现。

条件编译解决跨端兼容性

uni-app平台有两种场景,一种是在编译期条件编译判断,一种是在运行期判断。

条件编译语法

条件编译使用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同的平台。写法以#ifdef#ifndef%PLATFORM开头,以#endif结尾。

  • #ifdefif defined仅在某平台存在。
  • #ifndefif not defined除了某平台均存在。
  • %PLATFORM:平台名称。

%PLATFORM取值表

平台
APP-PLUSApp
APP-PLUS-NVUE或APPNVUEApp nvue
H5H5
MP-WEIXIN微信小程序
MP-ALIPAY支付宝小程序
MP-BAIDU百度小程序
MP-TOUTIAO字节跳动小程序
MP-QQQQ小程序
MP-360360小程序
MP微信小程序/支付宝小程序/百度小程序/字节跳动小程序/QQ小程序/360小程序
QUICKAPP-WEBVIEW快应用通用(包含联盟、华为)
QUICKAPP-WEBVIEWUNION快应用联盟
QUICKAPP-WEBVIEWHUAWEI快应用华为

实列说明:

  • #ifdef APP-PLUS,#endif,需条件编译的代码,仅出现在App平台下的代码。
  • #ifndef H5,#endif,需条件编译的代码,除了 H5平台,其它平台均存在的代码。
  • #ifdef H5 || MPWEIXIN,#endif,需条件编译的代码,在 H5 平台或微信小程序平台存在的代码(这里只有||,不可能出现&&,因为没有交集)。

支持的文件:.nvue.vue.js.csspages.json
**各预编译语言文件:**如:.scss.less.stylus.ts.pug
注意:
条件编译是利用注释实现的,在不同语法里注释写法不一样,js使用//注释css 使用/* 注释 */vue/nvue 模板里使用 <!-- 注释 -->,条件编译 APP-PLUS 包含 APP-NVUEAPP-VUEAPP-PLUS-NVUEAPP-NVUE没什么区别,为了简写后面出了APP-NVUE

组件(模板)的条件编译
	<!-- #ifdef %PLATFORM% -->平台特有的组件<!-- #endif -->

示例:

<template><view><!-- #ifdef APP-PLUS --><view>APP中显示</view><!-- #endif --><!-- #ifndef APP-PLUS --><view>不在APP中显示</view><!-- #endif --><!-- #ifdef MP-WEIXIN || H5 --><!-- 还支持多平台同时编译,使用 || 来分隔平台名称 --><view>在微信小程序或H5端显示_点击下载APP</view><!-- #endif --></view>
</template>

结果:
Uniapp运行环境判断和解决跨端兼容性详解

API(js)的条件编译
	// #ifdef %PLATFORM%平台特有的API实现// #endif

示例:

<template><view></view>
</template>
<script>
export default {data() {return {// #ifdef APP-PLUStitle: '我是APP端',// #endif}},onLoad() {this.test1()},methods: {test1() {// #ifdef H5console.log('兼容H5平台')// #endif// #ifdef MP-WEIXINconsole.log('兼容微信小程序平台')// #endif}}
}
</script>
<style></style>

效果:
Uniapp运行环境判断和解决跨端兼容性详解

样式 (style)的条件编译
	/* #ifdef %PLATFORM% */平台特有样式/* #endif */

注意: 样式的条件编译,无论是 css 还是 sass/scss/less/stylus 等预编译语言中,必须使用 /*注释*/ 的写法。
示例:

<template><view><view class="test"></view></view>
</template><script>
export default {data() {return {// #ifdef APP-PLUStitle: '我是APP端',// #endif}},onLoad() {this.test1()},methods: {test1() {// #ifdef H5console.log('兼容H5平台')// #endif// #ifdef MP-WEIXINconsole.log('兼容微信小程序平台')// #endif}}
}
</script>
<style lang="scss">.test {width: 100px;height: 100px;/* #ifdef MP */background: red;/* #endif *//* #ifdef MP-WEIXIN */background: yellow;/* #endif *//* #ifdef H5 */background: green;/* #endif */}
</style>

Uniapp运行环境判断和解决跨端兼容性详解

pages.json 的条件编译

下面的页面,只有运行至 App 时才会编译进去。不同平台下的特有功能,以及小程序平台的分包,都可以通过 pages.json 的条件编译来更好地实现。这样,就不会在其它平台产生多余的资源,进而减小包体积。
示例:

{"pages": [{"path": "pages/index/index","style": {"navigationBarTitleText": "uni-app"}}// #ifdef APP-PLUS, {"path": "pages/wenda/wenda","style": {"navigationBarTitleText": "问答"}}// #endif],"globalStyle": {"navigationBarTextStyle": "black","navigationBarTitleText": "uni-app","navigationBarBackgroundColor": "#F8F8F8","backgroundColor": "#F8F8F8"},"uniIdRouter": {}
}

注意:
Uniapp运行环境判断和解决跨端兼容性详解
#ifdef APP-PLUS #endif 预编译指令之间,如果只有一个配置项,那么这个配置项后面不应该有逗号。这是因为预编译指令可能会导致这部分代码被移除,从而留下一个多余的逗号,造成 JSON 解析错误。

static 目录的条件编译

在不同平台,引用的静态资源可能也存在差异,通过 static 的的条件编译可以解决此问题,static 目录下新建不同平台的专有目录(目录名称同 %PLATFORM% 值域,但字母均为小写),专有目录下的静态资源只有在特定平台才会编译进去。
如以下目录结构, a.png 只有在微信小程序平台才会编译进去, b.png 在所有平台都会被编译。

┌─static
│ ├─mp-weixin
│ │ └─a.png
│ └─b.png
├─main.js
├─App.vue
├─manifest.json
└─pages.json
运行期判断IOS/Android平台

AndroidiOS 平台不支持通过条件编译来区分,如果需要区分AndroidiOS 平台,请通过调用uni.getSystemInfo 来获取平台信息。
运行期判断: 运行期判断是指代码已经打入包中,仍然需要在运行期判断平台,此时可使用uni.getSystemInfoSync().platform 判断客户端环境是 AndroidiOS 还是小程序开发工具(在百度小程序开发工具、微信小程序开发工具、支付宝小程序开发工具中使用 uni.getSystemInfoSync().platform 返回值均为 devtools)。如有必要,也可以在条件编译里自己定义一个变量,赋不同值。在后续运行代码中动态判断环境。
判断是否为: IOS 平台的APP

<template><view></view>
</template>
<script>export default {data() {return {}},onLoad() {switch (uni.getSystemInfoSync().platform) {case 'android':console.log('运行Android上')break;case 'ios':console.log('运行iOS上')break;default:console.log('运行在开发者工具上')break;}},methods: {}}
</script>
<style lang="scss"></style>

效果:
Uniapp运行环境判断和解决跨端兼容性详解
如有必要,也可以在条件编译里自己定义一个变量,赋不同值。在后续运行代码中动态判断环境。

<template><view><view v-if="isIosApp">IOS平台的APP</view><view v-else>不是IOS平台的APP</view></view>
</template>
<script>export default {data() {return {isIosApp: false, // 是否为 IOS平台的APP端}},onLoad() {// #ifdef APP-PLUSthis.isIosApp = uni.getSystemInfoSync().platform === 'ios'// #endif},}
</script>

效果:
Uniapp运行环境判断和解决跨端兼容性详解
Uniapp运行环境判断和解决跨端兼容性详解完结~

相关文章:

Uniapp运行环境判断和解决跨端兼容性详解

Uniapp运行环境判断和解决跨端兼容性 开发环境和生产环境 uniapp可通过process.env.NODE_ENV判断当前环境是开发环境还是生产环境&#xff0c;一般用于链接测试服务器或者生产服务器的动态切换。在HX中&#xff0c;点击运行编译出来的代码是开发环境&#xff0c;点击发行编译…...

Linux设置开机自动执行脚本 rc-local

使用/etc/rc.local 1、启动rc-local服务 首先授予执行权限 chmod x /etc/rc.d/rc.local设置开启自启并启动 sudo systemctl enable rc-local sudo systemctl start rc-local查看状态 sudo systemctl status rc-local2、编写要执行的脚本 vim /home/start.sh #!/bin/bash…...

驱动开发小问题 -记录一下

1 D:\Windows Kits\10\Vsix\VS2022\10.0.26100.0\amd64 D:\Windows Kits\10\Vsix\VS2019 2 windows防火墙白板 无法设置通过powershell防火墙禁用 Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False 3 内核调试 vm虚拟机 设置成 NAT模式 &#xff…...

学习笔记018——若依框架数据权限功能的实现

ps&#xff1a;本文所使用的若依是前后端分离的v3.6.0版本。 1、建表 建立业务表的时候&#xff0c;需要在表中添加user_id和dept_id两个字段。&#xff08;字段一定要一样&#xff0c;下文能体现&#xff09; user_id&#xff1a;表中该条记录的创建人id dept_id&#xff1…...

Nginx文件下载服务器搭建

Nginx文件下载服务器搭建 80端口启动下载服务器, 下载/var/www/downloads目录下的文件&#xff0c;nginx.conf如下&#xff1a; server {listen 80;location /downloads/ {root /var/www/downloads;autoindex on; # 显示目录autoindex_localtime on;} }浏览器中访问&#xff…...

AWD脚本编写_1

AWD脚本编写_1 shell.php&#xff08;放在网站根目录下&#xff09; <?php error_reporting(0); eval($_GET["yanxiao"]); ?>脚本编写成功 后门文件利用与解析 import requests import base64def get_flag(url, flag_url, method, passwd, flag_path):cmd…...

HarmonyOS 如何获取设备信息(系统、版本、网络连接状态)

文章目录 前言一、引入模块和基本设备信息的获取二、设备硬件和系统版本信息的获取三、获取安全相关的设备信息四、获取网络状态信息五、完整 Demo 代码1. 导入所需模块2. 获取设备基本信息代码解析 3. 检测网络连接状态4. 执行函数 总结 前言 HarmonyOS 提供了一个强大的 API…...

2411rust,1.80

1.80.0稳定版 LazyCell和LazyLock 这些"懒"类型会延迟初化其数据,直到第一次访问.它们类似1.70中稳定的OnceCell和OnceLock类型,但单元中包含初化函数. 这稳定化了从流行的lazy_static和once_cell中进入标准库. LazyLock是线安选项,使其适合静态值等位置.如,产生…...

FPGA 第6讲 简单组合逻辑多路选择器

时间&#xff1a;2024.11.11-11.14 一、学习内容 1.组合逻辑 组合逻辑是VerilgHDL设计中一个重要组成部分。从电路本质上讲&#xff0c;组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数&#xff0c;与其他时刻的输入状态无关&#xff0c;无存储电路&#xff0c;也没…...

Android Studio开发学习(五)———LinearLayout(线性布局)

一、布局 认识了解一下Android中的布局&#xff0c;分别是: LinearLayout(线性布局)&#xff0c;RelativeLayout(相对布局)&#xff0c;TableLayout(表格布局)&#xff0c; FrameLayout(帧布局)&#xff0c;AbsoluteLayout(绝对布局)&#xff0c;GridLayout(网格布局) 等。 二、…...

大模型(LLMs)RAG 版面分析------文本分块面

一、为什么需要对文本分块&#xff1f; 使用大型语言模型&#xff08;LLM&#xff09;时&#xff0c;切勿忽略文本分块的重要性&#xff0c;其对处理结果的好坏有重大影响。 考虑以下场景&#xff1a;你面临一个几百页的文档&#xff0c;其中充满了文字&#xff0c;你希望对其…...

Web3游戏先锋 Big Time Studios 重磅推出 $OL 通证,赋能 Open Loot 游戏平台

作为 Web3 游戏领域的领军者&#xff0c;Big Time Studios 不仅创造了热门游戏《Big Time》&#xff0c;还开发了 Open Loot 平台&#xff0c;至今交易量已超过 5 亿美元。如今&#xff0c;Open Loot 平台的活跃用户可以获得 $OL 代币&#xff0c;这是该平台推出的首个实用型代…...

Linux—ln(link files)命令使用方法(How to create links on Linux)

Linux—ln&#xff08;link files&#xff09;命令使用方法 在 Linux 系统中工作时&#xff0c;需要在不同的目录中使用相同的文件时&#xff0c;不必在每个目录下都复制一份文件&#xff0c;这样不仅浪费磁盘空间&#xff0c;还会导致文件管理上的混乱。 ln(link files) 便是…...

学习日记_20241110_聚类方法(K-Means)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…...

解决Oracle DECODE函数字符串截断问题的深度剖析20241113

解决Oracle DECODE函数字符串截断问题的深度剖析 在使用Oracle数据库进行开发时&#xff0c;开发者可能会遇到一些令人困惑的问题。其中&#xff0c;在使用DECODE函数时&#xff0c;返回的字符串被截断就是一个典型的案例。本文将以学生管理系统为背景&#xff0c;深入探讨这个…...

开源模型应用落地-语音转文本-whisper模型-AIGC应用探索(二)

一、前言 语音转文本技术具有重要价值。它能提高信息记录和处理的效率,使人们可以快速将语音内容转换为可编辑、可存储的文本形式,方便后续查阅和分析。在教育领域,可帮助学生更好地记录课堂重点;在办公场景中,能简化会议记录工作。同时,该技术也为残障人士提供了便利,让…...

PHP框架 单一入口和多入口以及优缺点

在PHP框架中&#xff0c;单一入口和多入口是两种不同的应用架构设计方式&#xff0c;以下是关于这两者及其优缺点的详细解释&#xff1a; 一、单一入口 定义&#xff1a; 单一入口&#xff08;Single Entry Point&#xff09;指的是应用程序通过一个统一的文件&#xff08;通…...

PhpSpreadsheet导出图片

PhpSpreadsheet导出图片 //导出public function pdf($ids){$jzInfo $this->model->where(id,$ids)->find();try {//巡检人员$staff_ids \app\admin\model\inspection\Plan::where(id,$jzInfo[plan_id])->value(staff_id);$staff_names \app\admin\model\inspect…...

AI 提示词(Prompt)入门 十:最佳实践|详细询问,提供细节!

1、原则解释 当与 ChatGPT 交流时&#xff0c;提供具体和详细的信息非常重要。 这样做可以帮助 ChatGPT 更准确地理解你的需求和上下文&#xff0c;从而生成更相关和有用的回答 明确的信息可以包括具体的问题背景、相关领域的说明、你所期望的答案类型等。 2、如何实践 明…...

web应用安全和信息泄露预防

文章目录 1&#xff1a;spring actuator导致的信息泄露1.1、Endpoint配置启用检测1.2、信息泄露复现1.3、防御 2&#xff1a;服务端口的合理使用3&#xff1a;弱口令&#xff08;密码&#xff09;管理4&#xff1a;服务端攻击4.1、短信业务&#xff0c;文件上传等资源型接口1、…...

《人工智能深度学习的基本路线图》

《人工智能深度学习的基本路线图》 基础准备阶段 数学基础&#xff1a; 线性代数&#xff1a;深度学习中大量涉及矩阵运算、向量空间等概念&#xff0c;线性代数是理解和处理这些的基础。例如&#xff0c;神经网络中的权重矩阵、输入向量的运算等都依赖于线性代数知识。学习内容…...

基于Java Springboot宠物猫售卖管理系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&#xff1a;…...

力扣-Hot100-链表其三【算法学习day.36】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…...

iOS逆向入门:使用theos注入第三方依赖库

背景 theos是一个跨平台的软件开发框架&#xff0c;常用于管理&#xff0c;开发和部署iOS项目&#xff0c;同时也是开发iOS越狱插件的主要工具。和MonkeyDev不同的是&#xff0c;它不依赖于xcode&#xff0c;可以在多个操作系统上运行。一个完整的iOS越狱开发流程包括&#xf…...

JavaScript 原型

JavaScript 的原型&#xff08;Prototype&#xff09;是其面向对象编程模型的核心概念之一&#xff0c;它决定了对象如何继承属性和方法。通过理解 JavaScript 的原型&#xff0c;你可以更好地理解对象之间的关系以及如何扩展对象功能。 核心概念 [[Prototype]]&#xff08;内部…...

力扣 LeetCode 20. 有效的括号(Day5:栈与队列)

解题思路&#xff1a; 使用栈 只有三种情况 1. ( [ { } ] ( ( 左括号多了 -> 最后栈中经过抵消会剩下括号 2. [ { ( ] } ] 括号不匹配 -> return false 3. [ { } ] ( ) ) ) 右括号多了 -> 未遍历完时&#xff0c;栈提前为空&#xff0c;…...

git使用及上线流程(仅为我工作中常用)

推荐软件或者直接终端 ⚠️注意&#xff1a;在确保远程和本地分支都可使用的情况下 git常见使用命令 ls---查看所有目录 pwd---本机密码 cd 目录名---进入目录 Touch ---创建文本文件 git status---查看状态 git branch---查看分支 git pull---拉取远程最新代码 git checkou…...

React Native 全栈开发实战班 - 打包发布之热更新

在完成 React Native 应用的开发与性能优化后&#xff0c;下一步就是将应用打包并发布到各大应用市场&#xff0c;如 Apple App Store 和 Google Play Store。本章节已经详细介绍了打包与发布的流程&#xff0c;包括 Android 和 iOS 平台的配置、打包步骤、签名配置以及发布到应…...

2024年11月16日 星期六 重新整理Go技术

今日格言 坚持每天进步一点点~ 一个人也可以是一个团队~ 学习全栈开发, 做自己喜欢的产品~~ 简介 大家好, 我是张大鹏, 今天是2024年11月16日星期六, 很高兴在这里给大家分享技术. 今天又是休息的一天, 做了很多的思考, 整理了自己掌握的技术, 比如Java, Python, Golang,…...

力扣第 55 题 跳跃游戏

力扣第 55 题 跳跃游戏&#xff08;Jump Game&#xff09;。题目要求判断一个非负整数数组中&#xff0c;是否能够从第一个位置跳跃到最后一个位置。每个元素表示从当前位置最多可以跳跃的步数。 解题思路 我们可以用 贪心算法 来解决这个问题。贪心的核心思想是始终维护当前…...

营销型网站设计案例/百度网址大全旧版本

如图所示&#xff0c;:id我要怎么获取到呢&#xff1f;&#xff1f;&#xff1f; 获取方法this.$route.params.id 这样就行...

自学网站建设与网页设计/百度知道首页登录入口

点击上方“JAVAandPython君”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达小白学Django系列&#xff1a;小白学Django第一天| MVC、MVT以及Django的那些事小白学Django第二天| Django原来是这么玩的&#xff01;小白学Django第三天| 一文带你快速理解模型M…...

建设网站需要的材料/营销网站建设哪家好

你好&#xff01; 欢迎来到我的博客&#xff01; 我的博客用来发布一些我学习编程的笔记。 希望我的一些错误能给你提醒&#xff0c;也希望我的思路能给你启发&#xff0c;做出比我更好的解答&#xff01; 一部分笔记稍后会再完善补充&#xff01; 原网站在Wordpress&#xff0…...

哪里有零基础网站建设教学公司/整合营销

在上一章中我们说到了,多态.面向对象的最后一个特征.本章中我们来说一下在面向对象所用到的关键字,还有没用到的关键字本章内容要求背诵目前已经学过的关键字有:1,访问权限修饰符中的public:公共的protected:受保护的private:私有的2,类的关键字class3,继承的关键字extends4,创…...

品牌网站建设完善大蝌蚪/微博推广费用一般多少

在前面文章《矩阵的四个基本子空间》中提到&#xff1a; 一个秩为r&#xff0c;m*n的矩阵A中&#xff0c;其行空间和列空间的维数为r&#xff0c;零空间和左零空间的维数分别为n-r&#xff0c;m-r&#xff0c;并且有行空间与零空间正交&#xff0c;列空间与左零空间正交。“掌握…...

淘宝网站运营的工作怎么做/十大门户网站

首先是克隆项目&#xff1a; git clone xxxxxxx 创建本地分支&#xff1a; git branch nameXXXX 切换本地分支&#xff1a; git checkout nameXXXX 创建远程分支&#xff1a; git push --set-upstream origin nameXXXX 查看所有分支&#xff1a; git branch -a 删除本…...