当前位置: 首页 > news >正文

【微信小程序实战教程】之微信小程序中的 JavaScript

微信小程序中的 JavaScript

微信小程序的业务逻辑都是通过JavaScript语言来实现的,本章我们将详细的讲解JavaScript的基本概念,以及在小程序中如何使用JavaScript语言。JavaScript是一种轻量的、解释型的、面向对象的头等函数语言,是一种动态的基于原型和多范式的脚本语言,支持面向对象、命令式和函数式的编程风格。

1 小程序的运行环境

1.1 MINA 框架介绍

小程序的开发框架被称为MINA框架,其框架结构如图1所示。
在这里插入图片描述
图1 MINA框架结构

通过上面的框架结构图,我们可以看到小程序的MINA框架有三个部分组成,首先是View视图层,其次是App Service逻辑层和Native系统层。小程序中所有的页面都在View视图层中,每个页面由WXML文件和WXSS文件来搭建页面视图的结构和展现样式。

App Service逻辑层是由App Service线程来加载、运行的,其生命周期常驻内存。App Service逻辑层顾名思义就是用来处理业务逻辑的,是MINA框架的数据交互服务中心。逻辑层有两个部分组成,一个是Manager,其主要功能是负责小程序逻辑处理部分的执行;另一个部分是底层提供的WAService.js文件,用于封装小程序的所有API接口,让其他平台的运行环境能够通过封装的API来使用微信客户端的能力。

小程序的MINA框架第三部分是Native系统层,这一层中接入了微信客户端的原生能力。小程序的视图层和逻辑层是双向通信的,在视图层和逻辑层之间提供了数据传输和事件系统。在视图层和逻辑层通过系统层的JSBridge进行通信,逻辑层把数据变化通知到视图层,然后触发视图层的页面更新,然后视图层再把事件通知给逻辑层进行业务处理。

那么在小程序的视图层中,是如何把数据变化实时地展示出来的呢?

首先,WXML其实就是一个具有元素、属性和文本的节点树结构,在节点树结构中,每一个节点都有一个上下文的关系,所以在渲染WXML的时候,小程序的运行环境会把WXML节点树转换成一个JavaScript对象。当逻辑层发生数据变更时,就需要通过App Service逻辑层提供的setData()方法把数据从逻辑层传递到视图层。微信客户端的WebView容器在渲染节点内容时,会把传递的数据进行前后的差异对比,然后再通过diff算法进行计算,将计算后的结果应用在原来的节点树上,最后渲染出正确的UI界面。

学习小程序的MINA框架的底层实现原理可以帮助我们更加清晰的了解和认识小程序的开发,小程序在MINA框架上做了很多的优化,例如当逻辑层的App Service线程遇到阻塞时,UI线程照样可以正常地处理和渲染视图,这样也就避免了跨线程通信时的内存消耗。其实,小程序对MINA框架优化的地方还有很多,例如在小程序启动时也做了一些优化处理,这就需要我们继续学习小程序的启动和运行机制。

1.2 小程序启动机制

大家在平常使用小程序的过程中肯定会到这种情况,就是在小程序首次打开并启动的情况下,启动过程较长,如果后续再次打开的话,启动的速度就会很快。那么小程序是如何启动的呢?

其实,小程序有两种启动状态,一种是热启动,另一种是冷启动。

首先,我们先来看一下什么是热启动。当用户已经打开过某个小程序后,在一定时间内再次打开该小程序,就不需要再次重新启动了,只需要把后台态的小程序切换到前台使用即可,这个启动过程就是热启动。

小程序的冷启动是指用户首次打开的小程序被微信主动销毁后,再次打开该小程序就需要重新启动。小程序在什么情况下会被主动销毁呢?这里有两种情况,一种是小程序进入后台状态之后,客户端会帮助用户在一定时间内维持小程序的启动状态,当超过一定时间之后,微信客户端会主动销毁处于后台状态的小程序,这个超时时间默认为五分钟。另外一种情况,就是当小程序在短时间内连续收到两次以上的系统告警时,微信客户端也会主动销毁正处于后台状态的小程序,每次系统告警的间隔时间默认为五秒。

在小程序冷启动时,如果发现有新的版本,就会帮助用户异步下载最新版本的代码包,并同时使用微信客户端的本地代码包进行启动。小程序异步下载的最新版本的代码包需要下次重启启动小程序时才能被应用到小程序中,如果需要在本次下载最新版本代码包后就应用到小程序中,需要通过小程序提供的API来实现。

1.3 小程序加载机制

在了解过小程序的启动机制后,我们再来看一下小程序的启动流程,小程序的启动流程如图2所示。

