在工作或学习的过程中,我们会遇到各种各样的问题。这些问题之所以成为问题,是因为它们触及了我们知识的盲区。面对未知,我们需要投入更多时间和精力去学习,逐步填补这些空白,从而点亮我们的知识地图。正是基于这个原因,就有了这个《问题清单》。🔸🔹

1. HTML

1.1. <img>动态修改图片颜色 🔹

在实现el-menu动态配置菜单图标的时候,因为从字体图标替换成在线获取的.svg图片,所以需要研究下如何实现动态配置颜色,好解决后续各项目不通过主题的需求。

transform: translateX(-80px);
filter: drop-shadow(#a80f0f 80px 0);

TypeScript

as keyof typeof

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'. No index signature with a parameter of type 'string' was found on type '{}'.
viewValue.forEach((item: string) => {
        userInfoList.value.push({
          label: t[locale.value][item],
          value: userInfoObject[item as keyof typeof userInfoObject]
        })
})

2. JavaScript

2.1. Array.prototype.every()

every() 方法测试一个数组内的所有元素是否都能通过指定函数的测试。它返回一个布尔值。

every()方法用来判断所有元素是否都通过制定函数的测试,

2.2. Math.floor() 、Math.ceil() 和 Math.round() 🔹

  1. Math.floor(),向下取整,Math.floor(5.96) = 5。
  2. Math.ceil(),向上取整,Math.ceil(5.96) = 6。
  3. Math.round(),四舍五入,取其值的绝对值进行四舍五入,如果原数是负数,结果保持为负。比如Math.round(5.96) = 6;Math.round(-5.0001) = -5。

2.3. 简述js中 for in 与 for of 区别

2.4. js 遍历嵌套数组

2.5. Array.prototype.reduce() 🔹

reduce() 方法对数组中的每个元素按序执行一个提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。

比如使用reduce方法找到子数组长度最长的子数组的写法为:

let longestSubArray = arrs.reduce((prev, current) => {
    return prev.length > current.length ? prev : current;
});

以下是对JavaScript中数组(Array)原型方法 filter(), from(), 和 map() 的简要解释:

2.5.1. Array.prototype.filter()

filter() 方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素。这个方法对数组的每个元素执行一次给定的函数,并利用返回值(真值)来确定是否保留该元素。 语法:

const newArray = array.filter(callback(element[, index[, array]])[, thisArg])

参数:

  • callback: 用来测试每个元素的函数,它可以接收三个参数:
    • element: 当前正在处理的元素。
    • index(可选): 当前元素的索引。
    • array(可选): 调用 filter 的数组。
  • thisArg(可选): 执行 callback 时使用的 this 值。 返回值: 一个新的、由通过测试的元素组成的数组。 示例:
const array = [1, 2, 3, 4, 5];
const filteredArray = array.filter(element => element > 3);
console.log(filteredArray); // [4, 5]

2.5.2. Array.prototype.from()

from() 方法从类数组对象或可迭代对象创建一个新的、浅拷贝的数组实例。 语法:

Array.from(arrayLike[, mapFn[, thisArg]])

参数:

  • arrayLike: 一个类数组对象或可迭代对象,用来从中复制元素。
  • mapFn(可选): 如果指定了该参数,新数组中的每个元素都会执行该回调函数。
  • thisArg(可选): 执行 mapFn 时使用的 this 值。 返回值: 一个新的数组实例。 示例:
const arrayLike = { length: 3, 0: 'a', 1: 'b', 2: 'c' };
const arrayFrom = Array.from(arrayLike);
console.log(arrayFrom); // ['a', 'b', 'c']

2.5.3. Array.prototype.map()

map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。 语法:

const newArray = array.map(callback(element[, index[, array]])[, thisArg])

参数:

  • callback: 为数组中的每个元素执行的函数,它接收三个参数:
    • element: 当前正在处理的元素。
    • index(可选): 当前元素的索引。
    • array(可选): 调用 map 的数组。
  • thisArg(可选): 执行 callback 时使用的 this 值。 返回值: 一个新数组,每个元素都是回调函数的结果。 示例:
const array = [1, 2, 3];
const mappedArray = array.map(element => element * 2);
console.log(mappedArray); // [2, 4, 6]

这些方法都是JavaScript数组处理中非常有用的工具,它们允许开发者以声明式的方式操作数组,提高代码的可读性和简洁性。

map() 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。

2.6. Array.prototype.fill() 🔸

fill() 方法用一个固定值填充一个数组中从起始索引(默认为 0)到终止索引(默认为 array.length)内的全部元素。它返回修改后的数组。比如,创建一个数组长度为8,默认值为false的数组:

let visited = new Array(5).fill(false);
// [false, false, false, false, false]

2.7. type 和 interface 声明的区别

type 和 interface 声明的区别,尽量使用 type 声明,如果使用 interface 但又不进行导出的话,会在 vue-tsc 生成类型声明时报错。

2.8. JSON.stringify() 实现原理

JSON.stringify() 实现原理,多层嵌套数据,转义等等问题理清楚

2.9. js 二维数组

2.10. 暴力解法

2.11. Math.min()

2.12. 双指针

2.13. 时间复杂度

时间复杂度是用来衡量算法执行时间随输入规模增长而增长的程度的一个概念。它描述了算法的运行时间与输入规模之间的关系。通常用大O符号(O)来表示。

时间复杂度是对算法运行时间的一个上界估计,表示在最坏情况下,算法的运行时间随输入规模增长的趋势。它帮助我们理解算法在不同规模的输入下的性能表现,并且在选择算法时提供了一个指导。

常见的时间复杂度包括O(1)(常数时间)、O(log n)(对数时间)、O(n)(线性时间)、O(n log n)(线性对数时间)、O(n^2)(平方时间)等。时间复杂度越低,算法的性能越好。

2.14. String

2.15. 工厂模式

2.16. 闭包

2.17. ESM、CJS构建

2.18. async的作用

2.19. 统计代码运行时长

console.time(’test’) — 开启一个计时器

console.timeEnd(’test’) — 结束计时并且将结果在 console 中打印出来

2.20. 可选链操作符

2.21. toSorted()

const nums = [1, 2, 16, 35, 44, 100, 27, 0]
const newNums = nums.toSorted()
console.log('newNums---', newNums)
输出:[0, 1, 100, 16, 2, 27, 35, 44]

为啥输出结果没有成功排序?

2.22. 按位非(~)🔸

按位非(~) - JavaScript | MDN (mozilla.org)

按位非(~)是一个位运算符,它的作用是对一个数的每个位取反,即0变为1,1变为0。在JavaScript中,对一个数取按位非相当于对这个数取反后再减1。

2.23. 二分查找算法

2.24. 链表 LinkedList 🔹

链表(LinkedList)是一种常见的数据结构,它由一系列节点组成,每个节点包含两部分:数据和指向下一个节点的引用。

常见的有单向链表和双向链表,单向链表中的每个节点只有一个指向下一个节点的引用,双向链表中每个节点都有两个引用,分别指向前一个节点和后一个节点。

链表的实现原理,主要依靠节点之间的引用关系。链表的头部指向第一个节点,而最后一个节点的指针指向 null。这样,当需要遍历链表时,只需从头部开始,依次沿着指针向下移动即可。

举个例子,假设我们有一个单向链表,其中包含节点 A、B、C 和 D,它们依次相连:

A -> B -> C -> D -> null

如果要查询链表中的某个节点,需要从头节点开始,沿着指针依次移动,直到找到目标节点或者到达链表末尾。

如果要删除或者插入节点,则需要调整相邻节点之间的引用关系,以保持链表的连续性。

与 ArrayList 相比,LinkedList 在查找和修改操作方面效率较低,因为需要遍历整个链表才能找到目标元素,但在增加和删除操作方面效率更高,因为不需要移动元素。

2.25. 动态规划

斐波那契数列

https://zhuanlan.zhihu.com/p/365698607

2.26. return、break和continue 🔹

  1. return语句终止函数的执行,并返回一个指定的值给函数调用者。

  2. break语句中止当前循环,switch语句或label语句,并把程序控制流转到紧接着被中止语句后面的语句。中止外层循环,需使用label语句,在外层for循环前加上outer,然后使用break outer实现。

  3. continue声明终止当前循环或标记循环的当前迭代中的语句执行,并在下一次迭代时继续执行循环。

2.27. 右移运算符 »

为什么使用位右移运算符 » 0 实现可以实现取整?

在计算机中,位右移运算符 >> 只能用于整数类型,因此无法直接对浮点数进行位右移操作。如果尝试对浮点数进行位右移操作,编译器通常会将浮点数转换为整数,然后进行位右移操作。

在这种情况下,5.5 将被转换为整数 5,然后进行位右移操作。由于位右移操作是整数运算,结果也是整数,因此结果将是整数 5,而不是浮点数 5.5。

2.28. 位移运算符

« 、»、»>

2.29. 赋值运算符

&=

2.30. 表达式和运算符

表达式和运算符

2.31. JS向上取整、向下取整、四舍五入

2.32. 字符串、数组截取 🔹

  1. String.prototype.split() 方法接受一个模式,通过搜索模式将字符串分割成一个有序的子串列表,将这些子串放入一个数组,并返回该数组。
  2. Array.prototype.splice() 通过移除或者替换已存在的元素和/或添加新元素就地改变一个数组的内容。
  3. Array.prototype.slice() 返回一个新的数组对象,这一对象是一个由 startend 决定的原数组的浅拷贝(包括 start,不包括 end),其中 startend 代表了数组元素的索引。原始数组不会被改变。
  4. Array.prototype.toSpliced() 是 splice()方法的复制版本。它返回一个新数组,并在给定的索引处删除和/或替换了一些元素。

2.33. 为什么Math.max(…[ ‘’, ‘’,’’ ])的值为0 🔹

这行代码使用扩展运算符将数组 ["", "", "", ""] 展开成参数列表,相当于 Math.max("", "", "", "")。由于 Math.max() 方法会将所有参数转换为数字再比较大小,空字符串会被转换为数字 0,因此最终比较的参数为 Math.max(0, 0, 0, 0)

在 JavaScript 中,空字符串会被转换为数字 0 是因为在进行字符串转换为数字的过程中,如果字符串包含非数字字符(除了符号、小数点等特殊字符),则会被转换为数字 0。

当 JavaScript 引擎在转换字符串为数字时,会按照以下规则进行处理:

  1. 如果字符串中包含非数字字符(除了符号、小数点等特殊字符),则转换结果为 NaN(Not-a-Number)。
  2. 如果字符串为空字符串或只包含空格字符,则转换结果为数字 0。
  3. 如果字符串表示整数或浮点数形式的数字(例如 “123”、“3.14”),则会按照对应的数字进行转换。

因此,空字符串会被转换为数字 0 是因为它不包含任何数字字符,符合规则2的转换规则。

2.34. 数组转字符串

to.String()

toLocaleString()

join()

2.35. =====的区别

2.36. String()和new String()的区别

2.37. 字符串强制转换

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String#字符串强制转换

2.38. 超长String转number精度丢失问题 🔹

在实现算法题时,遇到最后数字相加的值和预期的值不一致,因为使用的Number(str)方法,有一定的区间限制,会出现精度丢失。修改为使用BigInt实现,可以表示任意大的整数,但是BigInt在表示时,后缀会有一个n,这样的话就没办法直接和Number类型的数字进行运算,只能Number转为BigInt来运算,拿到结果之后再进行下一步处理。

2.39. JavaScript中splice、slice和split含义和区别?

2.40. JSON.stringify()实现原理了解

2.41. Base64算法

什么是Base64算法?——全网最详细讲解-CSDN博客

2.42. hex、binary、ascii和base64

Hexadecimal (hex)是一种基于16的数字系统,使用数字0-9和字母A-F来表示数值0-15。它常用于表示二进制数据的编码。

Binary (binary)是一种基于2的数字系统,使用数字0和1来表示数值。它是计算机中最基本的数字系统,用于表示所有的数据和指令。

ASCII (American Standard Code for Information Interchange)是一种字符编码标准,用于将字符映射为整数。每个ASCII字符都有一个对应的整数值,范围从0到127。

Base64是一种编码方式,用于将二进制数据转换为可打印的ASCII字符。它将3个字节的二进制数据编码成4个字符,通常用于在网络传输中传递二进制数据。

2.43. 索引、下标

2.44. 哈希表

2.45. 栈 🔹

栈是一种后进先出(LIFO)的数据结构,**类似于我们在现实生活中处理堆叠的物体的方式。**栈的主要操作包括将元素压入栈(push),从栈中弹出元素(pop),和查看栈顶元素(peek)。

2.46. 枚举

2.47. export

2.48. 严格模式

2.49. @ts-ignore

2.50. const、let和var

2.51. 自增(++)运算符

2.52. 什么是 F#

2.53. TypeScript中元组的基本使用

数组合并了相同类型的对象,而元组(Tuple)合并了不同类型的对象。

2.54. switch 和 if else 哪个效率高 🔹

在大多数情况下,switch 语句的效率通常比 if else 语句要高。这是因为 switch 语句使用了跳转表来查找符合条件的分支,而不是逐个比较条件。跳转表实际上是一个数组,通过将条件值作为索引,可以直接访问到对应的目标地址。因此,跳转表的查找方式具有固定的时间复杂度 O(1),无论有多少个分支,查找时间都是恒定的。

相比之下,if else 语句需要逐个比较条件,如果有多个条件,它的查找时间将随着条件数量和复杂度的增加而增加。在最坏的情况下,if else 语句的时间复杂度可能达到 O(n),其中 n 是分支的数量。

然而,在实际应用中,仍然需要根据具体的场景来选择使用 switch 还是 if else。如果条件是固定的值,且分支数量较多,建议使用 switch 语句。如果条件是动态的,并且需要进行更复杂的条件判断,建议使用 if else 语句。

3. Network

3.1. axios获取数据,报错的JSON数据没有返回到catch里面

3.2. axios实现自动设置cookie

3.3. axios中断已发出的请求,简单示例验证

3.4. DNS、URL、IP、TCP、HTTP

3.5. 从输入 URL 到页面加载完成,发生了什么?

3.6. XMLHttpRequest

3.7. FTP

3.8. file://

3.9. Sentry没有8443端口之后

Sentry没有8443端口之后,可以使用Sentry cli登录,自动化上传SourceMap了?为啥?

3.10. PATCH、PUT和POST方法的区别?🔹

请求方法作用请求是否有主体成功的响应是否有主体安全幂等可缓存允许在HTML表单中使用
PATCH用于对资源进行部分修改。可能有不允许
PUT创建一个新的资源或用请求的有效载荷替换目标资源的表示。可能有不允许
POST发送数据给服务器。仅在包含足够新的信息时允许

幂等:任何数量的重复、相同的请求都会使资源处于相同的状态。

以上内容来源于www.mozilla.org。

3.11. 状态码 🔹

项目中有些接口,请求的资源大小有200KB之多,在前端页面交互使用上体验很差,而这些资源通常都不会改变,频繁去请求作用不大,徒增服务器负担。为了解决这个问题,引入HTTP 304 状态码机制,当浏览器发起一个条件请求到服务器时,服务器会使用304状态码来表示请求资源未更新,可以直接使用当前缓存的资源,无需再重新从服务器下载。

  1. 背景、初衷和目标:304状态码主要是为了减少不必要的网络请求,减少服务器负担和提高性能而设计的。当客户端发起条件请求时,服务器可以通过304状态码告知客户端,所请求的资源未发生变化,可以直接使用当前缓存的资源。

  2. 优势和劣势:优势:可以减少网络请求加快前端页面加载速度,降低服务器负担。劣势:如果配置不正确,可能导致前端页面展示的不是最新的数据。

  3. 使用场景: 适用于请求资源过大的业务场景,或者图片、样式等静态资源。

  4. 组成部分和关键点:前端发起的条件请求时需要在请求头中包含条件标识,如If-Modified-Since、If-None-Match等,服务器收到请求后,判断资源是否有更新,如果没有更新会返回304状态码。

    如下所示:

    GET /example.html HTTP/1.1
    Host: www.example.com
    If-None-Match: "abc123"
    If-Modified-Since: Fri, 24 Nov 2023 01:27:35 GMT
    
    HTTP/1.1 304 Not Modified
    
  5. 底层原理和关键实现:当服务器收到前端发起的请求之后,会比较请求中的条件标识和资源的最后更新时间或实体标签,判断资源是否有更新,如果没有更新则返回304状态码,否则会返回200状态码和最新的资源内容。

  6. 已有的实现和对比: 大多数主流的web服务器和浏览器都支持304状态码,如Apache、Nginx、IIS等。与传统的200状态码相比,304状态码能更有效地利用缓存,减少不必要的网络请求和降低服务器资源负担。

要验证服务器是否正确处理304状态码,可以打开浏览器的开发者工具中切换到 Network(网络)选项卡,查看指定的网络请求,在第一次请求之后的请求,是否显示 304 Not Modified ,然后其 Size 和Time 是否较少。如是,就说明在请求时,是使用了浏览器自身的缓存而不是重新从服务器下载资源。

3.12. Fetch API

3.13. HTTP请求行、请求头、请求体、响应行、响应头、响应体详解

4. Git

4.1. git clone -b ${1:-dev}

4.2. gitlab 仓库迁移 🔹

 git clone --mirror url
 git remote set-url –-push origin url
 git push --mirror 

然后会出现提示没有权限的问题,如下图所示:

remote: GitLab: You are not allowed to force push code to a protected branch on this project.

需要打开GitLab,在项目设置那里,开启允许强制更新开关,然后再运行命令git push --mirror即可。

4.3. git pull放弃本地修改,强制更新 🔹

git fetch --all
git reset --hard origin/master
git clean -f -d
  1. git fetch --all:从远程仓库获取最新的内容。
  2. git reset --hard origin/master:将本地仓库的内容重置为与远程仓库相同,包括放弃任何本地修改。
  3. git clean -f -d:清除工作目录中未跟踪的文件和目录。

4.4. git clone fatal:发送请求时出错 🔹

在使用git clone项目时,提示以下信息,然后一直需要提示输入用户名和密码。

fatal: 发送请求时出错。
fatal: 服务器提交了协议冲突. Section=ResponseStatusLine

从上面可知,应该是git配置上面出现了问题,所以就打算将git配置初始化,通过以下命令查看git配置文件所在位置,并将所有.gitconfig文件全都删除。

git config --list --show-origin

重新打开Git Bash Here,使用以下命令,然后配置Git在本地存储凭据信息,以便自动记住用户名和密码,避免每次进行Git操作时都需要输入凭据信息。

git config --global credential.helper store

然后只要输入一次用户名和密码,后续操作就都不需要输入了。

4.5. git命令出现“fatal: 发送请求时出错”错误 🔸

fatal: 发送请求时出错。 fatal: 服务器提交了协议冲突. Section=ResponseStatusLine

4.6. git clone xxx not found 🔹

在使用git从gitlab下载项目的时候,出现以下这个报错问题:

fatal: repository 'https://gitlab.xxx.com/xxx/web/project-name/' not found

因为URL是copy的,所以不会弄错,猜测应该是用户名和密码异常,所以使用以下命令进行配置:

git config --global user.name "xxxx"
git config --global user.password "xxxx"

发现还是失败了,就想着怎么触发用户民和密码输入那个弹窗。看了一下发现使用的URL其实是没有.git结尾的,修改了一下clone的命令为:

git clone https://gitlab.xxx.com/xxx/web/project-name.git

此时,触发了用户名和密码输入弹窗,填入正确信息即可,问题解决。

4.7. git命令窗口样式美化 🔹

用了七八年的东西,一直没有关注样式问题,只觉得还行,但是最近安装nvm,发现一下字体看不清,就看下怎么设置样式,才发现这个可以右键Options然后进行设置,除了字体颜色、背景色,还有主题可选,但是试用了一下,不够美观,如下所示:

企业微信截图_1706757695363

在网上查了一下,发现这个样式还不错。Git Bash界面的美化(一看必会)_git bash美化-CSDN博客,配置流程就是修改.minttyrc文件,位置在C:\Users\weihao,将里面的使用#注释,然后复制样式覆盖即可。

4.8. git 切换分支 🔹

  1. git branch 查看当前分支
  2. git branch -r 查看远程仓库的分支列表
  3. git checkout 切换到已存在的分支
  4. git checkout -b 创建并切换到新分支

在切换分支前,确保你的工作目录是干净的(没有未提交的更改)。如果有未提交的更改,可以使用git stash命令将其暂存起来,然后再切换分支。

5. npm

5.1. 怎么通过Vue3项目相关配置,知道其依赖的node和npm版本

5.2. node和npm是什么关系

5.3. 为什么npm升级之后不做向前兼容,老项目需要依赖指定版本才可以正常运行

5.4. npm install 命令 整个流程是什么样子的

5.5. npm run dev 命令整个流程又是什么样子的

5.6. --force--legacy-peer-deps 的区别是什么

5.7. npm、node怎么做到前端组规范

5.8. npm 升级至最新命令 npm install -g npm@latest

5.9. npm 安装指定版本命令 npm install npm@6.14.15 -g

5.10. Error: Command failed with ENOENT: npm run clean🔹

在维护部门内部的API库时,出现执行命令报错,如下所示:

node:internal/errors:477
    ErrorCaptureStackTrace(err);
    ^
Error: Command failed with ENOENT: npm run clean
spawn npm run clean ENOENT
    at Process.ChildProcess._handle.onexit (node:internal/child_process:283:19)
    at onErrorNT (node:internal/child_process:478:16)
    at processTicksAndRejections (node:internal/process/task_queues:83:21) {
  errno: -2,
  code: 'ENOENT',
  syscall: 'spawn npm run clean',
  path: 'npm run clean',
  spawnargs: [],
  originalMessage: 'spawn npm run clean ENOENT',
  shortMessage: 'Command failed with ENOENT: npm run clean\nspawn npm run clean ENOENT',
  command: 'npm run clean',
  exitCode: undefined,
  signal: undefined,
  signalDescription: undefined,
  stdout: '',
  stderr: '',
  failed: true,
  timedOut: false,
  isCanceled: false,
  killed: false
}

从报错信息可知,代码在执行到npm run clean命令时报错了,提示找不到这个命令,但是我复制命令在终端运行是成功的,在windows10系统是没问题的,但我在mac系统上运行就报错了,执行代码如下所示:

await execa('npm run clean')

初步猜测,可能execa用法在mac环境中不生效。将其注释,没有提示报错,所以,接着就要研究如何在mac环境中使用execa了。只需将

execa('npm run clean') 

改写为

execa('npm', ['run', 'clean'], { shell: true })

即可,这时,我们就会想知道这两种用法有什么区别呢?

execa是一个用于执行shell命令的Node.js模块,它可以将命令作为参数传递给它,并返回一个Promise,以便在命令执行完成之后处理。根据报错提示没有找到npm命令,很有可能是execa模块无法正确识别到环境变量。

所以将npm run clean拆分为npmrun clean两个参数,并将 shell 选项设置为true,以便在子进程中运行命令的时候使用默认的shell,这样可以正确找到npm命令并且识别环境变量,找到npm命令。

5.11. npm i 时卡住了🔹

在使用npm i命令给项目安装依赖时,出现卡住的情况,等了好久,也没见成功或者中断,这就无法入手去解决问题。使用命令npm install --verbose可以看到安装的更多信息,便于排查问题。

5.12. 在windows环境使用git安装nvm 🔹

因公司电脑做了软件安装限制,导致不能使用.exe方式配置nvm工具,但是平时项目开发中,经常需对老项目使用不同的node版本,所以这个工具还是很重要的。确定研究一下有没有其他方式配置nvm,在github上看到有Git Install章节,用法是要git clone项目源码下来,然后配置,但是现在github一直clone不了项目,所以就去gitee上看了一下,发现有这个仓库nvm-cn: 🧊 nvm国内安装工具 (gitee.com),用法很简单,只需要在Git Bash Here上使用以下命令即可安装:

bash -c "$(curl -fsSL https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh)"

然后验证一下,使用命令nvm ls,如下所示:

使用nvm命令时只能在Git Bash Here上使用,在Windows PowerShellCMD命令窗口是使用不了的。

安装新版本

nvm install 20.11.1

切换版本

nvm use 16.14.2

指定默认的Node版本,使用一下命令:

nvm alias default 16.14.2

问题:git bash here每次启动都很慢。

Git Bash extremely slow start up on Windows - Super User

5.13. npm elasticdump

5.14. npm install xxxx –legacy-peer-deps

npm install xxxx –legacy-peer-deps 解决依赖冲突 (https://bbs.huaweicloud.com/blogs/349716?utm_source=zhihu&utm_medium=bbs-ex&utm_campaign=other&utm_content=content)

5.15. npm、yarn、pnpm 幽灵依赖

5.16. pnpm 的 workspaces 方案

5.17. npm config set设置了新的npm私有源,但是一直没有生效🔹

npm install 自己vue next模版,出现封装的库引向的是192.168.24.XXX的npm私有源,使用命令npm config set设置了新的npm私有源112.230.193.XXX,但是一直没有生效,总是报错如下:

原因是因为package-lock.json里面的是192.168.24.XXX的npm私有源,虽然在终端运行命令npm config set设置新的npm私有源路径,但npm install时,读取的还是package-lock.json里面的,起因是npm私有源路径有改动,这个模版没有及时进行更新。涉及到的知识点可以是package-lock.jsonpackage.json的异同。package.json是对项目的高级描述,用于指定项目的基本信息和依赖包的版本范围,而package-lock.json是由npm自动生成和维护的文件,用于确保项目在不同环境下安装的依赖包的版本一致性,在实际开发中,我们只需要编辑和维护package.json文件,而package-lock.json文件会在每次执行npm install命令时自动更新。

5.18. Rollup5.50

5.19. esbuild

5.20. “@zws/vue-next”: “workspace:5.40 "

“@zws/vue-next”: “workspace:5.40 “这个用法为什么会失败?原因是pnpm的workspace用法上面有问题。

5.21. npm -D -dev -g

5.22. pnpm 的 monorepo

5.23. 什么是npx?🔹

因为最近在项目Vue3中集成Sentry前端异常监控系统,看到官方文档里有使用npx的指令,就去了解了一下。当你在项目中使用npx执行一个命令时,npx 会在当前项目的的./node_modules/.bin目录下查找是否有对应可执行的命令,没有找到的话再从全局环境查找是否有安装对应的模块,如果全局环境中没有,会创建一个临时目录,并在其中下载对应的模块,命令执行完毕后临时目录会被删除,不会占有本地资源。这种机制可以确保在执行命令时使用最新的模块,并且不会对全局环境造成过多的污染。

5.24. 使用npm install package@latest 时,安装的是V1.6.0还是V1.6.1-beta ?🔹

在部门搭建私有npm仓库,对一些组件库和工具库进行管理,但是出现有同事使用package@latest下载到了beta版本,研究了npm发包机制知道问题出在哪里,因为在发布版本时,都是使用npm publish命令的,所以事实上V1.6.0-beta只是名称改为了-beta而已,要解决这个问题,后续beta版本发布时,需要使用命令npm publish --tag beta。官方文档如下Adding dist-tags to packages | npm Docs (npmjs.com)

6. Vue

createWebHashHistory

6.1. vuepress 2.x 打包流程机制,以及md文档越来越多,打包特别慢的原因

6.2. Chrome使用http访问会强转为https的问题 🔹

使用Chrome访问HTTP网站时,若浏览器自动转为HTTPS导致访问失败,可尝试以下步骤解决:

  1. 在Chrome浏览器地址栏输入chrome://net-internals/#hsts并回车。
  2. 找到页面中的Delete domain security policies部分。
  3. 输入导致问题的网站域名。
  4. 点击Delete按钮删除该域名的安全策略。

完成上述步骤后,Chrome将不再自动将HTTP请求转为HTTPS,从而解决强转为https的问题。

6.3. Chrome 调试鼠标悬停后出现的元素 🔹

Vue Next项目开发过程中,我们需要调试一些鼠标悬停才会出现的元素,比如Element Plus 里的 <el-dropdown> 组件,如要修改它下拉菜单的背景色,可使用鼠标悬停显示下拉框,然后按下快捷键 Ctrl + Shift + C 触发视图查看,再点击下拉框即可获取Class名称进行修改,如下所示:

6.4. pixijs

https://pixijs.com/

6.5. vue-i18n Must be called at the top of a setup function

在使用vue-i18n的时候,因为是在组合式函数.ts文件中使用的,所以,报错显示如下信息:

Must be called at the top of a `setup` function

6.6. 升级package.json中全部依赖包到最新版本 🔹

在Vue项目package.json中,要将全部依赖包升级至最新版本,可以使用工具npm-check-updates实现,如下所示:

全局安装

npm install -g npm-check-updates

或者,npx安装

npx npm-check-updates

检查并显示最新版本

ncu -u

重新安装

npm install

至此,完成。

6.7. el-table-column中设置type为selection,align为center,异常问题 🔹

Element Plus组件库的Table表格组件,在设置el-table-columntypeselectionaligncenter时,出现只有表头居中了,但是内容没有居中,排查了一下原因,是因为在自行封装的Table组件中,设置了show-overflow-tooltip,虽然已经过滤了type为custom的情况,但是缺少了过滤selection的情况,所以勾选框多了一个el-tooltip的样式,导致center不生效。

6.8. 自行封装的Table组件,顶部边框线没有显示问题 🔸

自行封装的Table组件,顶部边框线没有显示,排查了一下,问题出在.el-table .el-table__cell这个样式,因为我们自己封装的组件库,样式文件来源都会有@xxx标识的,而这个的引用则是index-5c8207ce.css,初步判断是Element Plus官方样式。对比其他项目也是用的这个组件库,是没有这个问题的。Element Plus版本号也是一样的,所以猜测应该是Element Plus样式问题。检查了一下该项目,发现引用的样式是很久以前Beta版本,用来自定义主题的样式的,替换成Element Plus默认用法import 'element-plus/dist/index.css',发现问题解决了。

6.9. Cannot find module xxx or its corresponding type declarations. 🔹

在Vue3项目的vite.config.ts中设置别名之后,在.vue文件中引入会报红提示这个没有找到的错误,验证了下,虽然不影响功能使用,但是体验不好。

VSCode中使用Ctrl+Shift+P,然后输入type,选择Volar:Select TypeScript Version...,然后选择Use Workspace Version xxx即可。

6.10. 百度网站不支持iframe问题

6.11. 查看Vue3项目所需的node和npm版本

如果我新接受一个vue项目,我怎么知道应该使用哪个版本的node和npm去npm install安装依赖的?

6.12. Package.json中依赖库版本号前缀^和~的区别?🔹

在了解^~区别之前,我们需要在语义化版本 2.0.0 | Semantic Versioning (semver.org)上了解项目版本号规范。根据语义化版本规范,一个版本号由三个数字组成,用点号分隔,格式为"主版本号.次版本号.补丁版本号”,例如版本号2.5.6。以下是对每个数字的含义:

  1. 主版本号:当进行大规模的API变更或不兼容的改动时,增加主版本号。这意味着新版本可能会导致现有代码无法正常工作。
  2. 次版本号:当添加新功能,但保持向后兼容时,增加次版本号。新版本引入的改动应该可以与旧版本的代码兼容。
  3. 补丁版本号:当进行小的bug修复或性能优化等不影响现有功能的改动时,增加补丁版本号。补丁版本号的更新应该不会引入新的功能或破坏现有功能。

在package.json文件中,dependencies字段用于指定项目所依赖的包及其版本。在这些依赖项的版本号中:

  1. ^符号:允许安装指定版本的最新次要版本,但不包括更高的主要版本。例如,如果依赖项的版本号为^1.2.3,那么运行npm install命令时,将安装1.2.3版本的最新次要版本,例如1.2.4、1.3.0,但不会安装2.0.0版本。
  2. ~符号:允许安装指定版本的最新补丁版本,但不包括更高的次要版本。例如,如果依赖项的版本号为~1.2.3,那么运行npm install命令时,将安装1.2.3版本的最新补丁版本,例如1.2.4,但不会安装1.3.0版本。

总结起来,^符号允许安装指定版本的最新次要版本,而~符号允许安装指定版本的最新补丁版本。

6.13. 无头浏览器

6.14. 在线地图坐标系转换工具使用🔹

因项目开发计划使用Bing Maps地图替换百度地图,所以就需要考虑坐标转换的问题,否则定位会出现偏差,当前在 www.lddgo.net 上面发现有坐标系转换工具,就使用了一下,进行验证。

  1. Bing Maps转百度地图国内地址:GCJ02 -> BD09 偏差几米左右
  2. Bing Maps转百度地图国外地址:WGS84 -> BD09 偏差几米左右
  3. 百度地图转Bing Maps国内地址:BD09 -> GCJ02 偏差几米左右
  4. 百度地图转Bing Maps国外地址:国外地址不需要转换,直接用 偏差几米左右

6.15. 国际化地图技术选型

因为项目业务后续会涉及国外市场,导致项目地图要能在国外使用,有客户反馈在国外定位,搜索地址没有找到,

6.16. 雪碧图

6.17. 变量提升

Hoisting(变量提升) - MDN Web 文档术语表:Web 相关术语的定义 | MDN (mozilla.org)

以下是对您列出的各个Vue.js相关主题的简要解释:

6.17.1. v-bind="$attrs”

在Vue.js中,v-bind="$attrs"是一个特殊的绑定,它可以将父组件中没有被作为prop声明的属性(attribute)自动传递给子组件的根元素。这在创建封装组件时非常有用,可以确保所有传递给组件的属性都被正确地应用到组件的根元素上,而不需要在子组件中显式地定义每个prop。

6.17.2. unplugin-vue-define-options

unplugin-vue-define-options 是一个Vue.js插件,它允许开发者在单文件组件(SFC)中定义组件选项,而无需使用export default语法。这可以在某些情况下简化组件的编写,尤其是在使用TypeScript时,可以减少样板代码。

6.17.3. 在 Vue6.16.3 中,onTrackonTrigger 的区别?

在Vue 3.6中,onTrackonTrigger是用于调试的钩子,它们与Vue的响应式系统相关。

  • onTrack:当组件的渲染响应式依赖被追踪时调用。这个钩子可以用来了解哪些响应式属性被组件的渲染所依赖。
  • onTrigger:当响应式属性被修改时调用,可以用来了解响应式属性的变动是如何影响组件的。 这两个钩子有助于开发者更好地理解响应式系统的行为,尤其是在进行性能优化时。

6.17.4. vue-next.umd.cjs

vue-next.umd.cjs通常指的是Vue.js下一个主要版本的UMD(Universal Module Definition)构建的CommonJS版本。UMD是一种模块定义方式,使得代码可以在客户端和服务端不同的环境中运行。.cjs扩展名表明这是一个CommonJS模块,通常用于Node.js环境。

6.17.5. ‘ztpcTablePagination.value.pageSize’ is possibly ‘undefined’.ts(18048)

这个错误信息来自TypeScript编译器,它提示开发者在使用ztpcTablePagination.value.pageSize时,这个值可能是undefined。为了解决这个问题,开发者需要确保在使用pageSize之前它已经被正确地初始化或检查了其是否为undefined。可以使用TypeScript的非空断言操作符!或者显式的类型守卫。

6.17.6. Vue Spa单页面的加载过程

Vue单页面应用(Single Page Application, SPA)的加载过程通常包括以下步骤:

  1. 下载入口HTML文件:用户访问Vue SPA时,浏览器首先下载入口HTML文件。
  2. 加载JavaScript主文件:HTML文件中通常会包含一个或多个JavaScript文件链接,这些文件包含Vue框架和应用代码。
  3. 初始化Vue实例:JavaScript文件加载完成后,Vue实例被创建并挂载到DOM上。
  4. 路由解析:Vue Router(Vue.js的路由库)解析URL,确定应该显示哪个组件。
  5. 组件渲染:根据路由,相应的组件被渲染到页面上。
  6. 数据获取:组件可能需要从服务器获取数据,这通常通过API请求完成。
  7. 更新视图:一旦数据被获取,视图会根据数据更新。 这个过程使得用户在浏览SPA时,不需要重新加载整个页面,只需更新必要的部分,从而提供了更加流畅的用户体验。

6.18. Vue3项目模版升级至Vite5,Element Plus组件库国际化问题🔹

X [ERROR] No known conditions for “./lib/locale/lang/zh-cn” specifier in “element-plus” package [plugin vite:dep-scan]

Vue3项目模版,打算部署至Sentry前端监控系统试用,然后就运行项目,因为nodejs版本升级到了v18.18.0,出现一些依赖不兼容的问题,就打算趁这个机会升级至Vite5,然后就遇到了Element Plus组件库国际化问题,研究了一下,是用法上面有了变化导致的,具体可以看这个issue,[i18n] [All] [plugin:vite:import-analysis] No known conditions for “./lib/locale/lang/zh-cn” specifier in “element-plus” package · Issue #13609 · element-plus/element-plus (github.com),方案就是:

// 2.3.7以及之前的用法
import zhCN from "element-plus/lib/locale/lang/zh-cn";
import en from "element-plus/lib/locale/lang/en";

// 2.3.8之后的用法
import zhCN from "element-plus/dist/locale/zh-cn.mjs";
import en from "element-plus/dist/locale/en.mjs";

6.19. 掘金小册子《你不知道的 Chrome 调试技巧》🔹

掘金小册子《你不知道的 Chrome 调试技巧》是免费的,里面主要是讲了一些Chrome DevTools的使用技巧,今天看完,主要是记录了下一些印象比较深的点:

  1. 全屏截图,通过 Capture full size screenshot 命令。
  2. 取色器,Chrome DevTools 自带取色器,之前一直没注意。
  3. console.table() 可以将对象或数组以一个表格方式打印出来,方便查看。
  4. console.log({value1,value2,value3}) 当想打印多个值时,要区分总是要加上前缀,其实通过{}就可以以对象的格式打印出来。
  5. console.log()并没有立即拍摄对象快照,它只是存储一个指向对象的引用,在代码返回事件队列时才去拍摄快照。 使用 JSON.stringify() 方法处理打印的结果。

6.20. <el-cascader />导致 Out of Memory 的原因分析

6.21. 在 HTML 中,<div /><div><div />的区别

两种不同的语法形式,具有不同的含义。

是一个自闭合标签的写法,它表示一个 div 标签没有子元素,例如
标签就是一个自闭合标签,它没有子元素,用来表示一个空的 div 元素。
是一个 div 元素包含一个自闭合 div 标签的写法,它表示一个 div 元素包含一个没有子元素的子 div 元素,例如
标签就是一个 div 元素包含一个子 div 元素的示例。

需要注意的是,<div />语法形式在 HTML 中并不是标准的写法,而是在某些框架和库中使用的一种简化语法,例如 React 中的 JSX,它可以用来表示一个空的 div 元素。在标准的 HTML 中,需要使用具体的标签名称来表示一个元素的开始和结束,例如 <div></div> 标签表示一个 div 元素的开始和结束。

6.22. el-table 向上向下添加一行

6.23. el-table 实现拖拽

el-table 实现拖拽 (https://blog.csdn.net/ddsuuny/article/details/123206503)

6.24. el-table 实现合并单元格

el-table 实现合并单元格(https://blog.csdn.net/weixin_45392318/article/details/124170355)

6.25. css中position属性

css中position属性(absolute|relative|static|fixed)概述及应用

6.26. vitepress的基本使用,与vuepress的对比

6.27. MD文档中使用<table>标签页,会生成br的问题

MD文档中使用<table>标签页,会生成br的问题研究,初步是转义的问题

6.28. 微信PC端浏览器调试解决方案

6.29. 前端拓扑图编辑器插件选型对比

AntV 蚂蚁金服 G6 是一个图可视化引擎。它提供了图的绘制、布局、分析、交互、动画等图可视化的基础能力。旨在让关系变得透明,简单。让用户获得关系数据的 Insight

6.30. vue中实现左右、上下拖拽、复制

6.31. vue实现点击复制功能

6.32. 基于vue的简单流程图开发

6.33. jsplumb-jquery流程图插件

6.34. font-size 在多个浏览器上面的差异

6.35. vue使用js-xlsx插件导出Excel表格

6.36. vuex如何用watch监听this.$store数据的变化

6.37. Element源码系列——Row以及Col组件

6.38. 正则匹配公司名称

6.39. 中国省市数据

6.40. vue基于element组件的国籍选择框

6.41. vue中v-if与v-show的区别

6.42. 如何让Element UI的Message消息提示每次只弹出一个

6.43. vue中监听键盘事件

6.44. vue如何在 v-for 列表中动态添加 ref 并获取对应元素dom

6.45. vue页面的定时刷新

6.46. vue - ElementUI中循环渲染表格,控制字段的显示与隐藏 v-if与v-for同时使用

6.47. vue router 报错:Uncaught (in promise) NavigationDuplicate{_name: “NavigationDuplicated”}

6.48. vue data 响应式失效

vue中通过import引入一个对象,将对象赋值到data中,然后异步修改data中这个对象的属性的值,vue无法监听到

6.49. 从0到1搭建webpack2+vue2自定义模板详细教程

6.50. vue.use的原理和组件的书写规则

6.51. vue this.$router.push()传参

6.52. 父元素设置了minheight,子元素设置height100%无效

6.53. span 超过长度限制 隐藏并在鼠标移入时显示全部字段

6.54. Element导航菜单自定义样式

6.55. vue打包后字体图标显示小方块

6.56. exports 和 module.exports 的区别

6.57. vue父组件向子组件传递一个动态的值,子组件如何保持实时更新实时更新?

7. Flutter

7.1. Android Studio 全局搜索快捷键Ctrl+Shift+F失效

在Android Studio中使用全局搜索快捷键Ctrl+Shift+F时,总是没有任何反应,第一感觉是其他软件占用了这个快捷按键,所以检查了一下,发现在搜狗输入法里就有这个设置,就选择去掉了,如下所示:

7.2. cocoapods

https://guides.cocoapods.org/using/getting-started.html#updating-cocoapods

7.3. Mac中的Ruby是什么?

brew、Ruby、gem

7.4. flutter shorebird

7.5. 萤石flutter插件ys_play6.5

ys_play | Flutter package (pub.dev)

7.6. Running Gradle task ‘assembleDebug’…

Flutter项目初始化时,一直卡在这个任务上面,在Flutter项目android目录下使用命令./gradlew.bat assembleDebug可以看到详情的信息,如下所示:

企业微信截图_17066927027508

7.7. fvm 版本管理

7.8. Flutter国内环境配置 🔹

最近,github都登录不上,挂了梯子,git clone都是失败的,无奈之下,只能研究切换至国内镜像来使用。

首先,在《在中国网络环境下使用 Flutter - Flutter 中文文档》文档页面,可以看到相关介绍。主要是需要将PUB_HOSTED_URLFLUTTER_STORAGE_BASE_URL设置为镜像站点。以 CFUG的镜像为例,使用管理员权限打开Windows Powershell,然后使用Windows setx命令永久设置环境变量,如下所示:

setx PUB_HOSTED_URL https://pub.flutter-io.cn
setx FLUTTER_STORAGE_BASE_URL https://storage.flutter-io.cn

然后关闭窗口,再打开,输入flutter doctor验证。

相关资料:

  1. Flutter 镜像安装帮助:https://mirrors.tuna.tsinghua.edu.cn/help/flutter
  2. Flutter SDK:https://mirrors.tuna.tsinghua.edu.cn/help/flutter-sdk.git

7.9. Pub get、Pub upgrade和Pub outdated

7.10. 使用flutter pub get 会修改pubspec.lock么?

7.11. Android toolchain - develop for Android devices 🔹

在运行flutter doctor命令检测flutter开发环境情况的时候,提示没有找到Android SDK,如下所示:

但在【Setting——Languages&Frameworks——Android SDK——Android SDK Location】上已经配置了对应的地址。可能的原因是flutter的配置没有生效,使用以下命令解决,如下所示:

flutter config --android-sdk E:\Data\SDK\AndroidSDK

提示已经配置成功,如下所示:

此时,再次运行flutter doctor命令,会提示缺少cmdline-tools component,让你运行命令path/to/sdkmanager --install "cmdline-tools;latest"去解决,如下所示:

很有可能是Android SDK没有下载这个依赖,查看Android SDK配置页面,将Android SDK Command-line Tools(latest)勾选上即可,如下所示:

然后,继续运行flutter doctor命令,会提示你一些Android许可证不被接受,需要运行命令flutter doctor --android-licenses,然后一直选择y即可,如下所示:

 Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses

至此,flutter开发环境Android SDK配置不生效问题得以解决。

7.12. gradle-wrapper.properties里怎么知道当前有下载了哪些版本?

7.13. Exception in thread “main” java.util.zip.ZipException: zip END header not found

原因是grade版本不存在。

7.14. Could not determine the dependencies of task ‘:easy_pdf_viewer:compileDebugAidl’.

Failed to find Platform SDK with path: platforms;android-30

7.15. Library Dart Packages has broken classes paths

Library Dart Packages has broken classes path: · Issue #72773 · flutter/flutter (github.com)

7.16. android gradle 下载特别慢的问题🔹

flutter/android开发时,经常遇到gradle下载特别慢的问题,甚至是超时失败,严重影响到项目的开发工作,为了解决这个问题,可以考虑替换成国内的镜像来下载解决。首先,在android/gradle/wrapper/gradle-wrapper.properties中,查看当前gradle版本,如下所示:

然后在腾讯镜像gradle上面,查看是否存在该版本,如下所示:

最后将distributionUrl设置为腾讯镜像地址即可,如下所示:

distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.5-all.zip

gradle不同版本下载太慢—腾讯做了国内镜像可以直接下载_gradle 下载-CSDN博客

7.17. Put get、Pub upgrade和Pub outdated

7.18. Windows Defender 防火墙,域、专用和公用有什么区别?

7.19. Genymotion Mac 插件路径设置

Genymotion Mac 插件路径设置,其值为/Applications/Genymotion.app

7.20. ERROR: JAVA_HOME is set to an invalid directory: D:\tools\Java\jdk-19

项目中因为遇到报错,然后计划使用java 1.8版本,然后JAVA_HOME已经变更了,但是每次运行Flutter项目一直都是报这个错,指向的是之前的旧路径。

7.21. flutter 在Mac下怎么切换指定版本?🔹

在flutter sdk目录下,运行命令 git checkout <指定版本>即可,比如 git checkout 3.3.10,然后使用命令flutter version 查看当前版本,如下所示:截屏2023-11-07 17.42.03

当想要从指定版本切换回最新版本时,可以在flutter sdk目录下,运行命令git branch显示。

8. Sentry

8.1. Loading Wizard failed. Did you provide the right URL?🔹

在给项目配置Sentry时,要将sourcemaps通过sentry-wizard自动上传至Sentry,但是确提示以下报错信息:

Loading Wizard failed. Did you provide the right URL?

再三确认URL是没有问题,所以,就很奇怪这是什么问题?

使用curl命令是没有问题的,但是,返回了sentry网站没有证书的信息。

查看github上面的issues,发现有类似的问题,如下所示:

Loading Wizard failed for NextJs #416

提供的解决方案是,使用命令 set NODE_TLS_REJECT_UNAUTHORIZED=0 ,因为在 Node.js 中,NODE_TLS_REJECT_UNAUTHORIZED 是一个环境变量,用于控制 Node.js 在执行 HTTPS 请求时是否应该拒绝未经授权的 SSL 证书。

然后,可以使用命令npx @sentry/wizard@latest -i sourcemaps可以正常执行了,只是在运行npm run build进行打包的时候,还是报错了,提示证书异常:

error: API request failed
  caused by: [60] SSL peer certificate or SSH remote key was not OK (schannel: SEC_E_UNTRUSTED_ROOT (0x80090325))

所以,还是没办法解决,后来,Sentry更新了证书就好了。

9. Electron-Vue

9.1. node_module 删除失败🔹

在运行electron-vue项目时,打算把node_modules删除了再重新安装,却提示node_modules/electron文件夹正在被使用,删除失败。然后,把相关窗口都关闭了还是不行,猜测是有关联的进程没有关闭,所以,就看下怎么处理。步骤如下:

打开任务管理器 ➔ 性能 ➔ CPU ➔ 打开资源监视器 ➔ 关联的句柄 ➔ 搜索句柄electron ➔ 右键结束进程。

10. JAVA

10.1. AT模式和透传模式🔹

AT模式(AT Command Mode):AT指令模式是一种通过发送特定的AT指令来控制设备的工作模式。在AT模式下,通过发送预定义的AT指令,可以实现对设备进行各种操作,例如设置参数、查询状态、发送数据等。这种模式通常用于与嵌入式设备进行通信,例如GSM模块、蓝牙模块等。

透传模式(Transparent Mode):透传模式是一种直接将串口数据透传到目标设备的工作模式。在透传模式下,设备不会解析和处理接收到的数据,而是直接将数据转发给目标设备,同时将目标设备返回的数据原封不动地传输回来。透传模式通常用于需要将串口数据传递给其他设备进行处理的场景,例如将串口数据透传给单片机、传感器等。

10.2. LoRa和LoRaWAN的区别?🔹

LoRa(长距离低功耗射频)和LoRaWAN(长距离低功耗广域网)是两个不同的概念,它们在物联网(IoT)领域中扮演不同的角色。

LoRa是一种调制技术,用于在无线通信中实现长距离和低功耗的传输。它是由Semtech公司开发的,基于扩频技术的无线通信技术。LoRa可以在不同的频段上进行通信,并具有较高的抗干扰能力和覆盖范围。它被用于构建物联网中的无线传感器网络,可以在城市、农村和工业环境中提供广泛的连接。

LoRaWAN则是一种基于LoRa技术的通信协议,用于在LoRa网络中实现端到端的通信。LoRaWAN定义了设备和网络之间的通信协议,包括设备的注册、数据传输、安全性等方面。LoRaWAN协议采用星形拓扑结构,其中终端设备通过网关与云服务器进行通信。LoRaWAN网络旨在为物联网设备提供长距离的、低功耗的、双向的通信能力,并具有较高的可扩展性和覆盖范围。

因此,LoRa是一种物理层技术,而LoRaWAN是在LoRa技术基础上建立的一种通信协议。LoRa提供了物理层的无线通信能力,而LoRaWAN定义了设备和网络之间的通信规则和协议,使得物联网设备可以在LoRa网络中进行通信。

以下是对您列出的各个主题的简要概述:

10.2.1. 火焰图

火焰图(Flame Graph)是由性能分析师和程序员使用的性能分析工具,它可以帮助开发者查看和分析软件程序的性能瓶颈。火焰图以一个倒置的树状图形式展现,其中每一列代表一个函数调用栈,宽度表示函数在样本中占用的时间比例。通过火焰图,可以快速定位到占用CPU时间最多的代码路径。

10.2.2. 集群

集群(Cluster)指的是一组计算机(节点)的组合,它们协同工作以完成特定的任务。在计算领域,集群可以提高系统的可靠性、可用性和性能。在分布式系统中,集群通常用于负载均衡、故障转移和高可用性等场景。

10.2.3. K8s

K8s 是 Kubernetes 的缩写,它是一个开源的容器编排系统,用于自动化应用容器的部署、扩展和管理。Kubernetes 提供了一个平台,允许你在物理机或虚拟机集群上调度和运行容器。它广泛应用于微服务架构中,以支持自动化、弹性伸缩和声明式配置。

10.2.4. 内网、外网穿透

内网穿透是指将局域网(内网)的服务映射到公网(外网),使得外网的设备可以访问内网的服务。外网穿透则通常指从外网访问内网资源的过程。这通常通过NAT穿透技术实现,常用的工具有Ngrok、FRP等。

10.2.5. Jenkins

Jenkins 是一个开源的自动化服务器,它支持多种自动化任务,如构建、测试和部署软件。Jenkins 可以通过插件扩展其功能,广泛应用于持续集成(CI)和持续部署(CD)领域。

10.2.6. JUnit5

JUnit5 是一个Java语言的单元测试框架,用于编写和运行测试代码。它支持模块化,并且与Java 8及更高版本特性兼容。JUnit5 提供了新的注解和断言方法,使得测试更加简洁和强大。

10.2.7. Prometheus

Prometheus 是一个开源监控系统和时间序列数据库。它通过收集和存储指标数据,并通过规则对数据进行分析和告警。Prometheus 广泛用于监控云原生应用,并且与Kubernetes有良好的集成。

10.2.8. 探活

探活(Health Check)是指定期检查系统或服务的运行状态,以确保它们正常工作。在分布式系统中,探活机制可以自动检测服务故障并进行恢复,常见的探活方式包括HTTP探活、TCP探活等。

10.2.9. Kafka

Kafka 是一个开源的流处理平台,由LinkedIn公司开发,用于构建实时的数据流和应用程序。它以高吞吐量、可扩展性和持久性著称,常用于处理大规模数据流,如日志聚合、实时分析、事件源和消息队列。

10.2.10. springfox

Springfox 是一个开源的API文档生成工具,它基于Spring MVC和Spring Web的注解,自动生成API文档。Springfox 支持Swagger 2.0和OpenAPI 3.0规范,可以帮助开发者快速生成和展示RESTful API的文档。不过,随着Springdoc OpenAPI的兴起,Springfox的使用正在逐渐减少。

11. Android

11.1. Android Studio 引入.so文件

11.2. mac env: node : No such file or directory

11.3. Android基础控件—PopupWindow模仿ios底部弹窗

11.4. mac 环境变量

11.5. 打印Retrofit请求地址、参数、以及返回结果

11.6. glide设置圆形图片与圆角图片

11.7. 使用Retrofit进行Post请求报错: @Field parameters can only be used with form encoding.

11.8. 全局变量快速m命名

11.9. 两分钟理解Android中PX、DP、SP的区别

11.10. Retrofit2 使用@Multipart上传文件

11.11. 集合遍历增删报错 at java.util.HashMap$KeyIterator.next

11.12. linux:cp 复制文件、文件夹到文件夹

11.13. Java GSON:获取JSONObject下所有键的列表

11.14. Android中切换到主线程更新方法

11.15. Android 单例模式的正确姿势

11.16. dagger7.16 详解

11.17. Java及Android中常用链式调用写法简单示例

11.18. Android Okhttp 之WebSocket简单使用

11.19. okhttp 中的websocket 结合RxJava 的网络请求封装

11.20. Adapter与Activity之间的传值

11.21. Android EvenBus的基本使用

11.22. ConstraintLayout,看完一篇真的就够了么?

11.23. Toolbar设置详解

11.24. 给Toolbar的menu添加图标

11.25. Android – ConstraintLayout 中心对齐图像和文本

11.26. Android 复杂的列表视图新写法: MultiType 详解篇

11.27. Android RxJava+Retrofit 一次(合并)请求多个接口

11.28. Android之Application的使用

11.29. Rxjava、Retrofit使用OkHttp保存和添加cookie

11.30. Retrofit使用拦截器添加Cookie

11.31. android Glide简单使用

11.32. SharedPreference的优化

11.33. OnTouch关于performClick的Warning

11.34. MVP+Retrofit实现的原生登录注册

11.35. drawleft,textview、EditText中图片大小设置

11.36. EditText组件drawableLeft属性设置的图片和hint设置的文字之间的距离

11.37. Android实现沉浸式状态栏效果

11.38. 迁移到 AndroidX

11.39. RecyclerView多item布局实现

11.40. 一种优雅的方式实现RecyclerView条目多类型

11.41. BottomNavigationView点击图标颜色不改变

11.42. android.view.ViewGroup.jumpDrawablesToCurrentState(ViewGroup.java:6690)

11.43. android studio 提取局部变量,全局变量,方法快捷键

11.44. BottomNavigationVIew底部导航的使用

11.45. Android中ButterKnife的使用

11.46. 看完让你彻底搞懂Websocket原理

11.47. Uncaught ReferenceError: xxx is not defined at HTMLInputElement.onclick

11.48. ZXing扫一扫,实现机制和算法,研究透彻

11.49. App在修改昵称和上传头像失败

App在修改昵称和上传头像后,按两次返回键退出,再重新登录,显示的还是之前的头像和昵称,但是如果彻底关闭该应用,就不会出现这个现象,跟event内存有关

11.50. 昵称的正则

昵称的正则,允许中英文数字混合,并且限制中文时是26个汉字,英文时是2~12个英文字母,混输时(比如中英、中数、英数)是多少字符,更为人性化的提示

11.51. JSON数据,递归遍历

11.52. 关于Java对象作为参数传递是传值还是传引用的问题

11.53. Android Studio打包签名 Signature Versions V1、V2的选择问题

11.54. ES6、PROMISE、GENERATOR、NEXT、YIELD与KOA

11.55. 取代Promise的Generator生成器函数

11.56. Android Studio之Gradle自动化构建打包

11.57. Android 使用Jenkins持续集成打包发包

11.58. gradle 手动编译出android的简单的apk文件

11.59. gradle 命令打包apk

11.60. JEST顺序执行测试

11.61. Android 实现类似微信,异地登录强制下线

12. 技术管理

12.1. 独家专访亚马逊 CTO Werner Vogels | InfoQ 🔹

  1. 各种商业机构和教育平台都能帮我们快速掌握新的编程语言,所以到底选择哪种语言本身已经不那么重要了。
  2. 由于技术发展太过迅速,高等教育、大学课程根本就跟不上变化。问问那些刚刚走出校园的学生就知道了,他们对区块链、生成式 AI 等新技术的了解肯定不如我们这些从业者。而且随着技术的采用周期越来越短,产品的上市速度也会远超以往。也就是说,学校里传授的知识不再具有先进性。所以除了编程语言之外,我们在学校中的最大收获就是学习能力,这种学习能力决定我们能否成为技术专家、保持终身钻研。
  3. 我认为任何接受过良好基础教育的人都有能力掌握计算机技术,即便专业不同。因为具体学了什么专业并不重要,重要的是教育经历让你掌握了学习能力、知道要如何设立更宏大的目标、如何汇总信息、记在脑子里、进行批判性思考,如此往复。
  4. 在实际工作中,我强调“协作”是日常工作的核心。
  5. 对于招聘,我更关心候选人是否具备在大学里培养的学习能力,而不仅仅是特定的语言或技术。
  6. 技术的变化一刻不停,永远别指望自己毕业之后头一年学到的东西够用一辈子。
  7. 但保守并不代表守旧,研究人员还是在努力把成果整合起来,打造出能让消费者们眼前一亮的产品。就像那个有趣的比喻,如果你看到一只熊在跳舞,那最重要的就是它能跳舞,而不是它跳得好不好。希望大家能用类似的心态看待前沿技术,尽量宽容一点。
  8. AI 可以接管一些繁琐的任务,这使得开发者可以更专注于他们真正擅长的工作,如获取和整合信息、做出决策和规划。
  9. 人需要肩负起监管的职责。请记住,AI 只是辅助、是帮助我们的工具。它们是在帮我们做预测,而不是替我们做预测,责任永远要由人来承担。

12.2. 闭环管理

12.3. 巨佬Jake Wharton曾说过:一个App只需要一个Activity

12.4. InfoQ 在 ETE 大会上对 Android 工程师 Jake Wharton 的采访

12.5. 几种思维

  1. 归纳性思维:

  2. 结构性思维:

  3. MECE原则:

  4. 慢就是快,少就是多。

  5. 别人有,我们也要有的思路是否正确?

12.6. 我们就要做第一

我有时也在想,为什么不能是我呢?我就想干掉所有人,就要做最强的那一个。表面再怎么与世无争,再怎么云淡风轻,但还是无法压制内心深处的猛兽,那种感觉越来越强烈。

前年在整理团队定位、目标、规范、愿景等文档,在和领导谈心时,说到团队未来的发展,当时脱口而出,“团队发展壮大,成立子公司,其他部门凭什么就要比我们厉害呢?我们就要做第一。”现在想来,不免有点心虚,且不说公司关系错综复杂、外部市场瞬息万变,光是团队本身都有很多问题需要解决,谁和谁讨论问题吵起来了要从中调和;谁在会议上说话太难听了要及时打断,避免伤害其他同事自尊;谁和谁表面和气,暗地里互不对付,要及时察觉,避免后续任务安排不够妥当;谁工作上总是耍些小聪明杀了他的心都有了,但又不能表现出来……看似鸡毛蒜皮的事情,但又关乎团队的健康成长,每每斡旋其中,不堪其扰,而这也只是团队管理的一小部分工作而已。话说回来,虽然有点心虚,但我不后悔当时说上面那些话,即便现在也是如此,为什么就要比别人差呢?我就想努力干掉其他人。敢想就敢要,越挫就越勇。等到真有那一天(嗯…真的很难的了哈哈哈…稍微试一试),我想我就会离开,进行下一阶段的事情。

12.7. 兵熊熊一个,将熊熊一窝

一个能打的人只是他能打,能让一群能打的人聚集在一起去“打”,那战斗力可想而知。

12.8. 太阳底下没有新鲜事儿

太阳底下没有新鲜事儿。

12.9. 如果你录用我

12.10. 技术人对抗焦虑的加减法 🔹

技术人对抗焦虑的加减法-阿里云开发者社区 (aliyun.com)

  1. 不要把别人贩卖的焦虑强加到自己的感受中
  2. 没有坑,就让自己先成为萝卜,等待机会
  3. 要从本质去思考问题,如果只是找一匹跑得更快的马,那就不会发明汽车
  4. 决定未来的不是过去,也不是他人的评价,而是你自己定义的将来。
  5. 最挑战的事情,最高级的快乐
  6. 警惕低水平的勤奋,不要碎片化学习
  7. 认知自己,比认知知识点更重要

12.11. 比尔·盖茨&山姆·奥特曼 🔹

OpenAI也搞“年龄歧视”?奥特曼对话盖茨爆料:员工整体年龄偏大,是个坏兆头-InfoQ精选文章

山姆·奥特曼: 大家一定经常让你提点建议,那你一般会怎么说?

比尔·盖茨: 我觉得这世界上有很多不同形式的人才。在我的职业生涯之初,我只重视纯粹的智商,类似于工程技术的灵性。当然,这个逻辑在财务和销售领域也有体现。但事实证明这是不对的。能建立起强大团队的技能组合才是重中之重。能引导人们思考、找到想要解决的问题、建立一支融合不同人才的队伍,才是最重要的能力所在。所以我想告诉年轻人,数学和科学能力当然很重要,但如果你真想成就一番事业,那么前面说的这种才能组合必不可少。

你呢,你会给出什么样的建议?

山姆·奥特曼: 我比较关注大多数人对于风险的错误理解。大家往往害怕放弃自己当前这份轻松愉快的工作,不敢奔赴自己真正想做的事情。但实际上,如果始终止步不前,那他们最终回顾一生,只会感叹自己从没有投入过、没有创办自己想象中的企业、也没试着成为一名 AI 研究者。我觉得这才是最大的风险,是让整个人生沦于平庸的风险。

正因为如此,我们应该明确自己的目标,同时积极询问其他人需要什么,这就是良好的开端。很多人都在以自己不想的方式虚耗时间,而我给出的建议就是试着以积极的方式解决这个问题。

比尔·盖茨: 确实,让人们从事一份自己有成就感、满足感的工作,往往能够迸发出他们自己都难以想象的力量。

山姆·奥特曼: 绝对是这样。

12.12. 为什么都开始搞研发效能?

为什么都开始搞研发效能? (qq.com)

  1. 国内的很多工程实践是为了做而做,而不是从本质上认可这一工程实践的实际价值。
  2. 当把度量变成一个指标游戏的时候,永远不要低估人们在追求指标方面“创造性”,总之我们不应该纯粹面向指标去开展工作,而应该看到指标背后更大的目标,或者是制定这些指标背后的真正动机。
  3. 人越来越像工具,而工具越来越像人。
  4. 对于研发效能,实施的思路不对,方法不对会搞垮一个团队,我们需要的是体系化的方法论和相应的工程实践。

12.13. 研发效能度量实践者指南 🔹

研发效能度量实践者指南(万字长文)-腾讯云开发者社区-腾讯云 (tencent.com)

  1. “我虽然没有功劳,但是我也有苦劳。” 大部分人可能只关注自己的付出,但并不关心付出所获得的实际效果。作为管理者应该为“苦劳鼓掌,为功劳付钱”。而功劳和苦劳的体现也需要借助客观的度量数据来体现,否则团队中的成员会逐渐陷入碌碌无为的窘境。
  2. 管理者往往会把目标拆解为可度量的指标。但是,目标和指标常常并不是简单的全局与局部的关系。目标的拆解过程看起来很顺畅,是那么地理所当然,但是当把拆解完的指标合并起来的的时候,结果往往让人哭笑不得。有一个笑话说的是,“你问人工智能,我要找一个女朋友,像安·海瑟薇一样的大眼睛,像朱莉娅·罗伯茨一样的大嘴,喜爱运动,陆上运动、水上运动都会。人工智能就根据这几个指标给出了母青蛙的答案”。所以,指标和目标常常并不是充分必要的关系。
  3. 指标是为了实现目标的,但是在实践过程中,指标很多时候却是与目标为敌的。管理者常常把目标拆解为指标,时间久了以后,他就只知道指标,而忘了背后更重要的目标。如果目标是林,那么指标就是木,时间久了就是只见树木,不见森林。这个时候忘记了目标是什么的管理者就会变得非常短视。那些不懂数据的人很糟糕,而最最糟糕的人是那些只看数字的人。在福特汽车的发展史上,有一段至暗时期。那些实践经验丰富,但是没有上过商学院的的老一辈管理层被干掉,取而代之的名校管理背景的数据分析师,公司试图通过精细化的数字管理来实现业务的增长。由于这些数据分析师并不熟悉业务,所以就只能看度量数据,越是不懂业务就越依赖度量数据来做决策,最后使整个公司陷入了泥潭。软件研发也有类似的尴尬,为了更好地代码质量,所以就制定了严格的代码测试覆盖率要求。时间一久,大家都机械性的追求这个指标,而忘记了当时设立这个指标的初衷,于是就出现了高覆盖率的大量单元测试中没有断言这样尴尬的局面。

12.14. Showcase深入了解

ShowCase 专治开发的「我自测好了」

12.15. 如何正确的做技术选型?

12.16. 为什么技术团队应该写博客?

12.17. 编写高质量的代码——从命名入手

12.18. 产业数字人才研究与发展报告2023.pdf

deloitte-cn-hc-industrial-digital-talents-zh-230609.pdf

《产业数字人才研究与发展报告》:我国数字人才缺口超过2500万_腾讯新闻 (qq.com)

Cookie Banner是指网站上出现的一种通知条,用于告知用户该网站使用Cookie等技术来收集、存储和处理用户数据,并且需要用户同意这些数据的使用。通常,Cookie Banner会包含一个简要的说明,告知用户使用Cookie的目的和类型,以及提供一个同意或拒绝的选项。此外,还可能包含一个链接,指向更详细的隐私政策或Cookie策略页面。

Cookie政策是网站提供给用户的一份声明,解释了网站如何使用Cookie(一种小型文本文件),以及与Cookie相关的数据收集和隐私保护措施。Cookie是一种存储在用户计算机上的文本文件,它包含有关用户访问网站的信息。许多网站使用Cookie来跟踪用户行为,例如记住用户首选项、购物车信息、广告和其他内容。Cookie政策通常包括以下信息:

  1. 网站使用Cookie的目的和类型。
  2. 与Cookie相关的数据如何收集、存储和使用。
  3. 用户如何控制Cookie的使用和删除Cookie。
  4. 如何保护用户数据隐私。
  5. Cookie政策的更新和变更如何通知用户。

12.20. GDPR

GDPR的全面实施,意味着欧盟对于个人信息的保护及监管达到了前所未有的高度,GDPR堪称史上最严格的数据保护法案,任何违反GDPR的行为,将会产生1000万到2000万欧元的罚款,或企业全球年营业额的2%到4%,以数额最大的为准。

一文读懂GDPR - 知乎 (zhihu.com)

12.21. 快速访问github网站

最近遇到访问github经常失败的问题,因为在公司Windows电脑是不能随便安装软件的,没办法安装梯子软件,所以就找了一下有什么方式能辅助访问github,查了一下在Microsoft Store上有一个Watt Toolkit软件可以使用,效果还可以。

12.22. Edge浏览器解决新建标签页被限制问题

使用Custom New Tab - Microsoft Edge Addons插件解决。

12.23. 问题清单文档内容布局错乱

这个文档出现内容全都塞到目录上面去了,然后怎么调整都没有用,排查了一下,原因是有些标题出现<table><div>但是没有使用高亮符将其高亮,变成文本显示,因为之前Paper主题为了显示<img/>设置了解析html代码,所以导致其解析成html代码运行了。

13. 小技巧

13.1. Windows系统快速删除多层级的文件夹 🔹

Windows系统中,要删除多层级的文件夹,比如项目依赖包node_module,它的目录可能包含有成千上万的文件和子目录,因为系统删除时会将这些文件逐一检查,读取文件大小、权限验证等,会额外增加删除所需的时间,如果电脑配置不太行,真的让人受不了。

基于博文《Windows下快速删除上万个文件和子目录(快速删除文件) 命令行cmd快速删除文件夹》提供的解决方案如下:

D:\tools\FASTDEL中新建一个fastdel.bat文件,然后复制下面的代码:

@ECHO OFF
ECHO Delete Folder: %CD%
PAUSE
SET FOLDER=%CD%
CD ..
DEL /F/Q/S "%FOLDER%\*" > NUL
RMDIR /Q/S "%FOLDER%"
EXIT

保存之后,打开系统环境变量配置页面,在Path路径加上D:\tools\FASTDEL,如下所示:

之后,在你要删除的文件目录下,打开Windows PowerShell命令窗口,然后输入命令FASTDEL进行删除即可,如下所示:

13.2. Markdown 自动加上标题编号 🔹

因为我那个记录问题的markdown文档,需要时不时更新一下内容,所以,标题的编号也要同步更新,这个文档内容那么多,改起来工作量很大,只能研究一下,怎么在markdown文档里自动加上标题编号。

VSCode里有插件能够实现这个需求,自己也使用了一段时间,感觉还是很方便的,只是因为电脑更新系统,不小心卸载了这个插件,不太记得插件名字了,只能使用另一个———— Markdown Header。可使用这个插件增加标题编号时,发现它并不是基于现有的标题编号进行更新,而是额外增加了标题编号,比如1.1 1.1,加上要清空标题编号没有生效,只能看下,怎么把当前文档里的标题编号全都清空,然后,再使用这个插件自动生成标题编号,解决思路是,在VSCode中使用正则表达式搜索,匹配到# 1.2.3类似的格式,一个#加一个空格,然后是标题编号,全部替换成#即可。

(#\s+)(\b\d+(\.\d+)*\b)

接着,使用Ctrl+Shift+P,选择Markdown generate header number,一键生成标题编号。

13.3. 每日背英语单词

之前一直计划每天背30个英文单词,但是坚持了几天就不了了之,总觉得太费时间了,搞不好就要1个小时,有点难顶,现在回过头来想想,自己在做事情上面,还是不够聪明,其实不用贪多,很多学习并不是为了学习知识,而是学习一种习惯,就好像ARTS,并不指望能有多大的收益,最主要的是保持一种习惯,保持一种感觉,这种感觉类似于篮球中的投篮手感,如果中断的时间过久,就会生疏。所以,可以调整为每天就5个英语单词,这个要求不过分吧。

13.4. 写作技巧

  1. 背景、初衷和目标
  2. 优势和劣势
  3. 适用场景
  4. 组成部分和关键点
  5. 底层原理和关键实现
  6. 已有的实现和对比

14. 其他

14.1. 大猩猩理论🔹

查理·芒格的“大猩猩理论”:一个聪明人进入一个有大猩猩的房间,解释他的想法是什么,而那个大猩猩只是坐在那里吃它的香蕉。结束这段谈话后,那个解释的人出来时一定变得更聪明了。

14.2. 康波周期

14.3. “忙碌海狸”图灵机