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

NodeJs 最近各版本特性汇总

(预测未来最好的方法就是把它创造出来——尼葛洛庞帝)

在这里插入图片描述

NodeJs

官方链接
github链接
V8链接
Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型, [1] 让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。 [2]
Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好,V8引擎执行Javascript的速度非常快,性能非常好,基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用

接下来整理的是开发中常用的特性,一些作者认为不常用的可能会不记录或者记录的不详细

NodeJs的发布规则

  • CURRENT:指代最新的 Node.js 版本系列。
  • Active:指正在积极维护和升级的版本系列,包括向后移植非破坏性功能和改进,解决错误以及修补安全漏洞。
  • Maintenance:这是一个维护的 LTS 版本系列,直到它的生命周期终止,只会在短时间内收到错误修复和安全补丁。
  • LTS:是Long-Term Support 的缩写,代表 Node.js 长期支持的版本(版本号为复数)。
  • EOL:EOL 是 End of Life 的首字母缩写,进入到 EOL 时间线的版本,将不在维护。

让我们看下 Node.js版本的生命周期是怎么样的?首先要知道每年的 4 月、10 月分别发布偶数、奇数版本,下面是过程说明:

最近的一个偶数版本在 4 月份发布之后会持续 6 个月。 待 10 月份会发布一个奇数版本,最近的偶数版本会进入 Active LTS版本。持续时间为 18 个月,这期间几乎不会有不兼容的大功能更新,开发者也可以放心升级到 Active LTS 版本。
18 个月的Active LTS 版本到期后,会进入 Maintenance LTS 版本,也就是进入维护期,时间为 12
个月,在这期间仅进行安全、Bug 更新。 一旦 Maintenance LTS 版本 12 个月的时间已到就会进入 EOL
版本,正式退出历史舞台。
其中偶数版本会持续维护18个月,而奇数版本指挥维护8个月。
生命周期图
在这里插入图片描述

20.0.0

2023-04-18发布

1. 权限模型

Node.js 现在有一个名为权限模型的实验性功能。它允许开发人员在程序执行期间限制对特定资源的访问,例如文件系统操作、子进程生成和工作线程创建。API 存在于一个标志后面–experimental-permission,启用后将限制对所有可用权限的访问。通过使用此功能,开发人员可以防止他们的应用程序访问或修改敏感数据或运行可能有害的代码。

  • 使用–allow-fs-read和–allow-fs-write限制对文件读写系统的访问
  • 使用–allow-child-process限制访问 child_process
  • 使用–allow-worker限制访问 worker_threads
  • 使用–no-addons制对本机插件的访问

2. 自定义 ESM 加载程序挂钩在专用线程上运行

通过加载程序 ( ) 提供的 ESM 挂钩–experimental-loader=foo.mjs现在在与主线程隔离的专用线程中运行。这为加载程序提供了一个单独的范围,并确保加载程序和应用程序代码之间没有交叉污染。

3. import.meta.resolve()

为了与浏览器行为保持一致,此函数现在同步返回。尽管如此,用户加载resolve程序挂钩仍然可以定义为异步函数(或同步函数,如果作者愿意的话)。即使resolve加载了异步挂钩,import.meta.resolve仍会同步返回应用程序代码。

4. V8 11.3

V8 引擎更新到版本 11.3,它是 Chromium 113 的一部分。这个版本包括 JavaScript API 的三个新特性

  • String.prototype.isWellFormed 和 toWellFormed
    isWellFormed用于检查这个字符串是否是一个合法的 Unicode,而toWellFormed则会将一个字符串转换为 Unicode。
通过复制改变 Array 和 TypedArray 的方法
现有的Array.prototype和TypedArray.prototype的函数会直接修改接收的数组。而新函数会返回接收的数组的修改副本,并将原始数组保持不变。这些新函数在数据不可变的编程风格中很有用。
可调整大小的 ArrayBuffer 和可增长的 SharedArrayBuffer
带有集合符号的 RegExp v 标志 + 字符串的属性
WebAssembly 尾调用

5. 稳定的测试运行器