在这里插入图片描述
图2 小程序的启动流程图

通过上面的小程序启动流程图我们可以看到,在图的左侧部分是小程序启动的时候,微信客户端里面的视图层和逻辑层的交互逻辑以及数据缓存的存取操作。在小程序启动时,会向CDN服务器请求最新版本的代码包。如果是第一次启动的话,用户要等到代码包下载完毕,并将最新代码注入到Web容器内执行之后才能看到小程序的页面。如果遇到网络不好的情况,用户就会感觉小程序启动的时间较长,微信客户端会吧代码包缓存到本地,在下次启动时,会从CDN服务器上请求是否有最新版本的代码包。

CDN其实就是一个内容分发网络,主要作用是帮助用户把请求的内容分发到距离用户最近的一个网络节点服务器,提高用户访问的响应速度和成功率,以此来解决网络带宽和服务器性能延迟的问题。

小程序在启动时会做一些校验,当有最新版本的代码包时,小程序会运行之前已经缓存好的代码包,同时异步下载最新版本的代码包,让用户在下次启动时来使用。

1.4 小程序对JavaScript的支持

微信小程序的主要开发语言就是JavaScript语言,开发者可以使用JavaScript语言来开发小程序的业务逻辑以及调用小程序的API来完成业务需求。

JavaScript是遵循ECMAScript标准,ECMAScript是一种由Ecma国际通过ECMA-262标准化的脚本程序设计语言, JavaScript是ECMAScript的一种实现。理解JavaScript是ECMAScript一种实现后,可以帮助开发者理解小程序中的JavaScript同浏览器中的JavaScript以及Node.js中的JavaScript是不相同的。

遵循ECMAScript标准的JavaScript语言由以下几个部分组成:

  • 基础语法
  • 数据类型
  • 语句
  • 关键字
  • 操作符
  • 对象

浏览器中的JavaScript构成如图3所示。

在这里插入图片描述
图3 浏览器中的JavaScript

浏览器中的JavaScript是由ECMAScript、DOM(全称 Document Object Model,即文档对象模型)、BOM(全称 Browser Object Model,即浏览器对象模型)三部分组成的,其中DOM和BOM对象模型为Web前端开发者提供了让操作浏览器的API,用于修改浏览器的表现,例如修改URL、修改页面展示、数据记录等。

Node.js是基于Google v8引擎实现的JavaScript运行时,它使用了高效、轻量的事件驱动以及非阻塞的IO模型。我们通常会将Node.js作为一门后端语言来使用。Node.js中的JavaScript构成如图4所示。

在这里插入图片描述
图4 Node.js中的JavaScript

Node.js中的JavaScript是由ECMAScript、NPM以及Native模块组成。其中,NPM是Node.js的包管理系统,通过NPM可以拓展各种包来快速实现一些功能,同时通过一些Native原生模块来实现Node.js语言本身不具有的能力,例如FS文件操作、HTTP请求等。

了解过浏览器的JavaScript和Node.js的JavaScript实现之后,我们再来看一下小程序的JavaScript实现。小程序的JavaScript构成如图5所示。

在这里插入图片描述
图5 小程序中的JavaScript

小程序的JavaScript是由ECMAScript、小程序框架、小程序封装的API模块组成的,与浏览器中的JavaScript相比,小程序的JavaScript没有BOM和DOM模型对象,所以类似于jQuery、Zepto这种浏览器类库是无法在小程序中运行的。而且,小程序中的JavaScript缺少Native原生模块和NPM包管理的机制,在小程序中是无法加载原生库以及无法直接使用NPM包的,如果想要使用NPM包,需要通过微信开发者工具提供的构建NPM功能来实现。

1.5 小程序宿主环境差异

小程序的JavaScript除了与浏览器的JavaScript以及Node.js的JavaScript实现有所不同之外,在小程序中,不同平台的JavaScript脚本运行环境也是有所不同的。小程序JavaScript脚本的运行环境主要包含以下三个平台的运行环境。

  • iOS平台上,小程序的JavaScript代码运行在JavaScriptCore中,由WKWebView进行渲染;
  • Android平台上小程序的JavaScript代码通过X5内核解析,然后由X5内核进行渲染;
  • 在微信开发者工具中,小程序的JavaScript代码运行在nwjs中,由ChromeWeb进行渲染;

微信开发者工具中的nwjs是基于Chrome和Node.js运行的,又被称为Node Webkit,内部封装了webkit的内核,提供了桌面应用的运行环境,让浏览器中运行的网页程序也可以在桌面程序中运行。小程序宿主环境如图6所示。

