V2EX zhbhun
 zhbhun 最近的时间轴更新
zhbhun

zhbhun

  Pixocial
V2EX 第 77111 号会员,加入于 2014-10-14 14:45:08 +08:00
zhbhun 最近回复了
设置里开启 Auto stash 试下,在 pull 的时候会自动帮你 stash 和恢复。

还有如果已经有 commit 了,想不用 merge 来处理,可以开启 rebase when sync 。
问题 1:"在网上查了一下,说是如果多个线程同时修改 DOM ,可能会导致竞态条件和不可预测的结果。但是微信小程序用的就是双线程啊?"
回答:微信小程序的双线程指的是逻辑线程和渲染线程,其中逻辑线程一样也是无法直接同步修改 DOM 的,需要通过 bridge 通信的方式告诉渲染线程来操作 DOM 。其实浏览器也可以做类似的事情,就是把逻辑代码放 web worker 来执行(类似小程序的逻辑线程),现在的 js 线程只接收 web worker 传来的信息进行渲染。社区也有人探索类似的方案,比如
https://github.com/web-perf/react-worker-dom ,就是把 react 搬到 web worker 上运行。

问题 2:“所以浏览器用单线程最本质的原因是什么?”
回答:个人感觉更多是因为早期 JS 就是个脚本语言,主打就是要简单易用,如果引入了多线程会变得更加复杂,当时也没有这个需求。

问题 3:微信小程序为什么要使用双线程?
回答:上面说的 react-worker-dom 虽然类似小程序采用了双线程,但是咋没有流行呢?主要还是因为浏览器的性能瓶颈在 DOM 的渲染上。如果要在浏览器上做一个类似原生应用或微信小程序的页面切换,很容易出现页面切换时卡顿的问题。如果有尝试用过 ionic 来开发 hybrid app ,你会发现页面的切换始终会有存在掉帧的问题,特别是页面 DOM 数量多了。而微信小程序直接每个页面就是新的一个 webview ,交给原生来切换。
另外,客户端那边操作 UI 也必须是在主线程上的,不允许在其他线程直接操作 UI ,客户端为什么更流畅,主要还是因为 JS 本身性能有差距,还有就是 DOM 的渲染性能比原生差很多。记得早起还有人尝试过放弃 DOM ,自己用 canvas 来做一套渲染引擎来优化渲染性能。
@lanbos +1 ,用 BAAS 、headless CMS 应付简单的 app 够用了,像 Cloudflare 和 Supabase 很香啊
2024-10-18 22:43:18 +08:00
回复了 zhbhun 创建的主题 TypeScript TypeScript 类型推导真强大。
有哪位大佬知道 Kotlin 是否可以实现的吗?
2024-10-18 20:27:45 +08:00
回复了 zhbhun 创建的主题 TypeScript TypeScript 类型推导真强大。
@hguandl 真的可以耶,感谢大佬!
2024-10-18 16:24:13 +08:00
回复了 zhbhun 创建的主题 TypeScript TypeScript 类型推真强大。
@hronro 试了下 rust ,确实支持,看来还是跟语言设计有关系。

```rust
fn with_logging<F, R>(args: F) -> R
where
F: FnOnce() -> R, // 接受一个闭包或函数,返回类型为 R
{
println!("执行函数之前的日志...");
let result = args(); // 执行传入的闭包
println!("执行函数之后的日志...");
result // 返回传入闭包的返回值
}

fn main() {
// 无参数函数
let no_args_task = || {
println!("无参数任务执行中...");
42
};

// 单个参数函数
let single_arg_task = |x: i32| -> i32 {
println!("单个参数任务,参数为:{}", x);
x * 2
};

// 多个参数函数,通过闭包包装来适配
let multiple_args_task = |x: i32, y: i32| -> i32 {
println!("多个参数任务,参数为:{}, {}", x, y);
x + y
};

// 调用高阶函数
let result1 = with_logging(no_args_task);
let result2 = with_logging(|| single_arg_task(21));
let result3 = with_logging(|| multiple_args_task(5, 10));

println!("无参数任务返回值:{}", result1);
println!("单个参数任务返回值:{}", result2);
println!("多个参数任务返回值:{}", result3);

// 最终输出
// 执行函数之前的日志...
// 无参数任务执行中...
// 执行函数之后的日志...
// 执行函数之前的日志...
// 单个参数任务,参数为:21
// 执行函数之后的日志...
// 执行函数之前的日志...
// 多个参数任务,参数为:5, 10
// 执行函数之后的日志...
// 无参数任务返回值:42
// 单个参数任务返回值:42
// 多个参数任务返回值:15
```
2024-10-18 15:10:44 +08:00
回复了 zhbhun 创建的主题 TypeScript TypeScript 类型推导真强大。
@hronro 感谢!我去学习下 OCaml 和 Rust 。标题确实没拟好,想改的发现改不了了。
2024-10-18 14:45:16 +08:00
回复了 zhbhun 创建的主题 TypeScript TypeScript 类型推导真强大。
@wlingxiao @dejavuwind 尝试用 Kotlin 写了下,没搞出来,让 ChatGPT 也说不行。主要是卡在 sequentialize 传入的函数无法是动态的,没有像 TS 提供 Parameters 和 ReturnType 来推导传入的函数类型,只能固定参数类型和返回值,这样就违背了泛化的初衷
2024-10-18 14:27:05 +08:00
回复了 zhbhun 创建的主题 TypeScript TypeScript 类型推导真强大。
@jy02534655 是的,js 支持这种高阶函数的封装。但是 TS 加了类型后,也仍然支持,并且可以在编译时检查函数类型。所以有这个疑问,是否是因为像 JS 运行时支持这种写法才行,而 Swift 和 Kotlin 无法做到。
2023-10-20 10:06:28 +08:00
回复了 ChrisFreeMan 创建的主题 Node.js Web Components 2023 年 10 月份了,现在怎么样了
有用 ionic 开发移动端的混合应用,ionic 组件都是 web component 实现的,支持 angular 、react 和 vue ,因为使用了 shadow dom ,很多内部样式无法定制,还原设计稿的时候很痛苦,如果不定制的话,还是可以的。
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4600 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 15ms UTC 10:02 PVG 18:02 LAX 02:02 JFK 05:02
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86