最近对 Node.js 版本 20 的更新包括对 test_runner 模块的重要更改。在最近的更新后,该模块已被标记为稳定。以前,test_runner 模块是实验性的,但这次更改标志着它是一个可以用于生产的稳定模块。
它主要用来编写并运行测试文件,类似mock等测试组件包

  • describe/it/test函数,以及测试文件的钩子。
  • mock 数据。
  • 监听文件变化模式(watch mode)。
  • node --test支持并行运行多个测试文件。
import { test, mock } from "node:test";
import assert from "node:assert";
import fs from "node:fs";mock.method(fs, "readFile", async () => "Hello ZY");
test("synchronous passing test", async (t) => {// This test passes because it does not throw an exception.assert.strictEqual(await fs.readFile("zy.txt"), "Hello ZY");
});

6. Ada 2.0

Node.js v20 附带了最新版本的 URL 解析器 Ada。此更新为 URL 解析带来了显着的性能改进,包括增强url.domainToASCII了.url.domainToUnicodenode:url

Ada 2.0 已集成到 Node.js 代码库中,确保应用程序的所有部分都能从改进的性能中受益。此外,Ada 2.0 比其前身 Ada 1.0.4 具有显着的性能提升,同时还消除了对 URL 主机名解析的 ICU 要求。

19.0.0

2022-10-18发布

1. HTTP(S)/1.1 KeepAlive 默认

从此版本开始,Node.jskeepAlive默认设置为 true。这意味着任何传出的 HTTP(s) 连接都将自动使用 HTTP 1.1 Keep-Alive。默认等待时间为 5 秒。启用 keep-alive 将提供更好的吞吐量,因为默认情况下会重用连接。

此外,代理现在能够解析Keep-Alive服务器可能发送的响应。此标头指示客户端保持连接的程度。另一方面,Node.js HTTP 服务器现在将在调用时自动断开空闲客户端(使用 HTTP Keep-Alive 重用连接)close()。

默认情况下,Node.js HTTP(S)/1.1 请求可能会体验到更好的吞吐量/性能。

2. 删除了 DTrace/SystemTap/ETW 支持

3. V8 10.7

V8 引擎更新到 10.7 版,它是 Chromium 107 的一部分。该版本包括 JavaScript API 的新功能:Intl.NumberFormat.

Intl.NumberFormatv3 API 是一个新的TC39 ECMA402 第 3 阶段提案, 扩展了现有的Intl.NumberFormat.

4. llhttp 8.1.0

llhttp 已经更新到 8.1.0 版本。总的来说,这个版本对 llhttp API 带来了许多更新,引入了新的回调并允许所有回调都可以暂停。

18.0.0

2022-04-19发布

1. fetch(实验性)

默认情况下,全局范围内提供了一个实验性的获取 API。该实现基于undici,一个由项目贡献者为 Node.js 编写的 HTTP/1.1 客户端。

const res = await fetch('https://nodejs.org/api/documentation.json');
if (res.ok) {const data = await res.json();console.log(data);
}

通过此添加,可以使用以下全局变量:fetch, FormData, Headers, Request, Response
使用–no-experimental-fetch命令行标志禁用此 API

2. HTTP 超时

server.headersTimeout这限制了解析器等待接收完整 HTTP 标头的时间,现在60000默认设置为(60 秒)。

server.requestTimeout300000设置从客户端接收整个请求的超时值(以毫秒为单位)现在默认设置为(5 分钟)。

如果这些超时到期,服务器将以状态 408 响应而不将请求转发给请求侦听器,然后关闭连接。

两个超时都必须设置为非零值,以防止在服务器部署前没有反向代理的情况下发生潜在的拒绝服务攻击。

3. Test Runner 模块(实验性的)

该node:test模块有助于创建以 TAP 格式报告结果的 JavaScript 测试。

import test from 'node:test';

该模块仅在该方案下可用node:
以下是具有两个子测试的父测试的示例实现:

test('top level test', async (t) => {await t.test('subtest 1', (t) => {assert.strictEqual(1, 1);});await t.test('subtest 2', (t) => {assert.strictEqual(2, 2);});
});

4. 工具链和编译器升级

5. V8 10.1

V8 引擎更新到 10.1 版本,它是 Chromium 101 的一部分。与 Node.js 17.9.0 中包含的版本相比,包括以下新特性

