uni-app+vue3+vite+微信小程序开发的问题点

  1. 目录名称不能为api,否则会出现├F10: PM┤ [vite] getaddrinfo ENOTFOUND rivtrust.jz-xxx.xyz,修改为_api;
  2. vue3的全局变量挂载
import {
  createSSRApp
} from 'vue'

const app = createSSRApp(App)
app.config.globalProperties.$interface = $interface

或者

import {
  createSSRApp
} from 'vue'

const app = createSSRApp(App)
// 配置全局变量 页面中使用 inject 接收
app.provide('global', {
  $interface
})
  1. 全局变量的引入:
import { getCurrentInstance } from 'vue'

const { proxy } = getCurrentInstance()
proxy.$interface.wxLogin({
	name: 'william'
})

或者

import { inject } from 'vue'

// 获取全局对象
const global= inject('global')
global.$interface.wxLogin({
	name: 'william'
})
  1. axios在微信小程序上使用的问题:
    安装模块
npm i -S axios

出现adapter is not a function的解决方法

TypeError: adapter is not a function

需要axios自定义适配器配置

import settle from "axios/lib/core/settle"
import buildURL from "axios/lib/helpers/buildURL"
/* 格式化路径 */
const URLFormat = function(baseURL, url) {
	return url.startsWith("http") ? url : baseURL
}
/* axios适配器配置 */
const adapter = function(config) {
	return new Promise((resolve, reject) => {
		uni.request({
			method: config.method.toUpperCase(),
			url: buildURL(URLFormat(config.baseURL, config.url), config.params, config
				.paramsSerializer),
			header: config.headers,
			data: config.data,
			dataType: config.dataType,
			responseType: config.responseType,
			sslVerify: config.sslVerify,
			complete: function complete(response) {
				response = {
					data: response.data,
					status: response.statusCode,
					errMsg: response.errMsg,
					header: response.header,
					config: config
				};
				settle(resolve, reject, response);
			}
		})
	})
}

export default adapter;

整体代码request.js:

import axios from 'axios'
import statusCode from './statusCode'
import adapter from "./_adapter.js"

// 创建axios实例
const service = axios.create({
	// axios中请求配置有baseURL选项,表示请求URL公共部分
	baseURL: process.env.VUE_APP_BASE_URL,
	// 超时(毫秒)
	timeout: 10000
})
service.defaults.adapter = adapter;
service.defaults.retry = 5; // 设置请求次数
service.defaults.retryDelay = 1000; // 重新请求时间间隔

