uni-app 生命周期深度解析(iOS / Android / 鸿蒙 / Vue3 四端对照)

作者:90后晨仔日期:2026/8/7

📌 本文定位: 面向同时具备 iOS、Android、鸿蒙原生开发经验,正在转向 uni-app 的资深工程师。所有技术点均基于 uni-app 官方文档 及 Vue3 官方文档整理。


一、先搞懂一个 JS 语法问题:为什么说"与 data/methods 平级的叫生命周期"?

很多原生工程师初学 uni-app 时会对这句话感到困惑。我们从 JavaScript 语言层面彻底讲清楚。

1.1 Options API 的本质是一个"配置对象"

在 Vue2/Vue3 的 Options API 中,export default {} 导出的是一个普通 JS 对象。这个对象的每个 key 都有特定语义:

1export default {
2  //  数据属性  Vue 会将其转为响应式
3  data() {
4    return { count: 0 }
5  },
6
7  //  方法属性  Vue 会将其绑定到组件实例上
8  methods: {
9    increment() { this.count++ }
10  },
11
12  //  计算属性  Vue 会缓存其返回值
13  computed: {
14    doubleCount() { return this.count * 2 }
15  },
16
17  //  生命周期钩子  Vue 会在特定时机自动调用
18  onLoad(options) {
19    console.log('页面加载', options)
20  },
21
22  onShow() {
23    console.log('页面显示')
24  },
25
26  mounted() {
27    console.log('DOM 挂载完成')
28  }
29}
30

1.2 Vue 内部是如何区分它们的?

Vue 在创建组件实例时,会遍历这个配置对象的所有 key,根据 key 的名称做不同的处理:

key 名称Vue 内部处理方式归类
data执行函数,将返回值做响应式代理(reactive())数据层
methods遍历对象,将每个方法绑定 this 并挂载到实例方法层
computed创建惰性求值的响应式引用(computed())计算层
watch注册侦听器(watch())监听层
onLoad / onShow / mounted 等注册为生命周期回调,在对应时机由框架自动调用生命周期层
其他自定义 key直接挂载到实例上,不做特殊处理自定义属性

💡 核心结论: "生命周期"不是一个 JS 语言概念,而是 Vue/uni-app 框架的约定。框架通过识别特定的 key 名称,将其从普通属性中"挑出来",注册到内部的生命周期调度系统中。这就是为什么它必须与 datamethods "平级"——因为它们都是同一个配置对象的顶层 key。

1.3 对比原生开发中的类似模式

平台类似机制说明
iOSUIViewController 的 viewDidLoad()、viewWillAppear() 等系统通过方法名识别生命周期,开发者重写即可
AndroidActivity 的 onCreate()、onResume() 等框架通过方法签名识别,自动在对应时机回调
鸿蒙@Component 的 aboutToAppear()、onPageShow() 等ArkUI 框架通过装饰器+方法名识别
Vue3 Composition APIonMounted()、onUnmounted() 等组合式函数不再依赖对象 key 名,改为显式函数调用注册
uni-app Options APIonLoad()、onShow() 等作为配置对象顶层 key框架通过 key 名识别并注册

二、应用生命周期详解(App.vue)

应用生命周期是全局级别的,只能在 App.vue 中监听。它管理的是整个 App 进程从创建到销毁的全过程。

2.1 完整生命周期流程图

1App 启动
2   
3   
4┌──────────┐     ┌──────────┐     ┌──────────┐
5 onLaunch │────►│  onShow  │◄───►│  onHide  
6 (仅一次)       (每次前台)      (每次后台) 
7└──────────┘     └──────────┘     └──────────┘
8                      
9                 用户关闭App
10                      
11                      
12              ┌──────────────┐
13                 onExit     
14               (仅Android)  
15              └──────────────┘
16
17异常分支:
18  ├─ JS/API错误 ──► onError()
19  ├─ 页面不存在 ──► onPageNotFound()
20  └─ 主题切换   ──► onThemeChange()
21

2.2 逐个详解 + 四端对照

onLaunch(options)

  • 触发时机: App 初始化完成时触发,全局仅一次
  • 参数: options 包含启动路径 path、场景值 scene、查询参数 query
  • 典型用途: SDK 初始化、登录态检查、全局数据预加载
