webpack源码分析——truncateArgs函数

一、truncateArgs 函数

函数功能

该函数可以用于用户界面中的文本截断,确保长文本在有限的显示空间内能够适当显示,并且用户可以了解到部分文本已被省略。

函数参数

  • args:参数数组。用于输出到界面上
  • maxLength:当前界面上可容纳最大可输出字符长度。根据当前参数对要输出的内容进行转换(具体转换如下)

假设args中只有一个参数

let args = ['sksddsloxcc']
  • 当 0 < maxLength <=3时,输出args[0]中的字符(计算公式:[args[0].slice(-availableLength)])。比如:maxLength = 1,输出 c 。maxLength = 2 输出 cc
  • 当 3 < maxLength < arg[0].length时, 输出args[0]中的字符(计算公式:[“…” + args[0].slice(-availableLength + 3)])。比如:maxLength = 4 时,输出…c。maxLength = 5时,输出…cc
  • 当 maxLength >= arg[0].length 时,直接返回arg[0]完整字符请添加图片描述

假设args中有多个参数

let args = ['sksddsloxcc', 'dfdffrvxgsvchsgcvgcdcdsvcdbcuydcedvc', '2345vgsscgvschghgvghsgc', '35677vsgscysvcvgyvgv']

当多个参数时,truncateArgs 函数总是想着把多个参数内容,最大化输出到界面上,因此呈现如下规律。

  1. args中所有值的长度和6取最小值最后再相加的和(maxLength-参数间空格数)做比较
    maxLength - lengths.length + 1 < arraySum(lengths.map(i => Math.min(i, 6)))
    
  2. 如果界面的空间放不下,则从右向左去掉一个参数,递归(这里args中数量会有变化),再做比较,如果多个最大值6相加小于maxLength - lengths.length + 1,则进入第3步
  3. 获取当前args数组中参数字符串长度总和并和当前maxLength - lengths.length + 1比较。如果当前内容放的下就直接返回。放不下则进入第4步
    let currentLength = arraySum(args.map(a => `${a}`.length));
    // Check if all fits into maxLength
    if (currentLength <= maxLength - lengths.length + 1) return args;
    
  4. 因为当前界面放不下当前参数,于是就截断参数(args)中最长的一个。比如:‘dfdffrvxgsvchsgcvgcdcdsvcdbcuydcedvc’,截取一次做一下比较看当前参数的总长度是否小于或等于可用长度。如果时,就进行输出。不是的话就再次进行挑选参数(args)中最长的一个(注意:本次挑选最长的一个和第一次最长的一个不一定是同一个字符,因为第一次已经对它进行了截取),进行截取

最终效果如下
请添加图片描述

