第一次提交
This commit is contained in:
35
polyfill/README.md
Normal file
35
polyfill/README.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# 关于polyfill目录
|
||||
|
||||
用于抹平各平台差异化,使小程序转换uniapp项目后,能尽可能的少报错,尽可能的先运行起来。
|
||||
|
||||
## 文件结构
|
||||
|
||||
### base64Binary.js
|
||||
|
||||
用于 base64ToArrayBuffer, arrayBufferToBase64 两个函数的polyfill,因为这两函数仅app与微信小程序支持,特意制作此polyfill。
|
||||
|
||||
主要用于polyfill.js文件。
|
||||
|
||||
### mixins.js
|
||||
|
||||
有两个用途:
|
||||
一是在使用富文本时,可以将后台传入的富文本字符串里面的转义符转换为普通字符,与mp-html插件配合使用。
|
||||
二是this.setData()函数的polyfill,使转换后的uniapp项目,可以直接使用setData函数。
|
||||
|
||||
### polyfill.js
|
||||
|
||||
此文件,对大量api进行判断,如果在当前平台,不支持此函数,将会创建一个空函数,并输出一条提示,提示开发者,这个api需针对性的进行兼容处理。
|
||||
|
||||
如果不处理的话,会直接进行报错,并影响流程的运行,对转换者的心理有一定的影响。
|
||||
|
||||
因此制作此polyfill,让项目能先运行起来~
|
||||
|
||||
|
||||
## 注意
|
||||
|
||||
如果觉得这些文件不需要想删除它,请一定要先阅读关于每个文件的说明,明白它的作用,再进行删除,以免项目运行报错,感谢合作~
|
||||
|
||||
如有不明白的地方,请联系作者(375890534@qq.com)或qq群(780359397、361784059、603659851)进行交流~
|
||||
|
||||
zhangdaren 2021-07-21
|
||||
|
||||
95
polyfill/base64Binary.js
Normal file
95
polyfill/base64Binary.js
Normal file
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* @Author: zhang peng
|
||||
* @Date: 2021-08-03 10:57:51
|
||||
* @LastEditTime: 2021-08-16 17:25:43
|
||||
* @LastEditors: zhang peng
|
||||
* @Description:
|
||||
* @FilePath: \miniprogram-to-uniapp2\src\project\template\polyfill\base64Binary.js
|
||||
*
|
||||
* 借鉴自:https://github.com/dankogai/js-base64/blob/main/base64.js
|
||||
* 因uniapp没有window,也无法使用Buffer,因此直接使用polyfill
|
||||
*
|
||||
*/
|
||||
const b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
|
||||
const b64chs = [...b64ch]
|
||||
const b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/
|
||||
const b64tab = ((a) => {
|
||||
let tab = {}
|
||||
a.forEach((c, i) => tab[c] = i)
|
||||
return tab
|
||||
})(b64chs)
|
||||
const _fromCC = String.fromCharCode.bind(String)
|
||||
|
||||
/**
|
||||
* polyfill version of `btoa`
|
||||
*/
|
||||
const btoaPolyfill = (bin) => {
|
||||
// console.log('polyfilled');
|
||||
let u32, c0, c1, c2, asc = ''
|
||||
const pad = bin.length % 3
|
||||
for (let i = 0;i < bin.length;) {
|
||||
if ((c0 = bin.charCodeAt(i++)) > 255 ||
|
||||
(c1 = bin.charCodeAt(i++)) > 255 ||
|
||||
(c2 = bin.charCodeAt(i++)) > 255)
|
||||
throw new TypeError('invalid character found')
|
||||
u32 = (c0 << 16) | (c1 << 8) | c2
|
||||
asc += b64chs[u32 >> 18 & 63]
|
||||
+ b64chs[u32 >> 12 & 63]
|
||||
+ b64chs[u32 >> 6 & 63]
|
||||
+ b64chs[u32 & 63]
|
||||
}
|
||||
return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc
|
||||
}
|
||||
|
||||
/**
|
||||
* polyfill version of `atob`
|
||||
*/
|
||||
const atobPolyfill = (asc) => {
|
||||
// console.log('polyfilled');
|
||||
asc = asc.replace(/\s+/g, '')
|
||||
if (!b64re.test(asc))
|
||||
throw new TypeError('malformed base64.')
|
||||
asc += '=='.slice(2 - (asc.length & 3))
|
||||
let u24, bin = '', r1, r2
|
||||
for (let i = 0;i < asc.length;) {
|
||||
u24 = b64tab[asc.charAt(i++)] << 18
|
||||
| b64tab[asc.charAt(i++)] << 12
|
||||
| (r1 = b64tab[asc.charAt(i++)]) << 6
|
||||
| (r2 = b64tab[asc.charAt(i++)])
|
||||
bin += r1 === 64 ? _fromCC(u24 >> 16 & 255)
|
||||
: r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255)
|
||||
: _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255)
|
||||
}
|
||||
return bin
|
||||
}
|
||||
|
||||
/**
|
||||
* base64转ArrayBuffer
|
||||
*/
|
||||
function base64ToArrayBuffer (base64) {
|
||||
const binaryStr = atobPolyfill(base64)
|
||||
const byteLength = binaryStr.length
|
||||
const bytes = new Uint8Array(byteLength)
|
||||
for (let i = 0;i < byteLength;i++) {
|
||||
bytes[i] = binary.charCodeAt(i)
|
||||
}
|
||||
return bytes.buffer
|
||||
}
|
||||
|
||||
/**
|
||||
* ArrayBuffer转base64
|
||||
*/
|
||||
function arrayBufferToBase64 (buffer) {
|
||||
let binaryStr = ""
|
||||
const bytes = new Uint8Array(buffer)
|
||||
var len = bytes.byteLength
|
||||
for (let i = 0;i < len;i++) {
|
||||
binaryStr += String.fromCharCode(bytes[i])
|
||||
}
|
||||
return btoaPolyfill(binaryStr)
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
base64ToArrayBuffer,
|
||||
arrayBufferToBase64,
|
||||
}
|
||||
148
polyfill/mixins.js
Normal file
148
polyfill/mixins.js
Normal file
@@ -0,0 +1,148 @@
|
||||
/*
|
||||
* @Author: zhang peng
|
||||
* @Date: 2021-08-03 10:57:51
|
||||
* @LastEditTime: 2022-05-04 21:24:16
|
||||
* @LastEditors: zhang peng
|
||||
* @Description:
|
||||
* @FilePath: /miniprogram-to-uniapp2/src/project/template/polyfill/mixins.js
|
||||
*
|
||||
* 如果你想删除本文件,请先确认它使用的范围,感谢合作~
|
||||
* 如有疑问,请直接联系: 375890534@qq.com
|
||||
*/
|
||||
export default {
|
||||
methods: {
|
||||
/**
|
||||
* 转义符换成普通字符
|
||||
* @param {*} str
|
||||
* @returns
|
||||
*/
|
||||
escape2Html (str) {
|
||||
if (!str) return str
|
||||
var arrEntities = {
|
||||
'lt': '<',
|
||||
'gt': '>',
|
||||
'nbsp': ' ',
|
||||
'amp': '&',
|
||||
'quot': '"'
|
||||
}
|
||||
return str.replace(/&(lt|gt|nbsp|amp|quot);/ig, function (all, t) {
|
||||
return arrEntities[t]
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 普通字符转换成转义符
|
||||
* @param {*} sHtml
|
||||
* @returns
|
||||
*/
|
||||
html2Escape (sHtml) {
|
||||
if (!sHtml) return sHtml
|
||||
return sHtml.replace(/[<>&"]/g, function (c) {
|
||||
return {
|
||||
'<': '<',
|
||||
'>': '>',
|
||||
'&': '&',
|
||||
'"': '"'
|
||||
}[c]
|
||||
})
|
||||
},
|
||||
/**
|
||||
* setData polyfill 勿删!!!
|
||||
* 用于转换后的uniapp的项目能直接使用this.setData()函数
|
||||
* @param {*} obj
|
||||
* @param {*} callback
|
||||
*/
|
||||
setData: function (obj, callback) {
|
||||
let that = this
|
||||
const handleData = (tepData, tepKey, afterKey) => {
|
||||
var tepData2 = tepData
|
||||
tepKey = tepKey.split('.')
|
||||
tepKey.forEach(item => {
|
||||
if (tepData[item] === null || tepData[item] === undefined) {
|
||||
let reg = /^[0-9]+$/
|
||||
tepData[item] = reg.test(afterKey) ? [] : {}
|
||||
tepData2 = tepData[item]
|
||||
} else {
|
||||
tepData2 = tepData[item]
|
||||
}
|
||||
})
|
||||
return tepData2
|
||||
}
|
||||
const isFn = function (value) {
|
||||
return typeof value == 'function' || false
|
||||
}
|
||||
Object.keys(obj).forEach(function (key) {
|
||||
let val = obj[key]
|
||||
key = key.replace(/\]/g, '').replace(/\[/g, '.')
|
||||
let front, after
|
||||
let index_after = key.lastIndexOf('.')
|
||||
if (index_after != -1) {
|
||||
after = key.slice(index_after + 1)
|
||||
front = handleData(that, key.slice(0, index_after), after)
|
||||
} else {
|
||||
after = key
|
||||
front = that
|
||||
}
|
||||
if (front.$data && front.$data[after] === undefined) {
|
||||
Object.defineProperty(front, after, {
|
||||
get () {
|
||||
return front.$data[after]
|
||||
},
|
||||
set (newValue) {
|
||||
front.$data[after] = newValue
|
||||
that.hasOwnProperty("$forceUpdate") && that.$forceUpdate()
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
})
|
||||
front[after] = val
|
||||
} else {
|
||||
that.$set(front, after, val)
|
||||
}
|
||||
})
|
||||
// this.$forceUpdate();
|
||||
isFn(callback) && this.$nextTick(callback)
|
||||
},
|
||||
/**
|
||||
* 解析事件里的动态函数名,这种没有()的函数名,在uniapp不被执行
|
||||
* 比如:<view bindtap="{{openId==undefined?'denglu':'hy_to'}}">立即</view>
|
||||
* @param {*} exp
|
||||
*/
|
||||
parseEventDynamicCode (e, exp) {
|
||||
if (typeof (this[exp]) === 'function') {
|
||||
this[exp](e)
|
||||
}
|
||||
},
|
||||
/**
|
||||
* 用于处理对props进行赋值的情况
|
||||
* //简单处理一下就行了
|
||||
*
|
||||
* @param {*} target
|
||||
* @returns
|
||||
*/
|
||||
deepClone (target) {
|
||||
return JSON.parse(JSON.stringify(target))
|
||||
},
|
||||
/**
|
||||
* 用于处理dataset
|
||||
* 自定义组件的事件里,是获取不到e.currentTarget.dataset的
|
||||
* 因此收集data-参数,手动传进去
|
||||
*
|
||||
* @param {*} event
|
||||
* @param {*} dataSet
|
||||
* @returns
|
||||
*/
|
||||
datasetHandle (event, dataSet = {}) {
|
||||
if (event && !event.currentTarget) {
|
||||
if (dataSet.tagId) {
|
||||
event.currentTarget = {
|
||||
id: dataSet.tagId
|
||||
}
|
||||
} else {
|
||||
event.currentTarget = {
|
||||
dataset: dataSet
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
1073
polyfill/polyfill.js
Normal file
1073
polyfill/polyfill.js
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user