1// App.vue
2export default {
3  onLaunch(options) {
4    console.log('App Launch, 启动参数:', options);
5    
6    // 初始化推送 SDK
7    // #ifdef APP-PLUS
8    plus.push.addEventListener('click', (msg) => {
9      console.log('推送点击:', msg);
10    });
11    // #endif
12    
13    // 检查登录态
14    const token = uni.getStorageSync('token');
15    if (!token) {
16      uni.reLaunch({ url: '/pages/login/login' });
17    }
18  }
19}
20

onShow(options)

  • 触发时机: App 启动 从后台切回前台时触发
  • 参数:onLaunch
  • 典型用途: 刷新数据、恢复任务、版本检查
1export default {
2  onShow(options) {
3    console.log('App Show, 场景值:', options.scene);
4    // 每次回到前台都检查是否有新消息
5    this.checkNewMessages();
6  }
7}
8

onHide()

  • 触发时机: App 从前台进入后台时触发
  • 典型用途: 暂停任务、保存状态、释放资源
1export default {
2  onHide() {
3    console.log('App Hide');
4    // 保存播放进度
5    uni.setStorageSync('music_progress', this.currentProgress);
6  }
7}
8

onError(err)

  • 触发时机: JS 执行错误或 API 调用失败时
  • 典型用途: 全局错误上报、崩溃监控
1export default {
2  onError(err) {
3    console.error('全局错误:', err);
4    // 上报到 Sentry / Bugly
5    // reportError(err);
6  }
7}
8

onPageNotFound(res)

  • 触发时机: 打开不存在的页面时(如分享链接指向已删除页面)
  • 参数: res.path(不存在的路径)、res.query
  • 典型用途: 降级跳转到首页或404页
1export default {
2  onPageNotFound(res) {
3    console.warn('页面不存在:', res.path);
4    uni.redirectTo({ url: '/pages/index/index' });
5  }
6}
7

onThemeChange(res)

  • 触发时机: 系统深色/浅色模式切换时
  • 参数: res.theme'dark' | 'light'
1export default {
2  onThemeChange(res) {
3    console.log('主题切换:', res.theme);
4    // 通知全局状态更新
5    getApp().globalData.isDarkMode = res.theme === 'dark';
6  }
7}
8

2.3 应用生命周期四端对照表(重点收藏)

uni-appiOSAndroid鸿蒙 (ArkUI)Vue3 App 级说明
onLaunchapplication(_:didFinishLaunchingWithOptions:)Application.onCreate()AbilityStage.onCreate()app.onMount() (无直接对应)进程创建,全局仅一次
onShowapplicationDidBecomeActive(_:) / sceneDidBecomeActive(_:)Activity.onResume() / ProcessLifecycleOwner ON_STARTUIAbility.onForeground()进入前台/可见
onHideapplicationDidEnterBackground(_:) / sceneDidEnterBackground(_:)Activity.onPause() / ProcessLifecycleOwner ON_STOPUIAbility.onBackground()进入后台/不可见
onExitapplicationWillTerminate(_:)Activity.onDestroy() / Application.onTerminate()UIAbility.onDestroy()app.onUnmount()进程销毁(不一定触发)
onErrorNSSetUncaughtExceptionHandlerThread.UncaughtExceptionHandlerAbilityStage.onError()app.config.errorHandler全局异常捕获
onPageNotFoundrouter.onError()路由兜底
onThemeChangetraitCollectionDidChange(_:)onConfigurationChanged()Environment.colorScheme 变化深色模式切换

⚠️ 关键差异提醒:

  • iOS 的 applicationWillTerminate 在多任务杀进程时不一定被调用,uni-app 的 onExit 同理
  • Android 的 onDestroy 也不保证触发,不要在此做关键数据持久化
  • 鸿蒙的 UIAbility.onForeground/onBackground 是 Ability 级别,与 uni-app 的 App 级别不完全等价
  • Vue3 本身没有 App 级别的 show/hide 概念,这是 uni-app 针对移动端扩展的