findLast数组findLastIndex方法
const inputArray = [{v:1}, {v:2}, {v:3}, {v:4}, {v:5}];
inputArray.findLast((element) => element.v % 2 === 0);
// → {v:4}
inputArray.findLast((element) => element.v % 7 === 0);
// → undefined
inputArray.findLastIndex((element) => element.v % 2 === 0);
// → 3
inputArray.findLastIndex((element) => element.v % 7 === 0);
// → -1
Intl.LocaleAPI的改进。
Intl.supportedValuesOf
改进了类字段和私有类方法的性能(它们的初始化现在与普通属性存储一样快)

17.0.0

2021-10-19发布

1. OpenSSL 3.0

2. V8 9.5

V8 JavaScript 引擎更新到 V8 9.5。此版本附带Intl.DisplayNamesAPI 的其他受支持类型和timeZoneNameAPI 中的扩展选项Intl.DateTimeFormat

3. Readline 承诺 API

该模块提供了一个接口,用于一次一行地readline从 Readable 流(例如 )中读取数据。process.stdin

以下简单示例说明了该readline模块的基本用法

import * as readline from 'node:readline/promises';
import { stdin as input, stdout as output } from 'process';const rl = readline.createInterface({ input, output });const answer = await rl.question('What do you think of Node.js? ');console.log(`Thank you for your valuable feedback: ${answer}`);rl.close();

16.0.0

2021-04-21发布

1. 稳定Timers Promises API

Timers Promises API 提供了一组替代的计时器函数,它们返回 Promise 对象。在 Node.js v15.0.0 中添加,在此版本中,它们从实验状态升级到稳定状态。

import { setTimeout } from 'timers/promises';async function run() {const res = await setTimeout(3000, 'fullFilledValue');console.log(`Get result=>${res} after 3s`);
}run(); // 3s后输出:Get result=>fullFilledValue after 3s

2. 工具链和编译器升级

3. V8 JavaScript 引擎更新到 V8 9.0,包括性能调整和改进

这次V8的升级带来了ECMAScript RegExp比对索引功能,能提供字符串的开始与结束索引。当正则表达式带有/d标签时,可以通过indices属性访问到索引数组。

14.0.0

2020-04-21发布

1. V8 8.1

可选链接
Nullish 合并
Intl.DisplayNames
为 Intl.DateTimeFormat 启用 calendar 和 numberingSystem 选项

2. 实验性异步本地存储 API

3. 强化流 API

13.0.0

2019-10-22发布

1. 断言

如果验证函数传递给assert.throws()或assert.rejects() 返回的值不是true,则将抛出断言错误而不是原始错误以突出显示编程错误(Ruben Bridgewater)

2. 构建

Node.js 版本现在使用默认的 full-icu 支持构建。这意味着现在包含了 ICU 支持的所有语言环境,并且与国际相关的 API 可能会返回与以前不同的值(Richard Lau)

3. V8 7.8

新增对象解构、内存使用和 WebAssembly 启动时间的性能改进

12.0.0

2019-04-29发布

1. V8 7.4

在V8 7.4中,对于开发人员来说最重要的新特性是预计计算属性,可以让开发人员更方便地通过表达式来定义对象属性,同时引入了更多的原型方法。此外,V8 7.4还实现了大量的内存管理和性能改进,这将使得Node.js 12的性能更加稳定和可靠。

2. 更快的ES模块加载

随着Web应用程序变得越来越庞大,加载和解析JavaScript模块的速度越来越成为Web开发的瓶颈。为了解决这个问题,Node.js 12引入了较新的V8版本的快速对象存储访问,从而使得ES模块的加载和解析速度更快,可实现更快的Web应用程序加载时间和启动时间。

3. HTTP/2的完整支持

HTTP/2作为HTTP协议的下一代,拥有比HTTP 1.x更快、更安全的数据传输速度。Node.js 12支持HTTP/2的完整支持,包括对HTTP/2流的完整流控、过程化二进制协议的解码和对H2C升级的支持。同样,Node.js 12还支持ALPN协议,在HTTPS请求中使用HTTP/2。

11.0.0

2018-10-23发布

1. V8 7.0

