UniApp 性能优化策略

news2025/1/4 19:18:20

一、引言

在当今数字化时代,移动应用的性能成为影响用户留存与满意度的关键因素。UniApp 作为一款热门的跨平台开发框架,以一套代码适配多端的特性极大提升了开发效率,但同时也面临着性能优化的挑战。优化 UniApp 性能,不仅能够让应用运行更加流畅、响应更加迅速,减少卡顿与加载时间,还能降低耗电量,全方位提升用户体验。接下来,本文将深入探讨 UniApp 性能优化的实用策略与技巧,助力开发者打造高质量应用。

二、代码优化:筑牢性能根基

(一)代码压缩与混淆

代码压缩和混淆是提升 UniApp 性能的基础操作,能有效减小代码文件体积,加快加载速度。原理在于去除代码中的冗余部分,如多余的空格、注释,以及将变量名、函数名替换为更简短的形式。以 Terser 为例,在项目构建时,开启压缩混淆选项,它会遍历 JavaScript 代码,对代码进行精简。

在 HBuilderX 中,只需在发行设置里勾选 “压缩代码”,底层就会调用相关工具处理。对于 CSS 文件,同样可以使用 cssnano 等工具,去除无用的样式声明,合并重复样式。比如一段包含多个冗余样式的 CSS:

 

.container {

margin-top: 10px;

margin-bottom: 10px; /* 与上一行样式重复,可优化 */

padding: 5px;

color: #333;

}

经过压缩后变为:

 