// request拦截器
service.interceptors.request.use(config => {
	console.log("axios请求拦截器", config)
	config.headers['x-requested-width'] = 'XMLHttpRequest';
	config.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
	// 'application/json;charset=utf-8'
	// 是否需要设置 token
	const isToken = config.Authorization === undefined || config.Authorization
	if (isToken) {
		const cookie = uni.getStorageSync('Authorization');
		// 让每个请求携带自定义token 请根据实际情况自行修改
		config.headers['Authorization'] = config.headers.Authorization || cookie;
	}
	config.params = {
		...config.params,
		_t: +new Date()
	}

	return config
}, error => {
	console.log(error)
	Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(res => {
		console.log("axios响应拦截器", res)
		// 未设置状态码则默认成功状态
		const code = res.data.code || 200
		// 获取错误信息
		const msg = statusCode[code] || res.data.msg || statusCode['default']
		// 二进制数据则直接返回
		if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
			return res.data
		}
		if (code === 401) {
			return Promise.reject('(401):请求要求身份验证。对于需要登录的网页,服务器可能返回此响应')
		} else if (code === 500) {
			uni.showToast({
				title: msg,
				duration: 2000
			});
			return Promise.reject(new Error(msg))
		} else if (code !== 200) {
			uni.showToast({
				title: msg,
				duration: 2000
			});
			return Promise.reject('error')
		} else {
			return res.data
		}
	},
	error => {
		console.log('err' + error)
		let {
			message
		} = error
		if (message == 'Network Error') {
			message = '后端接口连接异常'
		} else if (message.includes('timeout')) {
			message = '系统接口请求超时'
		} else if (message.includes('Request failed with status code')) {
			message = '系统接口' + message.substr(message.length - 3) + '异常'
		}
		uni.showToast({
			title: message,
			duration: 2000,
			icon: 'error'
		});
		return Promise.reject(error)
	}
)

export default service
  1. uni-app多环境配置
  • uni-app 项目中配置环境变量主要有如下三种方式:
    1. vue-config.js
    2. package.json
    3. .env
  • 在文件package.json设置以下内容
    如果项目跟目录下没有这个文件的话,可以执行 npm init -y生成该文件
  • 注意:package.json文件内不能有注释,否则配置无效,会编译失败
{
   ......
   "uni-app": {
		"scripts": {
			"h5dev": {
				"title": "h5开发版",
				"browser": "chrome",
				"env": {
					"UNI_PLATFORM": "h5",
					"VUE_APP_BASE_URL": "http://127.0.0.1:h5dev/",
					"MY_TEST": "dev-variable"
				},
				"define": {
					"H5-DEV_DEV": true
				}
			},
			"h5test": {
				"title": "h5测试版",
				"browser": "chrome",
				"env": {
					"UNI_PLATFORM": "h5",
					"VUE_APP_BASE_URL": "http://127.0.0.1:h5test/",
					"MY_TEST": "test-variable"
				},
				"define": {
					"H5-TEST": true
				}
			},
			"h5prod": {
				"title": "h5生产版",
				"browser": "chrome",
				"env": {
					"UNI_PLATFORM": "h5",
					"VUE_APP_BASE_URL": "http://127.0.0.1:h5prod/"
				},
				"define": {
					"H5-PROD": true
				}
			},
			"mp-weixin-dev": {
				"title": "微信开发版",
				"env": {
					"UNI_PLATFORM": "mp-weixin",
					"VUE_APP_BASE_URL": "http://127.0.0.1:mp-weixin-dev/"
				},
				"define": {
					"MP-WEIXIN-DEV": true
				}
			},
			"mp-weixin-test": {
				"title": "微信测试版",
				"env": {
					"UNI_PLATFORM": "mp-weixin",
					"VUE_APP_BASE_URL": "http://127.0.0.1:mp-weixin-test/"
				},
				"define": {
					"MP-WEIXIN-TEST": true
				}
			},
			"mp-weixin-prod": {
				"title": "微信生产版",
				"env": {
					"UNI_PLATFORM": "mp-weixin",
					"VUE_APP_BASE_URL": "http://127.0.0.1:mp-weixin-prod/"
				},
				"define": {
					"MP-WEIXIN-PROD": true
				}
			}
		}
	}
}

使用场景:可以使用官方的条件编译

// Vue3 非H5端,应直接访问 process.env.* 获取环境变量,不支持访问 process
// #ifdef H5-DEV
console.log('H5 开发环境', process.env, process.env.VUE_APP_BASE_URL)
// #endif
// #ifdef H5-TEST
console.log('H5 测试环境')
// #endif
// #ifdef MP-WEIXIN-DEV
console.log('微信小程序 开发环境', process.env.VUE_APP_BASE_URL)
// #endif
// #ifdef MP-WEIXIN-TEST
// 自定义微信测试环境下编译代码,其他环境下不会有这部分代码
console.log('微信小程序 测试环境')
// #endif

第二种方法,利用微信小程序的所处环境做判断:

// 获取当前帐号信息
const getBaseApi = (version = '', suffix = '') => {
	// 获取当前帐号信息
	const accountInfo = wx.getAccountInfoSync();
	let env = ""
	const baseApi = {
		// 开发版
		develop: "https://xxxxxxxx/sys",
		// 体验版
		trial: "https://xxxxxxxx/sys",
		// 正式版
		release: "https://xxxxxxxx/quotation"
	};
	// 当手机处于低版本的情况下,直接将地址写成开发版的
	let envVersion = accountInfo.miniProgram.envVersion
	if (!envVersion) {
		env = baseApi.release
	} else {
		env = version ? baseApi[version] : baseApi[envVersion];
	}
	return env + suffix;
}

export default getBaseApi
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值