0%

对于React Native的热更新,之前一直用code-push,这个API比较丰富,统计功能也比较全。但服务器在国外,对于国内来说网络不占优势。
在之前工作中,发现安卓还有热更新失败的情况。

对于拆包需求来说,现在只能说有多种方案,携程的方案比较强大,但他们的CRN并不开源。调研过一段时间,目前比较方便的还是通过Google的diff工具进行拆包。

实施方案

React Native打包之后会生成bundle文件,拆分方案是基于本次打包与前一次打包之间的差异完成的。即前一次打出来的bundle(lastbundle)作为base,本次打包出来的bundle(newbundle)与lastbundle之间的差异作为diffbundle。这样我们可以把一个最新的完整的bundle拆成两部分(如图):

Read more »

在RN项目中,有时涉及到原生组件开发。本博客记录了对iOS原生组件基础封装和使用的全过程。

核心步骤

  • 新建一个RCTViewManager子类,管理要封装的组件
  • 添加RCT_EXPORT_MODULE()标记宏命令
  • 实现-(UIView *)view方法
Read more »

Here's something encrypted, password is required to continue reading.
Read more »

小工具中用的部分测试文件见附件

对比文本文件中不同的行

最近有两个项目苹果帐号中新增了内测帐号,新老包里面包含的内测设备不同,想要查看新包(内测设备多)中比老包多了哪些。

Read more »

最近收集了很多素材图片在一个文件夹中,想要统一修改名字(一个个手动改这操作太low——舍弃)。想要通过Python脚本进行批量重命名:

  1. 先遍历文件路径获取到该文件夹中的文件数组
  2. 获取文件类型,区分是否是我们要修改的图片
  3. 对比文件类型后,进行重命名

os.walk()获取文件列表

os.walk(PATH) PATH是个文件夹路径,当然可以用.或者../这样啦。返回一个三元素的tuple:当前路径、子文件夹名称、文件列表。

Read more »

js随机数概率控制

调用随机函数生成范围之间的随机数,如果生成的随机数在某个整数的取值范围内,那么就输出当前整数。

工具类代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class GLRandom {
/**
* 构造函数
* @param {number} min 最小整数值
* @param {number} max 最大整数值
* @param {Map} percentage 概率数 [值,百分比]
*/
constructor(min, max, percentage = new Map()) {
this.min = Math.trunc(min);
this.max = Math.trunc(max);
this.MATH_RANGE = 100; // 分成100份
this.percentage = percentage;
this.range();
}

get percentage() {
if (!this._percentage) {
this._percentage = new Map();
}
return this._percentage;
}

/**
* 分配比例
* @param {Map} map 设置 值-百分比
*/
set percentage(map) {
let result = Array.from(map.values()).reduce((p, v, a) => {
return p - v;
}, 1);
for (let i = this.min; i < this.max; i++) {
if (map.has(i)) {
this.percentage.set(i, map.get(i));
} else {
this.percentage.set(i, result / (this.max - this.min - map.size));
}
}
// 重新设置取值范围
this.range()
}

/**
* 根据比例生成取值范围
*/
range() {
let [start, random, keys] = [0, this.MATH_RANGE, Array.from(this.percentage.keys())];
for (let i = 0; i < keys.length; i++) {
let temp = this.percentage.get(keys[i]);
this.percentage.set(keys[i], [start, start += temp * random]);
}
}

/**
* 生成随机数
*/
create() {
let num = Math.random() * this.MATH_RANGE;
for (let data of this.percentage.entries()) {
if (num >= data[1][0] && num < data[1][1]) {
return data[0];
}
}
return null;
}
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 生成概率随机数
let res = [];
for (var i=0; i<10000; i++) {
let r = random.create();
res.push(r);
}

// 统计
let count = 0
for (var i=0; i < res.length; i++) {
if (res[i] == 6) {
count++
}
}

console.log(count / res.length);

Promise

应用题:(模仿promise.all())定一个函数,参数为一个需要异步操作的URL数组,需要返回一个Promise格式的结果——假如所有异步操作成功,则返回所有成功后结果集合;假如其中有异步操作失败,则返回失败的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
testPromise (requests = [], results = []) {
return new Promise((resolve, reject) => {
let count = 0
requests.forEach((request) => {
new Promise((resolve, reject) => {
const timeOut = request
// var timeOut = Math.random() * 2
console.log('----start new Promise...timeout to: ' + timeOut + ' seconds.')
setTimeout(function () {
if (timeOut < 1) {
console.log('-----call resolve()...')
resolve('-----200 OK')
} else {
console.log('-----call reject()...')
reject(new Error('==timeout==' + timeOut + 'seconds'))
}
}, timeOut * 1000)
}).then((success) => {
count += 1
results.push(request)
if (count === requests.length) {
console.log('test----call all resolve()...!!!')
resolve(results)
}
}).catch((err) => {
reject(err)
})
})
})
}

// 函数使用案例
this.testPromise([0.1, 0.4, 0.5, 0.3, 1.7, 0.7])
.then((res) => console.log('=====success==== ', res))
.catch((err) => console.log('=====error==== ', err))

Immutable优缺点

  • 传递数据时,Immutable Data可以提升组件渲染性能
  • Imutable Data是对可变对象和不可变对象的一个折中
  • 可变对象——是指多个变量引用一个对象,这导致对象的time和value耦合,对象一旦改变无法重塑
  • 不可变对象——是指每次用对一个对象就进行深复制,这导致内存浪费
  • Immutable——基于持久化数据结构,也就是使用就数据创建新数据时,旧数据依旧保存,而且为了避免深度复制,Immutable Data使用结果共享,也就是说如果对象树中的一个节点变化,只修改这个节点和受他影响的父节点,其他节点依旧共享。Immutable Data优点体现在降低了可变数据带来的时间和值的耦合,节省了内存,可以实现数据的时间旅行,也就是说数据可以重塑。

Immutable

  • 普通的mutable对象深拷贝会将一整份数据都复制一遍,而Immutable对象在修改数据时并不会复制一整份数据,而是将变化的节点与未变化的节点的父子关系转移到一个新节点商,类似于链表的结构。从“复制”的角度来看,做到了最小化的复制,未变化的部分是共享的,Mutable在复制的时候是“全量”,而Immutable复制的是“增量”,对于内存空间的使用率