聊聊小程序的双线程架构

前言

  • 常网IT源码上线啦!
  • 本篇录入吊打面试官专栏,希望能祝君拿下Offer一臂之力,各位看官感兴趣可移步🚶。
  • 有人说面试造火箭,进去拧螺丝;其实个人觉得问的问题是项目中涉及的点 || 热门的技术栈都是很好的面试体验,不要是旁门左道冷门的知识,实际上并不会用到的。
  • 接下来想分享一些自己在项目中遇到的技术选型以及问题场景。

对AI的恐惧。

我们感到不安,是因为我们手中的旧地图,正在失效。我们赖以生存的规则,正在改变。但是,我们并不是站上了悬崖边。我们只是站在了一片新大陆的岸边。这片大陆,物产丰饶,但也充满了未知的挑战。我们每个人,都像第一批登陆的探险家。有的人,看到的是猛兽和风暴,感到恐惧,选择留在船上。而有的人,看到的是前所未见的植物和矿藏,他们选择拿起工具,学习如何与这片大陆共存,如何利用新的资源,去建造一个前所未见的家园。所以,不要害怕。我们唯一要做的,就是勇敢地,踏上这片新大陆。就像迪迦,未来的路,就在脚下。

周末终于出太阳了。

一、前言

为什么小程序是双线程架构。

因为单线程会阻塞渲染、全局状态会污染。

评估维度 传统Web单线程 小程序双线程 性能对比
首屏渲染时间 1200ms 650ms ⬇️ 减少46%
JS错误影响范围 整个页面崩溃 逻辑层隔离 🔒 安全隔离
DOM操作安全风险 高风险 物理隔离 🛡️ 风险消除
60FPS达标率 45% 92% ⬆️ 翻倍提升
内存泄漏影响 全局 线程级隔离 🔄 局部影响

安全隔离

  • 逻辑层与渲染层物理隔离

  • 禁止跨线程DOM操作

java 复制代码
// 安全拦截实现
Object.defineProperty(window, 'document', {
  get() {
    throw new Error('DOM access forbidden in service thread');
  },
  configurable: false
});

直入正文。

🤡官接着往下追问:你说get的时候调用了track,set的时候调用了trigger,那他们内部具体做了什么?

二、双线程

逻辑层:纯数据处理中心

无法直接操作DOM,因为这样子的好处可以避免恶意脚本攻击。

  • 数据请求

  • 状态管理

  • 事件处理

  • API调用

逻辑层运行在独立的js线程(JavaScriptCore)

JavaScriptCore 是苹果公司开发的 JavaScript 引擎框架,主要用于 iOS/macOS 平台的 WebKit 浏览器引擎和原生应用开发

渲染层:专注UI呈现

  • WXML解析

  • 样式计算

  • 布局渲染

  • 事件捕获

渲染层运行在WebView线程,每个页面都是一个独立实例。

根据逻辑层传递的数据动态渲染,即数据驱动更新。

系统层:逻辑渲染层的通信

  • JSBridge:序列化传递数据(JSON 格式)。

  • 安全管控:拦截非法操作(如直接访问 DOM)。

  • 原生 API:调用摄像头、地理位置等硬件功能。

JSBridge 是 JavaScript 与原生代码(Java/Objective-C/Swift)之间的双向通信桥梁。在混合开发架构中(如小程序、React Native、WebView 等)

通信协议层 实现 JS 与原生之间的方法互调

java 复制代码
// JS 调用原生摄像头
JSBridge.invoke('openCamera', { quality: 'high' });

// 原生回调 JS
JSBridge.subscribe('onPhotoTaken', (photo) => { ... });

跨线程通信(以小程序为例) 在小程序架构中:

  • 逻辑层(Service)运行在独立 JS 线程

  • 渲染层(View)运行在 WebView 线程

  • JSBridge 负责这两个线程间的数据传递

序列化处理 当逻辑层向视图层发送 10KB 数据时:

java 复制代码
// 逻辑层序列化
const payload = JSON.stringify(bigData);
JSBridge.postMessage(payload); 

// 视图层反序列化
const data = JSON.parse(receivedPayload);

这个过程会产生约 3-5ms 的序列化开销(具体取决于设备性能)

安全沙箱 在 WebView 中通过 iframe 或 prompt/console 劫持等方式实现安全通信:

java 复制代码
// 典型实现方式
iframe.src = 'jsbridge://methodName?params=xxx';

应用场景:

  • 小程序(微信/支付宝)

  • React Native

  • Cordova/PhoneGap

  • WebView 嵌入页与原生交互

三、安全架构设计

攻击场景防御:

  1. 静态代码扫描(AST分析)

  2. 动态行为监控

  3. 内存使用画像

java 复制代码
// 原型链污染防护
const originalProto = Object.prototype;
Object.prototype = new Proxy(originalProto, {
  set(target, prop, value) {
    if (prop === '__proto__' || prop === 'constructor') {
      throw new Error('Prototype pollution blocked');
    }
    return Reflect.set(target, prop, value);
  }
});

// iframe攻击防御
window.addEventListener('message', (event) => {
  if (event.origin !== 'https://trusted-domain.com') {
    event.source.postMessage('Access denied', event.origin);
    return;
  }
  // 处理安全消息
});

约束创造自由

  • 通过DOM隔离实现安全

  • 通过线程分离保障性能

架构即取舍

  • 在安全与性能间找到平衡点

  • 在开发效率与运行效率间取得最优解

  • 在技术创新与向下兼容间保持张力

至此撒花~

后记

我们在实际项目中或多或少遇到一些奇奇怪怪的问题。

自己也会对一些写法的思考,为什么不行🤔,又为什么行了?

最后,祝君能拿下满意的offer。

我是Dignity_呱,来交个朋友呀,有朋自远方来,不亦乐乎呀!深夜末班车

👍 如果对您有帮助,您的点赞是我前进的润滑剂。

以往推荐

为什么一定要有微任务,直接一个宏任务不行吗

Vue性能优化:从加载提速到运行时优化

vue2和Vue3和React的diff算法展开说说:从原理到优化策略

前端哪有什么设计模式

小小导出,我大前端足矣!

前端仔,快把dist部署到Nginx上

多图详解,一次性啃懂原型链(上万字)

Vue-Cli3搭建组件库

Vue实现动态路由(和面试官吹项目亮点)

VuePress搭建项目组件文档

原文链接

juejin.cn/post/753759...

相关推荐
WebInfra6 分钟前
Rsdoctor 1.2 发布:打包产物体积一目了然
前端·javascript·github
用户527096487449039 分钟前
SCSS模块系统详解:@import、@use、@forward 深度解析
前端
兮漫天39 分钟前
bun + vite7 的结合,孕育的 Robot Admin 【靓仔出道】(十一)
前端·vue.js
xianxin_40 分钟前
CSS Text(文本)
前端
秋天的一阵风41 分钟前
😈 藏在对象里的 “无限套娃”?教你一眼识破循环引用诡计!
前端·javascript·面试
电商API大数据接口开发Cris1 小时前
API 接口接入与开发演示:教你搭建淘宝商品实时数据监控
前端·数据挖掘·api
用户1409508112801 小时前
原型链、闭包、事件循环等概念,通过手写代码题验证理解深度
前端·javascript
汪子熙1 小时前
错误消息 Could not find Nx modules in this workspace 的解决办法
前端·javascript
东亚_劲夫1 小时前
嵌入式概念及硬件构成
架构
skeletron20111 小时前
🚀AI评测这么玩(2)——使用开源评测引擎eval-engine实现问答相似度评估
前端·后端