三、页面生命周期详解(pages/*.vue)

页面生命周期是页面级别的,在每个 .vue 页面文件中监听。它管理的是单个页面从创建到销毁的过程。

3.1 完整页面生命周期流程图

1navigateTo / redirectTo / reLaunch
2              
3              
4        ┌──────────┐
5          onLoad    接收页面参数 options
6        └────┬─────┘
7             
8             
9        ┌──────────┐
10         onShow     每次页面显示都触发
11        └────┬─────┘
12             
13             
14      ┌─────────────┐
15        onReady      DOM/原生渲染完成(仅首次)
16      └──────┬──────┘
17             
18        用户操作/导航
19             
20     ┌───────┴───────┐
21                    
22┌──────────┐   ┌────────────┐
23  onHide      onUnload   
24(页面隐藏)    (页面销毁)   
25└──────────┘   └────────────┘
26                    
27                    
28  再次 onShow     生命周期结束
29

3.2 逐个详解 + 示例代码

onLoad(options)

  • 触发时机: 页面创建时触发,每个页面实例仅一次
  • 参数: options 为页面路由参数(URL query 解析后的对象)
  • 典型用途: 接收参数、初始化页面数据、发起首次请求
1// pages/detail/detail.vue
2export default {
3  onLoad(options) {
4    // options.id = "123" (来自 /pages/detail/detail?id=123)
5    this.productId = options.id;
6    this.loadProductDetail(options.id);
7  },
8  data() {
9    return { productId: '', product: {} }
10  },
11  methods: {
12    async loadProductDetail(id) {
13      const res = await getProductById(id);
14      this.product = res.data;
15    }
16  }
17}
18

onShow()

  • 触发时机: 页面每次显示时触发(包括首次加载和从其他页面返回)
  • 典型用途: 刷新列表、更新状态、埋点曝光
1export default {
2  onShow() {
3    // 每次回到此页面都刷新订单列表
4    this.refreshOrderList();
5    // 埋点
6    uni.reportEvent('page_view', { page: 'order_list' });
7  }
8}
9

onReady()

  • 触发时机: 页面初次渲染完成时触发(DOM/原生视图就绪)
  • 典型用途: 操作 DOM、初始化地图/视频/canvas 等需要视图就绪的组件
  • 注意: 仅在首次加载时触发,navigateBack 返回不会再次触发
1export default {
2  onReady() {
3    // 地图组件需要在 ready 后才能调用方法
4    this.mapContext = uni.createMapContext('myMap', this);
5    this.mapContext.moveToLocation();
6  }
7}
8

onHide()

  • 触发时机: 页面隐藏时触发(navigateTo 到新页面、切后台、切 Tab)
  • 典型用途: 暂停动画/视频、取消定时器
1export default {
2  onHide() {
3    // 暂停轮播图定时器
4    clearInterval(this.swiperTimer);
5  }
6}
7

onUnload()

  • 触发时机: 页面卸载时触发(navigateBackredirectToreLaunch
  • 典型用途: 清理资源、移除事件监听、取消网络请求
1export default {
2  onUnload() {
3    // 清除定时器
4    clearInterval(this.timer);
5    // 移除全局事件监听
6    uni.$off('cartUpdated', this.onCartUpdated);
7  }
8}
9

其他页面生命周期

函数触发时机用途
onPullDownRefresh()下拉刷新时需 pages.json 开启 enablePullDownRefresh
onReachBottom()滚动到底部时分页加载更多
onShareAppMessage()点击右上角分享时返回分享内容配置
onPageScroll(obj)页面滚动时obj.scrollTop;慎用,性能敏感
onResize(obj)窗口尺寸变化时横竖屏切换、折叠屏展开
onTabItemTap(obj)点击当前 TabBar 项时仅当前 Tab 页有效
onBackPress()返回键/手势/导航栏返回时可拦截返回行为,返回 true 阻止默认返回

3.3 页面生命周期四端对照表

uni-appiOSAndroid鸿蒙 (ArkUI)Vue3 组件生命周期说明
onLoadviewDidLoad() / init(coder:)onCreate()aboutToAppear()onBeforeMount页面创建,接收参数
onShowviewWillAppear(_:)onResume()onPageShow()onMounted (首次)页面可见
onReadyviewDidAppear(_:) (首次)onWindowFocusChanged(true) (首次)onDidBuild()onMounted视图渲染完成
onHideviewWillDisappear(_:)onPause()onPageHide()onBeforeUnmount (部分)页面不可见
onUnloaddeinit / viewDidDisappear (最终)onDestroy()aboutToDisappear()onUnmounted页面销毁
onPullDownRefreshUIRefreshControlSwipeRefreshLayoutRefresh 组件下拉刷新
onReachBottomscrollViewDidScroll + offset判断RecyclerView.OnScrollListenerList.onReachEnd触底加载
onBackPressnavigationController?.popViewController 拦截onBackPressedDispatcheronBackPress()返回拦截
onPageScrollscrollViewDidScroll(_:)OnScrollListeneronScroll()⚠️ 高频触发

四、Vue3 生命周期 vs uni-app 生命周期:两套体系如何共存?

这是很多开发者最容易混淆的点。uni-app 中实际上存在两套生命周期系统,它们各司其职:

4.1 双轨制对照

类别Vue3 标准生命周期uni-app 扩展生命周期职责划分
组件级onBeforeMount / onMounted / onBeforeUpdate / onUpdated / onBeforeUnmount / onUnmounted管理 DOM/虚拟节点 的创建、更新、销毁
页面级onLoad / onShow / onReady / onHide / onUnload / onPullDownRefresh / onReachBottom 等管理 页面路由、导航、交互 相关逻辑
应用级app.onMount / app.onUnmountonLaunch / onShow / onHide / onError 等管理 App 进程 的全局状态

4.2 执行顺序(关键!)

当一个页面首次加载时,两套生命周期的执行顺序如下:

1onLoad (uni-app)           最早,接收参数
2    
3    
4onBeforeMount (Vue3)      虚拟 DOM 即将挂载
5    
6    
7onMounted (Vue3)          虚拟 DOM 挂载完成
8    
9    
10onReady (uni-app)         原生视图/真实 DOM 渲染完成
11    
12    
13onShow (uni-app)          页面可见
14

⚠️ 重要区别:

  • onMountedonReadyonMounted 表示 Vue 虚拟 DOM 挂载完成,但原生视图可能还没渲染好;onReady 才表示真实视图就绪
  • 操作 canvas/map/video 等原生组件,必须在 onReady,而非 onMounted
  • onShowonReady 之后触发,且每次页面显示都会触发

4.3 Composition API 中的写法

如果你使用 Vue3 <script setup> 语法,两套生命周期都可以直接使用:

1<script setup>
2import { ref, onMounted, onUnmounted } from 'vue';
3import { onLoad, onShow, onReady, onUnload } from '@dcloudio/uni-app';
4
5const productId = ref('');
6const product = ref({});
7
8//  uni-app 页面生命周期
9onLoad((options) => {
10  productId.value = options.id;
11  console.log('onLoad:', options);
12});
13
14onShow(() => {
15  console.log('onShow');
16});
17
18onReady(() => {
19  console.log('onReady - 可以操作原生组件了');
20});
21
22onUnload(() => {
23  console.log('onUnload - 清理资源');
24});
25
26//  Vue3 组件生命周期
27onMounted(() => {
28  console.log('onMounted - 虚拟DOM已挂载');
29});
30
31onUnmounted(() => {
32  console.log('onUnmounted - 组件卸载');
33});
34</script>
35

📖 注意:<script setup> 中使用 uni-app 页面生命周期,需要从 @dcloudio/uni-app 导入。这些是 uni-app 对 Vue3 的组合式函数扩展。


五、JS 架构深层理解:Options API vs Composition API 的生命周期注册机制

作为资深工程师,理解框架"怎么做到的"比"怎么用"更重要。

5.1 Options API:基于对象 key 名的约定式注册

1// 你写的代码
2export default {
3  data() { return { count: 0 } },
4  methods: { add() { this.count++ } },
5  onLoad(opts) { /* ... */ },
6  onShow() { /* ... */ }
7}
8