2. fs

  1. fs.read()方法现在需要回调
  2. 以前弃用的fs.SyncWriteStream实用程序已被删除

3. console

  1. console.countReset()如果重置的计时器不存在,将发出警告
  2. console.time()如果计时器已经存在,将不再重置它

10.0.0

2018-04-24发布

1. 断言

  1. 添加了和assert.rejects()方法assert.doesNotReject()以使用异步函数
  2. assert.throws()接受一个对象来与错误进行比较

2. 异步钩子

  1. 旧的实验性 async_hooks API 已被删除

3. Buffer

  1. 使用目录new Buffer()和Buffer()外部目录node_modules现在将发出运行时弃用警告
  2. Buffer.isEncoding()现在返回undefined虚假值,包括空字符串
  3. Buffer.fill()如果尝试填充一个空的Buffer
  4. noAssert参数已从所有Buffer读写函数中删除

4. V8 6.6

5. 发送事件

该EventEmitter.prototype.off()方法已添加为 的别名EventEmitter.prototype.removeListener()

6. fs

  1. APIfs/promises提供了函数的实验性承诺版本fs
  2. 现在会同步抛出无效路径错误
  3. 该fs.readFile()方法现在对读取进行分区以避免线程池耗尽

7. node10x后续版本开放了工作线程

工作线程主要用于解决node计算类的业务问题。但需要注意的是,对io类操作没有作用。

相关文章:

NodeJs 最近各版本特性汇总

(预测未来最好的方法就是把它创造出来——尼葛洛庞帝) NodeJs 官方链接 github链接 V8链接 Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模…...

python数据分析案例——天猫订单综合分析

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 什么是数据分析 明确目的–获得数据(爬虫,现有,公开的数据)–数据预处理——数据可视化——结论 准备 环境使用: 在开始写我们的代码之前,我们要准备好运行代码的程序 Anacon…...

05- redis集群模式搭建(上) (包含云服务器[填坑])

目录 1. 准备环境: 2. 简介: -> 2.1 前言: -> 2.2 Redis集群架构实现了对redis的水平扩容 -> 2.3 redis cluster集群原理 3. 搭建后特别需要注意的问题 ->3.1 [重点]: 如果一个服务出现故障: 是否可以继续提供服务??? ---> 3.1.1 如果集群中故障re…...

【AI】YOLOV1原理详解

AI学习目录汇总 0、前言 YOLOv1~3作者是约瑟夫雷德蒙(Joseph Chet Redmon),他的网站:https://pjreddie.com/ YOLOv1网站:https://pjreddie.com/darknet/yolov1/ YOLOv2网站:https://pjreddie.com/darknet…...

提高APP安全性的必备加固手段——深度解析代码混淆技术

APP 加固方式 Android APP 加固是优化 APK 安全性的一种方法,常见的加固方式有混淆代码、加壳、数据加密、动态加载等。下面介绍一下 Android APP 加固的具体实现方式。 混淆代码: 使用 ProGuard 工具可以对代码进行混淆,使得反编译出来的代…...

想让行车记录仪协助道路病害自动化检测?可以!

针对【RGB3DS道路表观病害信息智慧检测系统】,我们着重介绍过其与道路检测车做集成预装或者处理道路检测车数据的极大便利,其中之一便是可高效输出带有道路检测车桩号标记的病害报表,这是因为道路检测车数据本身具有规范性。 那么如果使用道…...

git上传大大大文件项目好折磨人

本来想把unity项目的源码上传上gitee啊,但是那个项目有1个多G,还是个半成品,要是写完,都不知道行不行 正常的上传 所用到的命令: 1、 git init 初始化,创建本地仓库 2、 git add . 添加到本地仓库 3、 git…...

java常见异常的处理方法

