git commit规范
commit 规范HeaderHeader 分为三个部分 type, scope, summary,其中 type 和 summary 为必填项,scope 可以省略,格式如下:
1<type>(<scope>): <summary>
Type:
用于说明 git commit 的类别,只允许使用下面的标识。
- feat: 新功能(feature)。
- fix: 修复bug,可以是QA发现的BUG,也可以是研发自己发现的BUG。
- docs: 文档(documentation)。
- style: 格式(不影响代码运行的变动)。
- refactor: 重构(即不是新增功能,也不是修改bug的代码变动)。
- perf: 优化相关,比如提升性能、体验。
- test: 增加测试。
- chore: 构建过程或辅助工具的变动。
- revert: 回滚到上一个版本。
Scope
Scope 用于说明 commit 影响的范围,比如 Controller、DAO、View 等等,视项目不同而不同。例如在 Angular ...
monorepo & pnpm
pnpm
集中存储
monorepo
依赖隔离
monorepo
解决重复代码的维护
解决了需要私服发布和管理 npm
越来越受到前端的欢迎
一个工作空间下面可以放多个项目,可以相互依赖和访问,用来解决不同项目去依赖同一组件,
计算机网络面试题
HTTP 常见的状态码
1xx : 请求正在被处理。
2xx : 请求处理成功
3xx : 需要进行重定向,资源位置发生移动
4xx : 客户端错误,服务器无法处理
5xx : 服务器错误, 服务器处理请求发生了错误
2xx:
200: 请求被成功处理
204: 请求被成功处理,但响应的主体部分为空,适用于只需要客户端向服务端发送数据的情况
206: 客户端进行了部分请求,服务端返回指定部分的内容
3xx:
301: 请求的资源已被分配了新的 URL,永久性重定向
302: 请求的资源已被分配了新的 URL,暂时性重定向
303: 同 302,区别在与服务端要求客户端使用 Get 方法请求新的 URL
304: 不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。
4xx:
401: 请求报文中存在语法错误
402: 发送的请求需要 HTTP 认证
403: 请求的资源被服务器拒绝
404: 服务器上没有请求的资源
5xx:
500: 服务器在处理请求时出现了错误
501: 客户端请求的功 ...
rollup和webpack
rollup 和 webpack 打包原理简述版rollup简单来说就是一开始会生成一个Bundle实例,实例在 build 的时候,会从入口触发,每个文件生成一个module实例,包含模块的源代码、路径、模块的抽象语法树 ast,然后将语法树语句展开,并作相应的转换,最后调用generate生成最终的代码,拼接所有语句,输出bundle。
webpackWebpack 的运行流程是一个串行的过程,从启动到结束会依次执行以下流程 :
初始化参数:从配置文件和 Shell 语句中读取与合并参数,得出最终的参数。
开始编译:用上一步得到的参数初始化 Compiler 对象,加载所有配置的插件,执行对象的 run 方法开始执行编译。
确定入口:根据配置中的 entry 找出所有的入口文件。
编译模块:从入口文件出发,调用所有配置的 Loader 对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都经过了本步骤的处理。
完成模块编译:在经过第 4 步使用 Loader 翻译完所有模块后,得到了每个模块被翻译后的最终内容以及它们之间的依赖关系。
输出资源:根据 ...
JavaScript零碎面试题
函数表达式和函数声明有什么区别?函数声明语法:
123function 函数名(参数) { 要执行的代码;}
函数表达式语法:
123var/let/const 变量=function(参数){ 要执行的代码}
函数声明和函数表达式的区别?函数声明必须带有标识符(函数名称),函数表达式则可以省略
表达式里的名字不能在函数外面用,只能在函数内部用函数有一个 name 属性,指向紧跟在 function 关键字之后的那个函数名。如果函数表达式没有名字,那 name 属性指向变量名函数声明会被预解析,函数表达式不会
12345678910111213141516171819202122232425262728293031323334//1、名字//函数声明必需带名字function fn() {}//function(){}; //报错,没有名字//函数表达式可以没有名字let fn1 = function () {};(function () {} ...
垃圾回收与内存泄漏
垃圾回收内存生命周期
分配内存:当我们申请变量、函数、对象的时候,系统会自动为它们分配内存。
内存使用:即读写内存,也就是使用变量、函数等。
内存回收:使用完毕,由垃圾回收机制自动回收不再使用的内存。
概念GC是Garbage Collection,程序过程中会产生很多垃圾,这些垃圾是程序不再使用的内存或者一些不可达的对象,而GC就是负责回收垃圾的,找到内存中的垃圾、并释放和回收空间。
在浏览器的发展历史上,用到过两种主要的标记策略:标记清理 和 引用计数。
垃圾回收的方式引用计数
引用计数的核心思想是每个值都被记录它被引用的次数。创建一个对象并将其赋值给变量 a,此时,该对象的引用计数为 1。
如果该对象又被赋值给变量 b,那么引用计数加 1 变为 2。如果保存对该对象引用的变量被其他对象给覆盖了,那么该对象引用计数减一。当一个对象的引用数为 0 时,就说明该对象可以被垃圾回收器安全地清除,以释放其占用的内存。
引用计数的优点:
可即刻回收垃圾, 当引用计数为 0 时,对象在变成垃圾的时候会立刻被回收。
因为是及时回收,不需要专门的垃圾回收程序,避免了长时间的垃圾回收暂停, ...
闭包、执行上下文、作用域
闭包什么是闭包?闭包是指那些能够访问自由变量的函数。
自由变量是指作用域外的变量。
当内部函数使用外部函数的变量就形成了一个闭包。
闭包的优缺点?
优点:使我们能够在函数内部访问到函数外部的变量,可以通过这种方法来创建私有化变量,在私有化的基础上保持变量,常常应用在节流防抖等应用场景中。
缺点:也就在闭包另一个用途中,已经运行结束的函数执行上下文中的变量对象继续留在内存中,因为闭包函数保留了这个变量对象的引用,所以变量对象 不会被垃圾回收机制回收,因为不会被回收,就可能导致内存泄漏的情况。
扩展知识点: 垃圾回收机制、内存泄漏
作用域、作用域链的理解作用域作用域是指代码中定义变量的区域,作用域分为全局作用域、函数(局部)作用域、块级作用域。
全局作用域是指在代码中任何位置都可以访问的作用域,是整个程序的最外层作用域,在浏览器环境中,全局作用域通常指window对象。全局作用域有弊端,过多的全局作用域变量会污染全局命名空间,容易引起命名冲突。如果直接给定义的变量赋值,变量就会成为全局变量。
函数作用域就是指每个函数都会创建自己的作用域,变量的作用域仅限于函数内部,函数外部无 ...
(一)原型、原型链
原型和原型链什么是原型?我们创建的每一个构造函数都有一个 prototype 属性,它指向一个对象,这个对象可以包含由该函数创建的所有实例共享 属性和方法。
prototype就是调用构造函数创建的实例的原型对象。
使用原型对象的好处?可以让所有的对象实例共享它所包含的属性和方法。
构造函数、实例、原型对象的关系?每个构造函数都有一个原型对象。也就是prototype。
每个原型对象都有一个指向构造函数的属性,就是constructor。
每个实例都有一个__proto__属性,指向原型对象。
__proto__被称为隐式原型,prototype被称为显式原型,也就是说一个对象的隐式原型指向了该对象的构造函数的显式原型。在显式原型上
定义的属性和方法,通过隐式原型传递给了构造函数的实例,这样实例就能访问到构造函数原型上的属性和方法了。
什么是原型链?prototype机制就是存在于对象中的一个内部链接,它会引用其他对象。
如果在当前对象没有找到想要的属性或方法时,js 引擎就会沿着 prototype 关联的对象继续查找,以此类推。这一系列对象的链接就被称为原型链。
原型链最顶端是 O ...
MDN文档笔记
前言背了八股文后去牛客网上做了下笔试题然后被吊打了,感觉光背八股文还是有很多点会遗漏,
所以打算看一遍 MDN 的 JavaScript 教程,并且在这里做笔记,方面后面回顾复习。
JavaScript 指南语法和数据类型
JavaScript 是区分大小写,变量 früh 和 Früh 则是两个不同的变量
在代码执行过程中,注释将被自动跳过(不执行)
标识符使用变量来作为值的符号名。变量的名字又叫做标识符,或者是字面量。
标识符只能包含字母或数字或下划线(‘_‘)或美元符号(“$”),且不能以数字开头。
JavaScript 无法将标识符转换为字符串,但有时可以将字符串解析为标识符。
JavaScript 语言是区分大小写的,所以字母可以是从“A”到“Z”的大写字
母和从“a”到“z”的小写字母
变量求值
用 var 或 let 语句声明的变量,如果没有赋初始值,则其值为 undefined.
如果访问一个未声明的变量会导致抛出一个引用错误(ReferenceError)异常.
可以使用 undefined 来判断一个变量是否已赋值.
undefined 值在 ...
Vue.js相关知识汇总
前言记录有关 Vue.js 的相关知识问题,方便复习。
参考博客2021 高频前端面试汇总之 Vue 篇
Vue 基础使用Object.defineProperty()来进行数据劫持有什么缺点?在对一些属性进行操作时,使用这种方法无法拦截,比如通过下标方式修改数组数据或者给对象新增属性,都不能触发组件的重新渲染,因为Object.defineProperty不能拦截到这些操作。
更精确的来说,对于数组而言,大部分操作都是拦截不到的,只是 Vue 内部通过重写函数的方式解决了这个问题。
在 Vue3.0 中已经不使用这种方式了,则是通过使用Proxy对对象进行处理,从而实现数据劫持。使用Proxy 的好处是它可以完美的监听到任何方式的数据改变,唯一的缺点是兼容性的问题,因为Proxy是 ES6 的语法
Computed和Methods的区别可以将同一个函数定义为一个method或者一个计算属性。对于最终的结果,两种方式是相同的。
不同点:
computed: 计算属性是基于它们的依赖进行缓存的,只有在它的相关依赖发生改变时才会重新求值;
method 调用总会执行该函数。
v ...