框架内部伪代码:

1function createComponentInstance(options) {
2  const instance = {};
3  
4  for (const key in options) {
5    if (key === 'data') {
6      // 响应式处理
7      instance.data = reactive(options.data());
8    } else if (key === 'methods') {
9      // 绑定 this
10      Object.keys(options.methods).forEach(m => {
11        instance[m] = options.methods[m].bind(instance);
12      });
13    } else if (LIFECYCLE_HOOKS.includes(key)) {
14      // 🔑 关键:识别生命周期 key,注册到调度器
15      registerLifecycleHook(instance, key, options[key]);
16    } else {
17      // 其他属性直接挂载
18      instance[key] = options[key];
19    }
20  }
21  return instance;
22}
23
24const LIFECYCLE_HOOKS = [
25  'onLoad', 'onShow', 'onReady', 'onHide', 'onUnload',
26  'onPullDownRefresh', 'onReachBottom', 'onShareAppMessage',
27  'onPageScroll', 'onResize', 'onTabItemTap', 'onBackPress',
28  'mounted', 'beforeMount', 'unmounted', 'beforeUnmount'
29];
30

5.2 Composition API:基于显式函数调用的声明式注册

1// 你写的代码
2import { onLoad, onShow } from '@dcloudio/uni-app';
3import { onMounted } from 'vue';
4
5onLoad((opts) => { /* ... */ });
6onShow(() => { /* ... */ });
7onMounted(() => { /* ... */ });
8

