0%

1.flutter介绍

优点:

  • 跨平台
  • 使用widgets,打包rendering引擎,不使用原生控件。实际上就是用canvas重绘。这是UI部分的跨平台的实现。
  • 使用plantform channels,分平台操作服务。这是系统功能部分的跨平台实现。
  • 不使用bridge,打包使用AOT,性能跟原生一致,没多少损失。
    缺点:
  • Dart难用,生态系统比js差,大坑。
  • 没有React写界面直观,为什么不用标签化写界面?
  • widgets太少,轮子也少,需要自己造。

先观察,我觉得一个开源的软件好,必须生态好,就是说能吸引足够多的开发者,而吸引开发者的原因就是它帮助开发者解决了什么问题。Dart对开发者不友好就是个不好的起点,期待它改变。
flutter

但是Dart比JS的执行效率高,性能好是个优势,但是JS普通APP的性能需求也可以满足了。

Read more »

1.MVC, MVP, MVVM

这些都是架构的演变,按照MVC->MVP->MVVM,变化方向是让View能适应不断的变化,而Model尽量保持不变。

业务在Model中。由于网站的三层设计和这个有点混淆,网站三层设计UI、BLL、DAO,对应关系是UI(View+Controller), BLL+DAO(Model)。在DDD的设计中,核心业务也是在Model中,下面的DAO是支撑服务。中台设计中,业务是一个个核心微服务,DAO是支撑服务(PASS),实际存储是IASS。这些划分是按照不同的方面划分的,有联系但是不是同一个东西。
未来的架构是微服务或者是Service Mesh,都是一个目的:功能服务化,更加有弹性。

1.1 MVC

Model,View,Controller,虽然实现了分离,但是不够明确,View可以读取Model让View包含了一部分业务,耦合不够松散
MVC

1.2 MVP

对MVC做出了一些改进,让View不可以访问Model,而是通过Presenter来通信。缺点是Presenter和View的耦合关系,Presenter需要控制View的渲染。

1.3 MVVM

在MVP的基础上,让Presenter变成了VM(View-Model),核心是让View<->和ViewMode绑定了,隐藏了View的UI更新细节和ViewModel的值设置细节。
代表: WPF, Angular, React(一般不是双向绑定,而是单向绑定), Vue。

在选择架构的时候,不一定要照搬,而是要按照需求,技术,业务场景进行衡量。

比如Android为什么要用MVP,而不用MVC?那是因为Activity中不能写太多业务代码,不然维护困难。

https://blog.csdn.net/lmj623565791/article/details/46596109
https://www.cnblogs.com/xishuai/p/microservices-and-service-mesh.html

Read more »

mac

运行beyond compare4的安装命令行工具,然后设置git

1
2
3
4
5
6
7
8
git config --global diff.tool bc4
git config --global difftool.prompt false
git config --global difftool.bc4.cmd '"/usr/local/bin/bcomp" "$LOCAL" "$REMOTE"'

git config --global merge.tool bc4
git config --global mergetool.prompt false
git config --global mergetool.bc4.cmd '"/usr/local/bin/bcomp" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"'
git config --global mergetool.bc4.trustexitcode true

https://blog.csdn.net/yu12377/article/details/73526751

Read more »

1. dispatch 同一个 action 在极短的时间内 2 次

如果 reducer 里面是用的return fromJS(action.payload),然后 dispatch 同一个 action 在极短的时间内 2 次,导致的结果就是第二次使用的 immutable state 是旧的,它没有被第一次的 action 所更改,这样的后果就是状态丢失了。JS 执行时单线程,所以 reudx 这里并没有 race condition,真正的原因是这两次 dispatch 是在同一 render 桢中运行的,所以它们 mapStateToProps 中原始 state 是相同的,事实上就是第二次修改覆盖了第一次修改(reducer 中使用了 fromJS,而非 mergeDeep)。

解决方案:

  1. 多个 action 修改不同部分
  2. 多个修改合并到一个 action
    我先选择#2

2. yield select 连续多个

好像如果有一个循环,大约 100 多次,在循环体里面 yield select(selctor), 那么可能导致 saga 不工作,但是 redux 还是工作的。

Read more »

1. 调试工具

1.1 Facebook官方react-devtools

特点是命令行启动,不需要RN启动remote js debugging.只能看React布局,如同Chrome的React插件,不能看网络,不能看Redux。

1.2 Electron集成调试工具 React-Native-Debugger

特点是:独立的Electron程序,集成了react-devtools, Redux, chrome的调试。需要启动remote js debugging,而且要关掉默认的chrome的调试网页。
集成Redux调试工具时,需要添加增强代码。

1
2
3
4
5
6
7
8
9
10
11
12
const composeFuncs = [applyMiddleware(
sagaMiddleware,
asyncInitialState.middleware(loadStore),
)]

if (__DEV__) {
// integrate React Native Debugger
typeof window === 'object' && window.__REDUX_DEVTOOLS_EXTENSION__ && composeFuncs.push(
// __REDUX_DEVTOOLS_EXTENSION__ this is React Native Debugger added
window.__REDUX_DEVTOOLS_EXTENSION__()
)
}
  • React的调试框中的$r,直接可以在Chrome的console中读到。
  • CMD+D显示调试窗口后,启用Toggle Inspector可以在React中显示当前的View的信息。
    Read more »

1.循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 1. for 普通循环
for(let i= 0; i < length; i++){

}
// 可以有brek, continue
// 缺点: 这个最慢

// 2. forEach
Array.forEach
// 缺点: 只对数组有效,不能break,continue

// 3. for of, 最新添加的功能,推荐使用
for(let o of arr){

}
// 效率比较高

// 4. for in, 这个是用来遍历属性的,不推荐遍历数组。这个会把原型的属性也遍历。
// TODO: check? 应该还是可遍历属性。
for (let p in objectA){

}

> JS其实没有数组,都是对象。

所以,应该优先使用for of,其次for 普通的循环。

Read more »

1.APT

1.1 定义

APT英文全称:Android annotation process tool是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,使用Annotation进行额外的处理。
Annotation处理器在处理Annotation时可以根据源文件中的Annotation生成额外的源文件和其它的文件(文件具体内容由Annotation处理器的编写者决定),APT还会编译生成源文件和原来的源文件,将它们一起生成class文件。简言之:APT可以把注解,在编译时生成代码。

2.2 注解框架

  • ButterKnife
    BindView绑定View,不需要findViewById了。

  • dagger
    Binds等一些类注释工具

Read more »

1. ? !! !

val str:String! = “” //无法声明,临时变量,说明这是Kotlin调用Java代码产生的,如果要使用,最好用可空类型
val str:String? = “” //可空类型
val str:String!! = “” //1.强制转换;2.不能为空

Read more »