以下是一些常见的异常处理方法: 捕获和处理异常(try-catch): 使用try-catch语句块可以捕获并处理异常。在try块中编写可能抛出异常的代码,然后在catch块中指定异常类型,以便捕获并处理异常。 try {// 可能抛…...

上传图片到阿里云服务器base64 上传

//上传图片到阿里云服务器 function upload_Ali($remoteImage){$imageData $this->n_img_base_64($remoteImage);if ($imageData ! false) {// 初始化 cURL 句柄$ch curl_init();// 设置请求 URL 和一些 cURL 选项curl_setopt($ch, CURLOPT_URL, http://dev.com/index/aja…...

【致敬未来的攻城狮计划】— 连续打卡第二十六天:瑞萨RA Cortex-M 内核RA2E1 RT-Thread BSP 启蒙知识

系列文章目录 由于一些特殊原因: 系列文章链接:(其他系列文章,请点击链接,可以跳转到其他系列文章)或者参考我的专栏“ 瑞萨MCU ”,里面是 瑞萨RA2E1 系列文章。 24.RA2E1的 DMAC——数据传输 …...

2023年5月8日-5月14日(方案C,下班UE视频教程为主)

目前,ue视频教程进行到了智 慧 城 市(3.13),mysql(7.1),tf1(4.11),蓝图反射(1.9),moba(1.5)webapp(2.4),mmoarpg(00A_04),fps1_12(0:3…...

「MIAOYUN」:降本增效,赋能传统企业数字化云原生转型 | 36kr 项目精选

作为新经济综合服务平台第一品牌,36氪自2019年落地四川站以来,不断通过新锐、深度的商业报道,陪跑、支持四川的新经济产业。通过挖掘本土优质项目,36氪四川帮助企业链接更多资源,助力企业成长,促进行业发展…...

Python突破JS加密限制,进行逆向解密

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 目录标题 前言开发环境:模块使用:逆向目标逆向过程参数 JS 加密关键代码Python 登录关键代码尾语 💝 开发环境: Python 3.8 Pycharm 模块使用: time >>> 时间模块,属于内置,无…...

【Linux】exec函数族

目录 1、exec函数族的介绍2、exec相关函数 1、exec函数族的介绍 2、exec相关函数 #include <unistd.h> int execl(const char *pathname, const char *arg0, ... /* (char *)0 */ ); /* - path 需要指定的执行的文件的路径或者名称&#xff0c;相对路径or绝对路径- arg …...

OSQP二次规划求解库使用说明

OSQP二次规划求解库使用说明 贺志国 2023.5.10 1. 凸二次规划的一般表达式 m i n 1 2 x T P x q T x s . t . l ≤ A x ≤ u min \quad \frac{1}{2}x^T Px q^Tx \qquad s.t. \quad l \leq Ax \leq u min21​xTPxqTxs.t.l≤Ax≤u 其中&#xff0c; P P P称为内核矩阵&#x…...

Elasticsearch(一)

Elasticsearch&#xff08;一&#xff09; 初始elasticsearch 什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速查找到需要的内容 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack&…...

深入探究Java中的枚举类型:定义、特性和应用

引言&#xff1a; 在Java编程中&#xff0c;枚举类型是一种强大而灵活的工具&#xff0c;用于定义一组具名的常量。它不仅提供了代码可读性和可维护性的优势&#xff0c;还为开发人员提供了一种更安全和结构化的方式来处理固定的常量集合。本文将深入探讨Java中的枚举类型&…...

linux密码忘了?一招解决

目录 一、前言 二、进入编辑界面 三、单用户模式 四、修改密码 五、更新信息 六、退出 七、验证 一、前言 版本&#xff1a;centos7.9、VMware15.5 在我们学习linux运行级别的时候&#xff0c;面试题可能会出如何找回root密码&#xff0c;下面来详细的介绍一波&#xff…...

苹果mac清理软件CleanMyMac X v4.13兼容13系统,堪称Mac最好的系统清理工具

CleanMyMac X for mac是MacOS上一款Mac清理优化工具&#xff0c;不仅包含各种清理功能&#xff0c;更是具有卸载器、维护、扩展、碎纸机这些实用功能&#xff0c;可以同时代替很多工具。它可以清理&#xff0c;优化&#xff0c;保养和监测您的电脑&#xff0c;确保您的Mac运行…...

FPGA实现Cordic算法求解arctan和sqr(x*2 + y* 2)

一. 简介 由于在项目中需要使用的MPU6050&#xff0c;进行姿态解算&#xff0c;计算中设计到**arctan 和 sqr(x2 y 2),**这两部分的计算&#xff0c;在了解了一番之后&#xff0c;发现Cordic算法可以很方便的一次性求出这两个这两部分的计算。另外也可以一次性求出sin和cos的…...

【最终截稿 | Springer 独立出版 | EI稳定检索】 2023年绿色建筑国际会议(ICoGB 2023)

会议简介 Brief Introduction 2023年绿色建筑国际会议(ICoGB 2023) 会议时间&#xff1a;2023年5月21日-23日 召开地点&#xff1a;瑞典斯德哥尔摩 大会官网&#xff1a;www.icogb.org ICoGB 2023将围绕“绿色建筑”的最新研究领域而展开&#xff0c;为研究人员、工程师、专家学…...

Flutter常用状态管理框架及优缺点

Flutter 中常见的状态管理框架有以下几种&#xff1a; Provider&#xff1a; Provider 是一个轻量级的状态管理框架&#xff0c;可用于单个 Widget 或整个 Widget 树中分发状态。它通过 InheritedWidget 和 ChangeNotifier 来实现状态管理&#xff0c;并支持依赖项注入。Redux…...

Ubuntu 20.04 系统配置 OpenVINO 2022.3 环境

由于 OpenVINO 2021 版本在调用 IECore 时会出现 Segmentation fault 的问题&#xff0c;因此需要将其升级为 2022 版本的。 1. 卸载原来版本的 OpenVINO 进入OpenVINO的卸载目录&#xff0c;通常在 /opt/intel 文件夹下&#xff0c; cd /opt/intel/openvino_2021/openvino_…...

浏览器存储技术:localStorage、sessionStorage和cookie的区别

随着互联网技术的不断发展&#xff0c;人们越来越依赖浏览器进行网页浏览和数据处理。浏览器存储技术是Web开发中非常重要的一部分&#xff0c;它可以帮助我们在浏览器端存储数据&#xff0c;而无需将数据传输到服务器。本文将介绍三种常见的浏览器存储技术&#xff1a;localSt…...

MySQL中的内连接和外连接

一、MySQL内连接&#xff08;INNER JOIN&#xff09; 内连接&#xff0c;又称为等值连接&#xff0c;是最常见的连接类型。它根据两个&#xff08;或多个&#xff09;表中具有相同列值的行来创建一个新的结果表。在内连接中&#xff0c;只有通过连接条件匹配的行才会被包含在结…...

node学习手册

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;使 JavaScript 可以脱离浏览器环境运行在服务端。它提供了一组 API&#xff0c;可以让开发者轻松地进行服务器端编程。 以下是 Node.js 的学习手册&#xff1a; 安装 Node.js 首先&#xff0c;需要在官网…...

Java中的JSP是什么?如何实现JSP

JavaServer Pages&#xff08;JSP&#xff09;是一种Java技术&#xff0c;可以用于开发动态Web应用程序。它允许开发人员将Java代码嵌入到HTML页面中&#xff0c;以便生成动态内容。本文将介绍JSP的工作原理&#xff0c;以及如何在Java中实现JSP。 JSP的工作原理 JSP的工作原…...

c++之函数对象和谓词

目录 函数对象&#xff1a; 谓词&#xff1a; 一元谓词函数举例如下 二元谓词举例如下 函数对象和函数的区别 一元谓词的案例 二元函数对象案例 二元谓词案例 函数对象&#xff1a; 重载函数调用操作符的类&#xff0c;其对象常称为函数对象&#xff08;function obj…...

《Andorid开源》greenDao 数据库orm框架

一 前言&#xff1a;以前没用框架写Andorid的Sqlite的时候就是用SQLiteDatabase &#xff0c;SQLiteOpenHelper ,SQL语句等一些东西&#xff0c;特别在写SQL语句来进行 数据库操作的时候是一件很繁琐的事情&#xff0c;有时候没有错误提示的&#xff0c;很难找到错误的地方&a…...

Android类似微信聊天页面教程(Kotlin)五——选择发送图片

前提条件 安装并配置好Android Studio Android Studio Electric Eel | 2022.1.1 Patch 2 Build #AI-221.6008.13.2211.9619390, built on February 17, 2023 Runtime version: 11.0.150-b2043.56-9505619 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 …...