框架内部伪代码:

1// @dcloudio/uni-app 中的实现
2let currentInstance = null;
3
4export function onLoad(callback) {
5  // 获取当前正在创建的组件实例
6  const instance = getCurrentInstance();
7  // 将回调注册到实例的生命周期队列中
8  instance.lifecycleHooks.onLoad = callback;
9}
10
11export function onShow(callback) {
12  const instance = getCurrentInstance();
13  instance.lifecycleHooks.onShow = callback;
14}
15

5.3 两种方式的本质区别

维度Options APIComposition API
注册方式对象 key 名约定显式函数调用
识别机制框架遍历 key 名匹配开发者主动调用注册函数
灵活性固定结构,不易拆分可按逻辑关注点自由组织
TypeScript 支持较弱(需额外类型声明)天然支持(函数有明确类型)
代码复用Mixin(命名冲突风险)Composables(清晰无冲突)
推荐场景简单页面、快速原型复杂业务、团队协作、长期维护

六、实战最佳实践与避坑指南

6.1 数据初始化放哪里?

场景推荐位置原因
依赖 URL 参数的数据onLoad只有这里能拿到 options
不依赖参数的静态数据data() / ref()声明即初始化
每次进入都需要刷新的数据onShow返回时也能刷新
需要 DOM 就绪的数据onReady如地图中心点、canvas 尺寸
全局共享数据App.globalData / Pinia跨页面共享

6.2 常见坑点速查

坑点现象解决方案
onLoad 中跳转白屏App 未完全初始化改用 onShow 或 setTimeout 延迟跳转
onMounted 中操作 map 报错原生视图未就绪改用 onReady
onShow 中拿不到最新参数onShow 无 options 参数在 onLoad 中存到 data,onShow 中读取
onPageScroll 卡顿高频触发导致通信开销用 CSS position: sticky 替代,或节流处理
onUnload 不触发使用了 switchTab 而非 navigateBackTab 页用 onHide 代替
globalData 修改后页面不更新非响应式在 onShow 中重新赋值,或改用 Pinia
H5 端 onLoad 参数丢失浏览器刷新导致H5 端建议用 Vue Router 的 route.query 辅助

6.3 生命周期选择决策树

1需要在某个时机执行代码?
2    
3    ├─  App 进程相关?
4       ├─ 初始化/SDK ──► onLaunch
5       ├─ 前后台切换 ──► onShow / onHide
6       └─ 全局错误 ──► onError
7    
8    ├─ 与页面导航相关?
9       ├─ 接收参数 ──► onLoad
10       ├─ 每次显示刷新 ──► onShow
11       ├─ 返回拦截 ──► onBackPress
12       └─ 页面销毁清理 ──► onUnload
13    
14    ├─ 与视图渲染相关?
15       ├─ 操作原生组件 ──► onReady
16       ├─ DOM 操作(Vue) ──► onMounted
17       └─ 组件卸载 ──► onUnmounted
18    
19    └─ 与用户交互相关?
20        ├─ 下拉刷新 ──► onPullDownRefresh
21        ├─ 触底加载 ──► onReachBottom
22        ├─ 滚动监听 ──► onPageScroll (⚠️慎用)
23        └─ 分享 ──► onShareAppMessage
24