在这里插入图片描述
图6 小程序宿主环境差异

在小程序的三个宿主环境中关于ECMAScript标准的实现是不一致的,ECMAScript标准截止到目前一共有八个版本,在Web前端开发中大部分环境使用的是ES5和ES6标准。但是目前在小程序中,iOS8、iOS9系统所使用的运行环境并没有完全兼容到ES6的标准,所以ES6的一部分语法和关键字在小程序中是不兼容的。这就导致在微信开发者工具中和真机中运行时,同样的代码所呈现的效果会出现不一致的情况。针对这种问题,在开发微信小程序时可以使用微信开发者工具上的远程调试功能,实时查看小程序在真机上的表现。

2 生命周期

2.1 应用的生命周期

小程序的生命周期分为小程序应用生命周期和小程序的页面生命周期,我们先来看一下小程序应用生命周期,如图7所示。

在这里插入图片描述
图7 小程序应用生命周期

小程序应用生命周期有四个钩子函数,分别是onLaunch、onShow、onHide、onError,具体代码实现如例1所示。

【例1】小程序应用生命周期

// app.js
App({onLaunch() {},onShow() {},onHide() {},onError() {}
})

当用户第一次进入小程序的时候,微信客户端会帮助用户初始化小程序的运行环境,同时会从CDN服务器下载或者是从本地缓存中获取小程序的代码包,然后把代码注入到运行环境中。小程序初始化完成后,微信客户端会向小程序逻辑层的app.js文件中的app实例派发onLaunch事件,此时就会调用app.js文件中的App构造器参数上定义的onLaunch()钩子函数。

在进入小程序后,用户可以通过小程序界面右上角的关闭按钮或者是手机上的home键离开小程序,离开后并没有立即销毁小程序,而是进入后台状态,此时就会调用App构造器参数上定义的onHide()钩子函数。当用户通过热启动再次回到小程序时,微信客户端会把后台状态的小程序唤醒,此时小程序进入前台状态,同时调用App构造器参数上的onShow()钩子函数。当小程序发生脚本错误时,或者小程序API调用失败时,会触发App构造器参数上的onError()钩子函数。

2.2 页面的生命周期

小程序页面生命周期钩子函数如图8所示。

在这里插入图片描述
图8 小程序页面生命周期

小程序页面生命周期有五个钩子函数,分别是onLoad、onShow、onReady、onHide以及onUnload。其具体代码实现如例2所示。

【例2】小程序页面生命周期

// page.js
Page({onLoad(options) {}, // 监听页面加载onReady() {}, // 监听页面初次渲染完成onShow() {}, // 监听页面显示onHide() {}, // 监听页面隐藏onUnload() {} // 监听页面卸载
})

当小程序页面加载时,微信客户端会向逻辑层定义的page实例派发一个onLoad事件,此时Page构造器参数上定义的onLoad()钩子函数就会被调用,unLoad()方法在页面被销毁之前只会调用一次,在该方法中可以获取到当前页面被调用时的一些打开参数。

小程序页面显示之后,Page构造器参数所定义的onShow()构子函数就会被调用,onShow()方法是在每次页面显示时都会被调用,页面初始化完成后也会被调用一次,当用户从别的页面返回当前页面时也会被调用。在当前页面初次渲染完成后,Page构造器参数上定义的onReady()钩子函数就会被调用,onReady()方法是在onShow()方法之后被调用的,并且在当前页面被销毁之前只会调用一次。

onReady()方法被触发之后,逻辑层就开始与视图层进行交互了,用户在当前页面基础上再次打开一个新页面时,当前页面会触发Page构造器参数上定义的onHide()钩子函数,在关闭当前页面时,会触发Page构造器参数上的onUnload()钩子函数。

小程序是由两大线程组成,分别是负责页面视图的View线程和处理数据与服务的App Service线程,两大线程如图9所示。

在这里插入图片描述
图9 View线程和App Service线程

两大线程协同工作来完成小程序页面生命周期的调用。当小程序首次启动后,两个线程会被同时创建,当App Service线程创建后会依次调用onLoad()onShow()方法,开发者可以在这两个方法内发送HTTP请求。当View线程初始完毕之后,App Service线程也已经初始化完毕,此时也会触发页面的首次渲染。View线程渲染完页面后,会再次告诉App Service线程渲染结果,同时也会触发onReady()钩子函数的调用。onReady()钩子函数调用完毕后,如果之前发送的HTTP请求已经拿到服务器返回的数据,那App Service线程就会把服务返回的数据再次发送给View线程,View线程再次渲染视图,直到当前页面销毁并触发App Service线程的onUnload()钩子函数。