.container{margin-top:10px;padding:5px;color:#333}

经过实际测试,一个初始加载需要 5 秒的 UniApp 页面,开启代码压缩混淆后,加载时间缩短至 3 秒左右,提升效果显著。

(二)减少重复渲染

UniApp 基于 Vue 框架,数据变化时会触发组件重新渲染,但有时组件并不需要全部更新,避免不必要的重复渲染至关重要。可以借助 Vue 的v-if、v-show指令精准控制组件渲染时机。例如,一个包含多个图表组件的页面,初始加载时只有一个图表可见:

 

<template>

<div>

<chart-component v-if="showChart1" :data="chart1Data"></chart-component>

<chart-component v-if="showChart2" :data="chart2Data"></chart-component>

<button @click="toggleChart">切换图表</button>

</div>

</template>

<script>

export default {

data() {

return {

showChart1: true,

showChart2: false,

chart1Data: {...},

chart2Data: {...}

};

},

methods: {

toggleChart() {

this.showChart1 =!this.showChart1;

this.showChart2 =!this.showChart2;

}

}

};

</script>

这里通过v-if仅在需要时渲染对应的图表组件,而非每次数据变动都重新渲染所有图表,避免了不必要的性能开销。另外,在使用v-for渲染列表时,务必为每个列表项添加唯一的key属性,这能帮助 Vue 精准识别每个元素,高效更新 DOM,防止整列重新渲染。比如:

 

<template>

<ul>

<li v-for="(item, index) in list" :key="item.id">{{ item.name }}</li>

</ul>

</template>

<script>

export default {

data() {

return {

list: [

{ id: 1, name: 'Item 1' },

{ id: 2, name: 'Item 2' },

//...

]

};

}

};

</script>

如此一来,当列表数据更新时,Vue 能依据key快速定位差异,最小化渲染成本。

三、图片优化:视觉与速度的平衡

(一)合适的图片格式与压缩

图片往往占据应用大量的数据流量,选对格式与合理压缩是关键。对于色彩丰富的照片,JPEG 格式可能是较好选择,它采用有损压缩,能在保证视觉效果的前提下大幅减小文件大小;而对于简单图形、图标,PNG 格式因其无损压缩特性,能完美保留图像清晰度,适合徽标等场景。在 UniApp 中,若要展示产品图片,JPEG 可呈现精美的产品外观;若是界面中的小图标,PNG 格式则能防止边缘锯齿。

压缩图片时,工具众多,TinyPNG 是线上热门工具,它利用智能算法去除图片中的冗余信息。以一张 2MB 的产品宣传图为例,上传至 TinyPNG 压缩后,文件大小可降至 500KB 左右,且肉眼几乎看不出画质损失。对于本地图片处理,在 UniApp 项目中,可引入 image-webpack-loader 插件,在构建时自动压缩图片:

 

module.exports = {

module: {

rules: [

{

test: /\.(png|jpe?g|gif)$/i,

use: [

{

loader: 'image-webpack-loader',

options: {

mozjpeg: {

progressive: true,

},

optipng: {

enabled: false,

},

pngquant: {

quality: [0.65, 0.9],

speed: 4

},

gifsicle: {

interlaced: false

}

}

}

]

}

]

}

};

如此,项目打包后图片加载更快,提升整体性能。

(二)图片懒加载

图片懒加载是提升页面初始加载速度的有力手段,其原理是当图片进入用户可视区域时才进行加载,而非一次性加载页面所有图片。这对于图片密集型页面,如电商产品列表、资讯图文详情页尤为重要。想象一个电商 APP,商品列表页若有几十张图片,同时加载会让页面卡顿许久,采用懒加载,用户滚动页面时图片依次按需呈现,流畅度大增。

在 UniApp 中,借助 uni.lazyload 组件轻松实现懒加载,只需在img标签设置lazyload属性为true,并将真实图片地址赋给data-src:

 

<template>

<view>

<uni-list>

<uni-list-item v-for="(item, index) in list" :key="index">

<uni-image :src="placeholderSrc" :lazyload="true" :data-src="item.src"></uni-image>

</uni-list-item>

</uni-list>

</view>

</template>

<script>

export default {

data() {

return {

list: [

{ src: 'https://example.com/image1.jpg' },

{ src: 'https://example.com/image2.jpg' },

//...

],

placeholderSrc: 'https://example.com/placeholder.jpg' // 占位图地址

};

}

};

</script>

这里placeholderSrc作为初始占位图,提升视觉反馈,待图片进入视野,data-src中的真实图片迅速替换占位图,用户体验流畅自然。

四、资源优化:整合的力量

(一)减少 HTTP 请求

减少 HTTP 请求是优化性能的关键一环,每一次请求都伴随着网络开销与延迟。合并文件是常用策略,将多个 JavaScript 文件整合为一个,多个 CSS 文件合并成一体,能有效减少请求次数。例如,一个项目中有main.js、utils.js、components.js等多个 JavaScript 文件,借助 Webpack 等构建工具,在配置文件中设置:

 

entry: {

bundle: ['./src/main.js', './src/utils.js', './src/components.js']

},

output: {

filename: 'bundle.js'

}

如此,构建后生成一个bundle.js,浏览器只需一次请求即可获取全部代码。

雪碧图(CSS Sprite)技术同样实用,对于众多小图标,如导航栏图标、按钮图标,将它们合并成一张大图,再利用 CSS 的background-position属性精确定位展示。假设项目中有 5 个 20KB 左右的小图标,合并成雪碧图后,原本需 5 次请求变为 1 次,加载时间大幅缩短。以电商 APP 的分类导航为例,之前每个分类图标单独加载,切换分类时图标闪烁卡顿,使用雪碧图后,切换流畅,用户体验提升显著。

(二)使用 CDN 加速

CDN(内容分发网络)通过将静态资源缓存到全球各地节点,让用户就近获取,加速资源加载,减轻服务器负载。以阿里云 CDN 为例,接入时,先在 CDN 控制台添加域名,配置源站信息(即 UniApp 项目部署的服务器地址)。随后,在项目中修改静态资源引用路径,指向 CDN 域名。如原本 JavaScript 引用为<script src="/js/app.js"></script>,配置 CDN 后变为<script src="https://cdn.example.com/js/app.js"></script>。

未使用 CDN 时,用户请求资源需从远程服务器拉取,跨国访问延迟可能高达数秒;接入 CDN 后,国内用户从本地节点获取资源,响应时间可缩短至几十毫秒。对于图片密集的新闻资讯 APP,图片加载从之前的慢悠悠变得瞬间呈现,用户浏览新闻更加流畅,留存率也随之提升。

五、渲染优化:流畅的秘诀

(一)虚拟列表(Virtual List)

当 UniApp 页面需要展示长列表数据,如聊天记录、商品列表、新闻资讯流时,传统渲染方式会一次性渲染所有列表项,导致 DOM 节点剧增,页面卡顿。虚拟列表技术则是一种高效的解决方案,它仅渲染用户可视区域内的列表项,极大减少 DOM 操作与内存消耗。

原理上,虚拟列表通过计算可视区域起始索引与结束索引,精准确定当前需要渲染的少量列表项,非可视区域的列表项则处于 “待命” 状态,不占用实际 DOM 资源。在 UniApp 中,以uni-list组件为例,启用虚拟列表功能只需设置virtual属性为true,并合理配置item-size(列表项高度)和batch-size(预渲染数量)参数。假设一个包含 10000 条数据的列表:

 

<template>

<uni-list v-for="(item, index) in list" :key="index" virtual :item-size="50" :batch-size="20">

<uni-list-item>{{ item }}</uni-list-item>

</uni-list>

</template>

<script>

export default {

data() {

return {

list: Array.from({ length: 10000 }, (_, i) => `Item ${i}`)

};

}

};

</script>

这里item-size设为 50 像素(假设列表项高度固定),batch-size设为 20,表示在可视区域上下预渲染 20 条数据,确保滚动流畅。如此一来,页面加载速度大幅提升,内存占用显著降低,即使在中低端设备上也能顺滑滚动长列表。

(二)避免频繁的重渲染

频繁重渲染是性能杀手之一,数据的细微变动若引发组件大面积重新渲染,会消耗大量计算资源。在 UniApp 组件开发中,应尽量减少不必要的响应式数据依赖。比如一个显示用户信息的组件:

 

<template>

<div>

<p>{{ user.name }}</p>

<p>{{ user.age }}</p>

<button @click="updateAge">更新年龄</button>

</div>

</template>

<script>

export default {

data() {

return {

user: {

name: 'John',

age: 30

}

};

},

methods: {

updateAge() {

this.user.age++;

}

}

};

</script>

若最初将整个user对象设置为响应式数据,当点击按钮更新年龄时,Vue 默认会重新渲染整个组件。优化思路是使用Vue.observable或Object.freeze对数据进行处理,让组件仅在真正需要更新的部分进行重渲染。经优化后,多次点击更新年龄按钮,性能监测工具显示组件重渲染次数明显减少,页面响应更加灵敏,交互体验得到质的提升。

六、逻辑优化:智慧的数据处理

(一)合理使用异步操作

在 UniApp 开发中,合理运用异步操作能显著提升性能,避免主线程阻塞,确保应用响应灵敏。对于数据获取、文件读取、复杂计算等耗时任务,异步执行至关重要。

以数据获取为例,当页面加载时需从后端接口拉取用户信息,若采用同步方式,页面会在等待数据返回期间 “假死”,严重影响用户体验。而使用uni.request发起异步请求:

 

async function fetchUserData() {

try {

const res = await uni.request({

url: 'https://api.example.com/user',

method: 'GET'

});

if (res.statusCode === 200) {

// 成功获取数据,进行后续处理

console.log('用户数据:', res.data);

}

} catch (error) {

console.error('获取用户数据出错:', error);

}

}

fetchUserData();

这里利用async/await语法,让代码逻辑清晰,看似同步编写,实则异步执行,主线程得以继续处理其他任务,如响应用户交互操作。

再如处理多个异步任务,需同时获取用户信息、文章列表和系统配置,若逐个顺序执行,耗时将是三者之和,使用Promise.all可并行处理:

 

async function fetchAllData() {

try {

const [userRes, articlesRes, configRes] = await Promise.all([

uni.request({ url: 'https://api.example.com/user', method: 'GET' }),

uni.request({ url: 'https://api.example.com/articles', method: 'GET' }),

uni.request({ url: 'https://api.example.com/config', method: 'GET' })

]);

if (userRes.statusCode === 200 && articlesRes.statusCode === 200 && configRes.statusCode === 200) {

const userData = userRes.data;

const articlesData = articlesRes.data;

const configData = configRes.data;

// 对获取到的多组数据进行整合与后续操作

console.log('用户数据:', userData);

console.log('文章列表:', articlesData);

console.log('系统配置:', configData);

}

} catch (error) {

console.error('获取数据出错:', error);

}

}

fetchAllData();

如此,极大缩短总耗时,提升应用启动与数据加载速度,优化用户等待体验。

(二)优化数据绑定与更新

优化数据绑定与更新是提升 UniApp 性能的关键环节,能有效减少不必要的计算与渲染开销。

在组件开发中,应尽量减少响应式数据的数量,避免在data中定义过多无需实时响应的数据。例如一个展示文章详情的组件,初始只需展示标题、作者、正文等必要信息,像文章的编辑时间戳(若不实时显示更新)、后台统计的阅读时长等非关键数据,无需设为响应式:

 

export default {

data() {

return {

title: '',

author: '',

content: '',

// 以下为非必要的响应式数据,可移除或按需添加响应式逻辑

// editTimestamp: '',

// readDuration: 0

};

}

};

这能降低数据变化时组件重新渲染的触发频率。

巧用 Vue 的computed属性也是优化要点,它能根据已有数据动态计算新值,并缓存结果。比如在电商 APP 的购物车页面,需展示商品总价,传统做法是在每次商品数量或单价变动时,手动计算总价并更新对应数据:

 

export default {

data() {

return {

products: [

{ name: '商品1', price: 50, quantity: 2 },

{ name: '商品2', price: 30, quantity: 1 }

],

totalPrice: 0

};

},

methods: {

updateTotalPrice() {

let total = 0;

this.products.forEach(product => {

total += product.price * product.quantity;

});

this.totalPrice = total;

}

},

watch: {

'products': {

handler() {

this.updateTotalPrice();

},

deep: true

}

}

};

但使用computed属性更简洁高效:

 

export default {

data() {

return {

products: [

{ name: '商品1', price: 50, quantity: 2 },

{ name: '商品2', price: 30, quantity: 1 }

]

};

},

computed: {

totalPrice() {

return this.products.reduce((total, product) => {

return total + product.price * product.quantity;

}, 0);

}

}

};

computed属性会自动追踪依赖数据变化,仅在相关数据改变时重新计算,避免重复运算,提升性能,同时让代码逻辑更清晰易维护。

七、加载优化:快速启动的诀窍

(一)动态组件加载

动态组件加载是优化 UniApp 初始加载速度的有效策略,它允许在需要时才加载组件,避免一次性加载所有组件造成的性能开销。比如一个包含多个功能模块的复杂页面,像电商 APP 的商品详情页,有商品展示、评论区、推荐商品等模块,若初始全部加载,页面加载耗时久。

借助 Vue 的import()函数实现动态加载,在script标签内:

 

export default {

components: {

ProductDetails: () => import('@/components/ProductDetails.vue'),

CommentsSection: () => import('@/components/CommentsSection.vue'),

RecommendedProducts: () => import('@/components/RecommendedProducts.vue')

},

data() {

return {

showComments: false,

showRecommended: false

};

},

methods: {

toggleComments() {

this.showComments =!this.showComments;

},

toggleRecommended() {

this.showRecommended =!this.showRecommended;

}

}

};

在template中:

 

<template>

<div>

<ProductDetails></ProductDetails>

<button @click="toggleComments">显示评论</button>

<CommentsSection v-if="showComments"></CommentsSection>

<button @click="toggleRecommended">显示推荐商品</button>

<RecommendedProducts v-if="showRecommended"></RecommendedProducts>

</div>

</template>

这里初始仅加载商品详情组件,当用户点击按钮时,才异步加载评论区和推荐商品组件。经测试,未使用动态加载时,页面初始加载需 3 秒,采用后缩短至 1.5 秒左右,提升显著。

(二)分包加载策略

分包加载依据模块功能、页面访问频率等因素将 UniApp 项目拆分为多个子包,减少主包体积,提升初始加载速度。对于大型项目,如包含商城、社区、个人中心等多模块的应用,不同模块使用频率差异大,将低频模块分包处理优化明显。

在pages.json文件配置分包,示例:

 

{

"pages": [

{

"path": "pages/index/index",

"style": {

"navigationBarTitleText": "首页"

}

}

],

"subPackages": [

{

"root": "pages/mall",

"pages": [

{

"path": "productList",

"style": {

"navigationBarTitleText": "商品列表"

}

},

{

"path": "productDetail",

"style": {

"navigationBarTitleText": "商品详情"

}

}

]

},

{

"root": "pages/community",

"pages": [

{

"path": "postList",

"style": {

"navigationBarTitleText": "帖子列表"

}

},

{

"path": "postDetail",

"style": {

"navigationBarTitleText": "帖子详情"

}

}

]

}

]

}

如此,首页等高频主包页面优先加载,用户进入商城或社区模块时,对应分包再按需下载。在小程序环境下,未分包时,加载大型项目主包可能超 2M 限制且缓慢;分包后,主包精简,初始加载秒开,分包按需加载,整体流畅性大幅提升,有效提升用户进入应用时的等待体验。

八、性能监测:持续提升的保障

性能监测是 UniApp 性能优化的 “指南针”,能精准定位问题,指引优化方向。

UniApp 官方提供的 uni-stat 工具,可实时追踪程序运行状态,涵盖 CPU 使用率、内存占用、渲染帧率等关键指标。接入后,在开发控制台直观呈现数据波动,助开发者洞悉应用性能全貌。

GT(GreenTea)性能检测工具同样出色,专注网络请求、渲染性能与内存监控。以电商 APP 为例,借助 GT 发现商品列表加载时网络请求耗时久,经优化图片资源、合并接口请求,加载速度显著提升。

Chrome 浏览器开发者工具也是得力助手,在调试 UniApp 的 H5 版本时,通过 Performance 面板记录操作,精准分析页面加载、脚本执行、资源加载各阶段耗时,挖掘潜在优化点。

运用性能监测工具时,需依据项目特性抉择。实时性要求高的社交 APP,uni-stat 实时反馈助快速定位卡顿;侧重网络交互的应用,GT 深度剖析请求优化空间;初期调试 H5 端,Chrome 工具便捷易用。持续关注监测数据,依据结果针对性优化,是 UniApp 性能不断进阶的秘诀,让应用在各平台表现卓越,为用户呈献优质体验。

九、总结

UniApp 性能优化是一项系统工程,涵盖代码、图片、资源、渲染、逻辑、加载等多个层面。从基础的代码压缩混淆、图片格式与加载策略优化,到进阶的虚拟列表运用、分包加载与动态组件加载,每一步都紧密相扣。持续运用性能监测工具,依据数据反馈精准优化,是打造高性能 UniApp 的关键。随着技术迭代与用户需求升级,性能优化永无止境,开发者需不断探索实践,方能让 UniApp 应用在竞争激烈的市场中脱颖而出,为用户带来极致体验,实现商业价值与用户满意度的双赢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解MemCache

随着互联网应用的飞速发展&#xff0c;动态Web应用的性能问题逐渐成为开发者关注的焦点。其中&#xff0c;数据库作为系统性能的关键瓶颈&#xff0c;在用户请求量急剧增加的情况下&#xff0c;往往难以快速响应用户需求。为了解决这一问题&#xff0c;缓存技术应运而生。MemCa…

webrtc 源码阅读 make_ref_counted模板函数用法

目录 1. 模板参数解析 1.1 typename T 1.2 typename... Args 1.3 typename std::enable_if::value, T>::type* nullptr 2. scoped_refptr 3. new RefCountedObject(std::forward(args)...); 4. 综合说明 5.在webrtc中的用法 5.1 peerConnectionFactory对象的构建过…

【MySQL】数据操作

数据操作 一、INSERT1、介绍2、语法3、语法介绍4、注意事项5、示例 二、插入否则更新1、介绍2、语法3、语法介绍4、示例 三、ROW_COUNT1、介绍2、示例 四、REPLACE1、介绍2、语法3、示例 五、UPDATE1、介绍2、语法3、示例 六、DELETE1、介绍2、语法3、语法介绍 七、TRUNCATE1、…

表单元素(标签)有哪些?

HTML 中的表单元素&#xff08;标签&#xff09;用于收集用户输入的数据&#xff0c;常见的有以下几种&#xff1a; 文本输入框 <input type"text">&#xff1a;用于单行文本输入&#xff0c;如用户名、密码等。可以通过设置maxlength属性限制输入字符数&…

基于W2605C语音识别合成芯片的智能语音交互闹钟方案-AI对话享受智能生活

随着科技的飞速发展&#xff0c;智能家居产品正逐步渗透到我们的日常生活中&#xff0c;其中智能闹钟作为时间管理的得力助手&#xff0c;也在不断进化。基于W2605C语音识别与语音合成芯片的智能语音交互闹钟&#xff0c;凭借其强大的联网能力、自动校时功能、实时天气获取、以…

机器学习中回归预测模型中常用四个评价指标MBE、MAE、RMSE、R2解释

在机器学习中&#xff0c;评估模型性能时常用的四个指标包括平均绝对误差&#xff08;Mean Absolute Error, MAE&#xff09;、均方误差&#xff08;Mean Squared Error, MSE&#xff09;、均方根误差&#xff08;Root Mean Squared Error, RMSE&#xff09;和决定系数&#xf…

Visual Studio 玩转 IntelliCode AI辅助开发

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

超详细!一文搞定PID!嵌入式STM32-PID位置环和速度环

本文目录 一、知识点1. PID是什么&#xff1f;2. 积分限幅--用于限制无限累加的积分项3. 输出值限幅--用于任何pid的输出4. PID工程 二、各类PID1. 位置式PID&#xff08;用于位置环&#xff09;&#xff08;1&#xff09;公式&#xff08;2&#xff09;代码使用代码 2. 增量式…

直观解读 JuiceFS 的数据和元数据设计(一)

大家读完觉得有意义和帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 JuiceFS 高层架构与组件2 搭建极简 JuiceFS 集群 2.1 搭建元数据集群2.2 搭建对象存储&#xff08;MinIO&#xff09; 2.2.1 启动 MinIO server2.2.2 创建 bucket2.3 下载 juicefs 客户端2.4 创…

数据结构漫游记:静态双向链表

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

【Web安全】文件写入漏洞 ASP 网页病毒模拟(文件写入漏洞+FilesystemObject)

【Web安全】文件写入漏洞 ASP 网页病毒模拟&#xff08;文件写入漏洞FilesystemObject&#xff09; 原理 文件写入漏洞 文件写入漏洞是指攻击者通过某种方式在服务器上创建或修改文件的漏洞。攻击者可以利用此漏洞在服务器上写入恶意代码或文件&#xff0c;从而实现进一步的…

【Unity3d】C#浮点数丢失精度问题

一、float、double浮点数丢失精度问题 Unity3D研究院之被坑了的浮点数的精度&#xff08;一百零三&#xff09; | 雨松MOMO程序研究院 https://segmentfault.com/a/1190000041768195?sortnewest 浮点数丢失精度问题是由于大部分浮点数在IEEE754规范下就是无法准确以二进制…

Browser Use:AI智能体自动化操作浏览器的开源工具

Browser Use:AI智能体自动化操作浏览器的开源工具 Browser Use 简介1. 安装所需依赖2. 生成openai密钥3. 编写代码4. 运行代码5. 部署与优化5.1 部署AI代理5.2 优化与扩展总结Browser Use 简介 browser-use是一个Python库,它能够帮助我们将AI代理与浏览器自动化操作结合起来;…

tcpdump指南(1)

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; tcpdump是一种在网络上转储流量的网络工具。 这篇文章服务器作为一些常用命令的指南。如需完整指南&#xff0c; 请参阅手册页&#xff0c;或在 Linux 计算机上。man tcpdump 1 基本选项 帮助摘要&#…

14. 日常算法

1. 面试题 02.04. 分割链表 题目来源 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 class Solution { public:ListNo…

termux-boot安卓开机自动启动应用

termux安装 github 蓝奏云 v119.1 termux-boot安装 github 蓝奏云 v0.8.1 安装 给权限运行加锁后台 am启动应用命令 am start -n 包名/启动项获取包名和启动入口&#xff08;图中app为爱玩机工具箱&#xff09; 例 简黑时钟蓝奏云 包名com.hm.jhclock 桌面启动项com.hm.jh…

自从学会Git,感觉打开了一扇新大门

“同事让我用 Git 提交代码&#xff0c;我居然直接把项目文件压缩发过去了……”相信很多初学者都经历过类似的窘境。而当你真正掌握 Git 时&#xff0c;才会发现它就像一本魔法书&#xff0c;轻松解决代码管理的种种难题。 为什么 Git 能成为程序员的标配工具&#xff1f;它究…

设计模式 创建型 建造者模式(Builder Pattern)与 常见技术框架应用 解析

单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;又称生成器模式&#xff0c;是一种对象构建模式。它主要用于构建复杂对象&#xff0c;通过将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建出具有不同表示的对象。该模式的核心思想是将…

MATLAB程序转C# WPF,dll集成,混合编程

工作中遇到一个需求&#xff0c;有一部分算法的代码需要MATLAB来进行处理&#xff0c;而最后需要集成到C#中的wpf项目中去&#xff0c;选择灵活性更高的dll&#xff0c;去进行集成。&#xff08;可以简单理解为&#xff1a;将MATLAB的函数&#xff0c;变为C#中类的函数成员&…

常见中间件漏洞复现

1.tomcat 1.1 CVE-2017-12615(put上传) 当在Tomcat的conf&#xff08;配置目录下&#xff09;/web.xml配置文件中添加readonly设置为false时&#xff0c;将导致该漏洞产 ⽣&#xff0c;&#xff08;需要允许put请求&#xff09; , 攻击者可以利⽤PUT方法通过精心构造的数据包…