七、总结:四端生命周期全景对照表

uni-appiOSAndroid鸿蒙Vue3层级
onLaunchdidFinishLaunchingApplication.onCreateAbilityStage.onCreateApp
onShowdidBecomeActiveonResumeonForegroundApp
onHidedidEnterBackgroundonPauseonBackgroundApp
onExitwillTerminateonDestroyonDestroyapp.onUnmountApp
onLoadviewDidLoadonCreateaboutToAppearonBeforeMountPage
onShow (页面)viewWillAppearonResumeonPageShowonMountedPage
onReadyviewDidAppearonWindowFocusChangedonDidBuildonMountedPage
onHide (页面)viewWillDisappearonPauseonPageHidePage
onUnloaddeinitonDestroyaboutToDisappearonUnmountedPage

💡 给多端原生工程师的一句话: uni-app 的生命周期设计是对 iOS/Android/鸿蒙三者最大公约数的抽象。onLoad ≈ viewDidLoad ≈ onCreate ≈ aboutToAppearonShow ≈ viewWillAppear ≈ onResume ≈ onPageShow。掌握了这个映射关系,你就能在四种技术栈之间自如切换。框架在变,生命周期的本质思想从未改变。


📚 参考资料:


uni-app 生命周期深度解析(iOS / Android / 鸿蒙 / Vue3 四端对照)》 是转载文章,点击查看原文


相关推荐


GPT 5.6 的真正变革:从"最强模型"到"最合适模型",AI 工程范式正在重置
浮生望2026/7/29

摘要: GPT 5.6以Sol、Terra、Luna三层架构重新定义AI使用方式。跑分不再决定竞争力,真正的差距在于把什么任务分给什么模型,用更少Token和更少返工完成更高质量交付。AI正从顾问变成协作者。 每次新模型发布,人们都在问同一个问题,但那个问题已经过时了 GPT 5.6 发布后,讨论一如既往地集中在几个老问题上:跑分涨了多少?代码能力有没有超过 Claude?谁又成了"最强模型"? 这些问题很重要,但如果你只盯着它们,就错过了 GPT 5.6 真正改变游戏规则的地方。 Open


影像创作领域的GitHub!深度体验了这个国产AI,我卸了3个AI视频工具!
程序员X小鹿2026/7/21

大家好,我是X小鹿,今天分享一个不一样的 AI 视频工具。 以前做一条 AI 短片,从剧本创作、脚本编写、到角色定妆、场景道具生成、再到分镜生成、视频生成,以及最后的剪辑成片,每一步都需要用到单独的工具。 生成一条短片,需要在多个工具间来回切换。 后来也陆续出现了一些 AI 视频工具,把上面的很多流程都集成在了一个平台上,用起来确实比之前方便了不少。 最近用了 AI 视频创作平台 updream ,发现它虽然也是将很多功能集成在了一起,但和之前接触的一些 AI 视频工具又不太一样。 体验下来,


图像的分辨率
元來2026/7/12

一、什么是分辨率 图像分辨率表示: 图像能够表示多少空间细节,或者图像在水平和垂直方向上包含多少个像素。 日常最常见的分辨率写法是: 宽度 × 高度 例如: 1920 × 1080 4096 × 4096 6144 × 6144 其中: 1920表示图像水平方向有1920个像素;1080表示图像垂直方向有1080个像素。 因此一张1920 × 1080的图像,像素总数为:1920×1080=2,073,600 即大约207万个像素,也可以称为约200万像素图像。 二、


OpenCV-Python实战(31)——实时面部情绪检测与识别系统
盼小辉丶2026/7/4