3 模块化

在小程序中,可以将一些公共代码抽离成一个单独的JavaScript文件,一个JavaScript文件就是一个模块,一个JavaScript文件中也可以有多个模块。模块可以通过module.exports或者exports对外暴露接口。exports是module.exports的一个引用,如果在模块中随意更改exports的指向会造成未知的错误,所以推荐使用module.exports来暴露模块接口。

模块对外暴露接口的代码如例3所示。

【例3】导出模块

// common.js
function sayHello(name) {console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {console.log(`Goodbye ${name} !`)
}module.exports.sayHello = sayHello
exports.sayGoodbye = sayGoodbye

在需要使用这些模块的文件中,使用require将公共代码引入,实现代码如例4所示。

【例4】导入模块

var common = require('common.js')
Page({helloMINA: function() {common.sayHello('MINA')},goodbyeMINA: function() {common.sayGoodbye('MINA')}
})

4 小程序的API

为方便开发,微信小程序封装了一些API模块,方便开发者快速实现一些功能,这些API模块包括调用移动设备的基础能力、访问移动设备的硬件能力以及微信的开放能力。

小程序API提供的开发能力包括网络访问、存储、路由、跳转、转发、界面交互、数据缓存、系统文件访问、位置等一系列模块。开发者可以借助这些API实现更多的需求开发,我们会在后面的章节中详细介绍小程序的核心API。

5 本章小结

本章主要介绍了微信小程序的JavaScript实现,以及微信小程序中的JavaScript与浏览器的JavaScript和Node.js中的JavaScript的区别。通过本章的学习,了解了微信小程序的启动和加载机制,掌握小程序应用生命周期和页面生命周期钩子函数,这些钩子函数在小程序项目的开发中应用非常广泛,需要初学者熟练掌握。

相关文章:

【微信小程序实战教程】之微信小程序中的 JavaScript

微信小程序中的 JavaScript 微信小程序的业务逻辑都是通过JavaScript语言来实现的,本章我们将详细的讲解JavaScript的基本概念,以及在小程序中如何使用JavaScript语言。JavaScript是一种轻量的、解释型的、面向对象的头等函数语言,是一种动态…...

K-近邻算法(一)

一、 K- 近邻算法 (KNN) 概念 1.1 K- 近邻算法 (KNN) 概念 K Nearest Neighbor 算法⼜叫 KNN 算法,这个算法是机器学习⾥⾯⼀个⽐较经典的算法, 总体来说 KNN 算法是相对⽐ 较容易理解的算法 定义 : 如果⼀个样本在特征空间中的k 个最相似 ( 即特征空间…...

从零开始之AI视频制作篇

从零开始之AI视频制作篇 文章目录 从零开始之AI视频制作篇前言一、工具列表二、成片展示三、制作流程1、获取图片素材2、图片生成视频2.1 Runway操作流程 3、文本生成语音3.1 Fish Audio操作流程 4、视频剪辑4.1 音频素材4.2 字幕生成 四、Runway提示词参考:参考 前…...

Java之TCP编程综合案例

1.反转案例 搭建一个TCP客户端,从键盘录入整行数据(遇到quit结束录入)然后发送给服务器,再接收服务器返回的数据并输出。 package com.briup.chap12;public class Test064_ReversalClient {public static void main(String[] ar…...

【数据分析---Pandas实战指南:精通数据查询、增删改操作与高效索引和列名操作管理】

前言: 💞💞大家好,我是书生♡,本阶段和大家一起分享和探索数据分析,本篇文章主要讲述了:数据查询操作,数据增删改操作,索引和列名操作等等。欢迎大家一起探索讨论&#x…...

Spring Cloud全解析:注册中心之Eureka服务获取和服务续约

服务获取和服务续约 eureka客户端通过定时任务的方式进行服务获取和服务续约,在com.netflix.discovery.DiscoveryClient类中,启动了两个定时任务来进行处理 private void initScheduledTasks() {// 是否需要拉取if (clientConfig.shouldFetchRegistry(…...

三相整流电路交流侧谐波仿真分析及计算

一、三相桥式全控整流电路和功率因数测量电路SIMULINK 模型 如图4-1,根据高频焊机的主电路机构和工作原理,可将高频焊机三相整流部分等效为阻感负载的三相桥式全控整流电路模型,其由三相交流电压源、三相晶闸管整流桥、同步六脉冲触发器和阻感…...

了解Java中的反射,带你如何使用反射

反射的定义 反射(Reflection)是Java的一种强大机制,它允许程序在运行时动态地查询和操作类的属性和方法。通过反射,Java程序可以获取类的信息,比如类的名称、方法、字段,以及可以动态地创建对象、调用方法…...

【c++】基础知识——快速入门c++

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C 目录 前言 一、手搓一个Hello World 二、命名空间namespace 1.命名空间的定义 2.命名空间的使用 3.命名空间补充知识 三、c中的输入和输出 四、缺省参…...

AI学习记录 - 自注意力机制的计算流程图

过段时间解释一下,为啥这样子计算,研究这个自注意力花了不少时间,网上很多讲概念,但是没有具体的流程图和计算方式总结…...

JavaScript快速入门,满满干货总结,快速掌握JS语法,DOM,BOM,事件

目录 一. JavaScript、HTML、CSS简介 1.1 HTML简介和举例说明 1.2 CSS简介和举例说明 1.3 JavaScript 简介和举例说明 二. JavaScript 基本语法 2.1 变量类型和定义方式 2.2 逻辑运算符,比较运算符 2.3 流程控制,if,if...else...&…...

【C++】C++入门基础【类与对象】

目录 1.类 1.1类的定义 1.2struct 与 class对比 2.访问限定符 3. 类域 4.实例化 5.存储大小----内存对齐 6.this指针 1.类 1.1类的定义 class作为类的关键字,后面跟的是类的名字,如Stack,{}中的为类的主体,类定义结束时…...

Qt | QScatterSeries 散点图

点击上方"蓝字"关注我们 01、QScatterSeries QScatterSeries 的类,它将代表散点图中的一个系列。这个类将包含数据点、颜色和样式等属性,以及用于绘制散点图的方法。 02、main.cpp #include <QtWidgets/QApplication>#include <QtWidgets/QMainWindow…...

无缝协作的艺术:Codigger 视频会议(Meeting)的用户体验

在当今数字化的时代&#xff0c;远程协作已经成为工作和学习中不可或缺的一部分。然而&#xff0c;远程协作也面临着诸多挑战&#xff0c;如沟通不畅、信息同步不及时、协作工具的复杂性等。而 Codigger 视频会议&#xff08;Meeting&#xff09;作为一款创新的工具&#xff0c…...

C基础练习(学生管理系统)

1.系统运行&#xff0c;打开如下界面。列出系统帮助菜单&#xff08;即命令菜单&#xff09;&#xff0c;提示输入命令 2.开始时还没有录入成绩&#xff0c;所以输入命令 L 也无法列出成绩。应提示“成绩表为空&#xff01;请先使用命令 T 录入学生成绩。” 同理&#xff0c;当…...

网络安全抓包封包WEB

目录 1.抓包 1. 网络故障排除 应用 意义 2. 网络安全监控 应用 意义 3. 性能优化 应用 意义 4. 协议分析与开发 应用 意义 5. 数据分析与合规性审计 应用 意义 抓包工具 总结 2.抓包的应用对象 1. 网络设备 路由器和交换机 防火墙和入侵检测系统&#xff…...

Spring Boot - 在Spring Boot中实现灵活的API版本控制(上)

文章目录 为什么需要多版本管理&#xff1f;在Spring Boot中实现多版本API的常用方法1. URL路径中包含版本号2. 请求头中包含版本号3. 自定义注解和拦截器 注意事项 为什么需要多版本管理&#xff1f; API接口的多版本管理在我们日常的开发中很重要&#xff0c;特别是当API需要…...

普中51单片机:DS18B20温度传感器操作指南(十三)

文章目录 引言电路图引脚讲解初始化时序写时序读时序温度变换温度读取完整代码 引言 DS18B20是一款单总线接口的数字温度传感器&#xff0c;仅需一个IO口即可实现数据通信。这里只对如何简单操作开发板的DS1802进行讲解&#xff0c;关于DS18B20温度传感器的详细操作原理&#…...

【网络】网络的发展历程及其相关概念

1.什么是网络 计算机网络是指将一群具有独立功能的计算机通过通信设备以及传输媒体被互联起来的&#xff0c;在通信软件的支持下&#xff0c;实现计算机间资源共享、信息交换或协同工作的系统。计算机网络是计算机技术与通信技术紧密结合的产物&#xff0c;两者的迅速发展渗透形…...

鸿蒙HarmonyOS开发:如何使用第三方库,加速应用开发

文章目录 一、如何安装 ohpm-cli二、如何安装三方库1、在 oh-package.json5 文件中声明三方库&#xff0c;以 ohos/crypto-js 为例&#xff1a;2、安装指定名称 pacakge_name 的三方库&#xff0c;执行以下命令&#xff0c;将自动在当前目录下的 oh-package.json5 文件中自动添…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...