源码分析

  1. 对当前args数组计算每一项值的长度,存为lengths,同时获取当前界面可用长度availableLength

    const lengths = args.map(a => `${a}`.length);
    const availableLength = maxLength - lengths.length + 1;
    

    maxLength - lengths.length + 1的意思是 空格也占用空间

  2. 对args数组中只有一项并且availableLength大于0

    if (availableLength > 0 && args.length === 1) {if (availableLength >= args[0].length) { // 当前界面可用长度完全够用return args;} else if (availableLength > 3) { // 当前界面可用长度大于3,则需要拦截并伴随'...'return ["..." + args[0].slice(-availableLength + 3)];} else { // 当前界面可用长度太短了,只能显示几个字符return [args[0].slice(-availableLength)]; // 这里是负号,注意顺序}
    }
    
  3. 多参数情况。 检查lengths中每一项之和是否超过界面可用长度,超过了进行递归

    if (availableLength < arraySum(lengths.map(i => Math.min(i, 6)))) {// remove argsif (args.length > 1)return truncateArgs(args.slice(0, args.length - 1), maxLength);return [];
    }
    

    如果lengths中长度超过6时按照6算,是为了实现在不充裕的界面可用长度下该字符最多显示的数量。就是6个字符。即‘…abc’
    请添加图片描述
    当前界面可用长度为16,去掉空格剩余14。因为装不下所以输出内容,通过availableLength < arraySum(lengths.map(i => Math.min(i, 6))),判断发现可以装下args数组中前3项。所以就打印了前3项内容。至于为什么第1和3项内容有’…',下面会有说明

  4. 检查当前lengths中所有项之和是否超过界面可用长度,没有的话就全部返回。有就需要进行截断最长的项

let currentLength = arraySum(lengths);// Check if all fits into maxLength
if (currentLength <= availableLength) return args;
  1. 截断最长的项,直到总长度符合要求为止。否则进行循环♻️
while (currentLength > availableLength) {const maxLength = Math.max(...lengths); // 获取当前最长项的长度const shorterItems = lengths.filter(l => l !== maxLength); // 过滤得到不长的项const nextToMaxLength =shorterItems.length > 0 ? Math.max(...shorterItems) : 0; // 在不长项中找到次长项(比着最长项短点)const maxReduce = maxLength - nextToMaxLength; // 获取最长项和次长项之间的差距let maxItems = lengths.length - shorterItems.length; // 获取最长项个数,因为有可能lengths有多个最长项let overrun = currentLength - availableLength; // 获取溢出的长度for (let i = 0; i < lengths.length; i++) {if (lengths[i] === maxLength) {// 这里需要比较overrun / maxItems和maxReduce的最小值,以免多减const reduce = Math.min(Math.floor(overrun / maxItems), maxReduce);lengths[i] -= reduce;currentLength -= reduce;overrun -= reduce;maxItems--;}}
}
  1. 对截取后的项进行输出
return args.map((a, i) => {const str = `${a}`;const length = lengths[i];if (str.length === length) {return str;} else if (length > 5) {return "..." + str.slice(-length + 3);} else if (length > 0) {return str.slice(-length);} else {return "";}
});

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

幻兽帕鲁服务器多少钱?Palworld服务器配置价格

腾讯云幻兽帕鲁服务器价格32元起&#xff0c;4核16G12M配置32元1个月、96元3个月、156元6个月、312元一年&#xff0c;支持4-8个玩家&#xff1b;8核32G22M幻兽帕鲁服务器115元1个月、345元3个月&#xff0c;支持10到20人在线开黑。腾讯云百科txybk.com分享更多4核8G12M、16核6…

Pycharm python用matplotlib 3D绘图显示空白解决办法

问题原因&#xff1a; matplotlib版本升级之后显示代码变了&#xff0c;修改为新的 # ax Axes3D(fig) # 原代码 ax fig.add_axes(Axes3D(fig)) # 新代码import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Ax…

ubantu扩容解决 sudo -i 报无法识别

GParted给ubuntu系统磁盘resize大小时候出现cannot resize read-only file system解决办法_gparted无法调整分区大小-CSDN博客https://blog.csdn.net/ningmengzhihe/article/details/127295333?spm1001.2014.3001.5506 解决磁盘挂载系统目录出现问题&#xff1a; 1、sudo -i…

2024年美国大学生数学建模竞赛(C题)探寻网球中的“动量”奥秘|DQN算法和Monte Carlo模拟建模解析,小鹿学长带队指引全代码文章与思路

我是小鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 探寻网球比赛中的“动量”奥秘&#xff01;鹿鹿学长独辟蹊径&#xff0c;运用强化学习与时间序列分析相结合&#xff0c;以DQN和Monte Carlo模拟实现对…

2024美赛ABCDEF题成品参考论文+配套数据代码+参考文献

社区抗灾能力综合评估与决策模型研究&#xff08;其余题目都在文末&#xff09; 摘要&#xff1a;社区抗灾能力的提升对于灾害风险管理至关重要。本研究基于机器学 习方法&#xff0c;构建了社区抗灾能力预测模型&#xff0c;以评估社区在灾害事件中的表现。首先&#xff0c; 我…

【前端web入门第三天】02 CSS字体和文本

文章目录: 1.字体 1.1 字体大小 1.2 字体粗细 1.3 字体样式 1.4 行高 1.5 字体族 1.6 font 复合属性 2. 文本 2.1 文本缩进2.2 文本对齐方式2.3 文本修饰线2.4 color文字颜色 1.字体 1.1 字体大小 属性名: font-size属性值:文字尺寸&#xff0c;PC端网页最常用的单位px …

ffmpeg 时间裁剪之-ss -t与滤镜中trim=start=*:duration=*的区别和联系

背景 工作中遇到的呗。记下来贡着。 滤镜重置时间戳&#xff1a;setptsPTS-STARTPTS 在FFmpeg中&#xff0c;setptsPTS-STARTPTS是一种用于调整视频时间戳&#xff08;PTS&#xff09;的滤镜表达式。这个表达式通常用于视频编辑和处理过程中&#xff0c;用于修改视频的时间轴…

聊聊DoIP吧(一)

DoIP是啥? DoIP代表"Diagnostic over Internet Protocol",即互联网诊断协议。它是一种用于在车辆诊断中进行通信的网络协议。DoIP的目标是在现代汽车中实现高效的诊断和通信。通过使用互联网协议(IP)作为通信基础,DoIP使得诊断信息能够通过网络进行传输,从而提…

上位机图像处理和嵌入式模块部署(linux开发板的选择)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多图像算法是通过上位机来完成的&#xff0c;比如说工业视觉当中的halcon&#xff0c;一般都是要运行在windows平台上面&#xff0c;并且需要高性…

使用unicorn模拟执行去除混淆

0. 前言 在分析某app的so时遇到了间接跳转类型的混淆&#xff0c;不去掉的话无法使用ida f5来静态分析&#xff0c;f5之后就长下面这样&#xff1a; 本文记录一下使用pythonunicorn模拟执行来去掉混淆的过程。 1. 分析混淆的模式 混淆的汇编代码如下&#xff1a; 可以看到…

python+PyQt5 左右声道测试

UI&#xff1a; 源代码&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file MicrophoneWinFrm.ui # # Created by: PyQt5 UI code generator 5.15.2 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is …

前端JavaScript篇之new操作符的实现原理

目录 new操作符的实现原理 new操作符的实现原理 new操作符是用于创建对象的关键字&#xff0c;它的实现原理可以用以下简单的步骤来描述&#xff1a; 创建一个新的空对象。将新对象的原型指向构造函数的原型对象。将构造函数的作用域赋给新对象&#xff08;即将构造函数中的t…