OpenCV-Python实战(31)——实时面部情绪检测与识别系统 0. 前言1. 规划应用程序1. 人脸检测1.1 基于 Haar 的级联分类器1.2 预训练的级联分类器1.3 使用预训练的级联分类器1.4 FaceDetector 类 2. 收集数据2.1 构建训练数据集2.2 运行应用程序2.3 实现数据收集器 GUI 3. 面部情绪识别3.1 处理数据集3.2 多层感知机3.3 构建 MLP用于面部表情识别 4. 整合所有内容小结系列链接 0. 前言 我


2026年6月远程控制软件横评:UU远程、ToDesk、向日葵全方位对比
凤年徐2026/6/26

2026远程控制软件横评:UU远程、ToDesk、向日葵全方位对比 远程控制早已不是“应急连一下电脑”那么简单了。开发者用它连服务器改代码,设计师用它调家里的渲染机,留学生用它操作国内的网盘和银行App,甚至游戏玩家也用它“云挂机”。市面上主流的三款工具——UU远程、ToDesk、向日葵——各有拥趸,但到底谁在哪个场景下更顺手?这篇横评不吹不黑,直接把你最关心的七个核心能力摆在一起,逐项对比。 一、终端能力:谁能让开发者真正扔掉SSH客户端? 对于开发者、运维和AI训练者来说,远程命令行是最


JavaScript 函数性能优化:配置驱动 + 按需计算实战指南
m0_733915432026/6/17

JavaScript 函数优化是前端性能调优的核心环节。当业务逻辑中存在多层条件分支与重复计算时,代码不仅执行效率低下,还难以维护和扩展。本文将基于真实业务场景,提供一套配置驱动的优化方案,通过规则表集中管理 + 按需计算策略,帮助你提升函数执行效率 80% 以上。 为什么传统条件分支会拖累性能? 理解问题根源是有效优化的前提。传统 if-else 嵌套方案存在三大性能瓶颈: 问题类型 具体表现 性能影响 重复计算


PySide6 + Qt Designer + PyCharm 完整开发流程
资深流水灯工程师2026/6/10

PyCharm 对 Python 桌面开发有更完善的支持,包括智能代码补全、断点调试、集成终端、版本控制等功能,结合 Qt Designer 的可视化 UI 设计,是工业级上位机开发的首选组合。以下是完全适配 PyCharm 的标准化开发流程。 一、环境准备与 PyCharm 配置 1. 创建项目并配置虚拟环境(必做) PyCharm 强烈推荐使用虚拟环境隔离项目依赖,避免版本冲突: 打开 PyCharm → 新建项目 (New Project)选择项目位置,命名为test_equipm


claude-code下载安装与使用
veminhe2026/6/2

1、官方网站 Claude Code by Anthropic | AI Coding Agent, Terminal, IDE 2、github的项目地址 GitHub - anthropics/claude-code: Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing ro


从社区路标到生态基石:Dave Verwer 的新篇章 -- 肘子的 Swift 周报 #137
东坡肘子2026/5/26

从社区路标到生态基石:Dave Verwer 的新篇章 Dave Verwer 在 iOS Dev Weekly 第 751 期宣布,这份已经持续近 15 年的周报将交由新的团队继续运营,而他自己接下来会全职投入 Swift Package Index。我的博客在早期获得关注,也曾得益于 iOS Dev Weekly 的推荐;而我在周报中坚持撰写每期周评,同样在很大程度上受到 Dave Verwer 的启发。对于很多 Apple 平台开发者来说,iOS Dev Weekly 早已不只是一份链接合


C 标准库 - <assert.h>
lsx2024062026/5/4

C 标准库 - <assert.h> 引言 在C语言编程中,错误检测和处理是保证程序稳定性和可靠性的重要环节。《assert.h》头文件提供了用于在开发过程中进行断言检查的函数,这些函数在编译时默认是开启的。本文将详细介绍C标准库中<assert.h>的相关内容,包括其使用方法、作用以及在实际开发中的应用。 断言简介 断言(assertion)是一种用于在程序运行时检测错误的方法。当断言的条件为假时,程序将终止运行,并打印出错误信息。这使得开发者能够快速定位并修复代码中的问题。 <assert.

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读