Vite 是一个由 Evan You(Vue 的作者)创建的现代构建工具,旨在提供快速的开发体验和高效的生产构建。Vite 的主要特点是快速的 热更新(HMR),快速的构建速度,以及支持原生的 ES 模块(ESM)开发。 1. 命令行输入 vite 后发生的事情 当你在命令行输入 vite 并按下回车时,Vite 会启动本地开发服务器,并进行以下几步操作: 1.1 启动开发服务器 启动本地服务器:Vite 会启动一个本地开发服务器,默认情况下会在 localhost:3000 端口运行。你可以在浏览器中查看你的项目。...
在 HMR (Hot Module Replacement) 中,compiler、runtime 和 manifest 之间的协调关系 compiler:在开发模式下,webpack 会启动 开发服务器(如 webpack-dev-server),并启用 HMR 功能。Compiler 负责监听源代码的变化(例如,文件修改),然后触发构建过程的部分或全量更新。 runtime:负责处理模块的替换和更新, 当 compiler 检测到某个模块发生变化时,runtime 会通过调用 HMR API 动态地替换掉原有的模块,而不重新加载页面。 manifest:当 HMR 更新发...
webpack 的核心概念都有哪些? loader 加载器,主要用于代码转换,将图片,css和js等资源转换成浏览器能识别的代码 plugin 插件,webpack 打包流程中每个环节都提供了钩子函数,可以利用这些钩子函数参与到打包生命周期中,更改或增加 webpack 的某些功能,比如生成页面和 css 文件、压缩打包结果等 module 模块。webpack 将所有依赖均视为模块,无论是 js、css、html、图片,统统都是模块 entry 入口。打包过程中的概念,webpack 以一个或多个文件作为入口点,分析整个依赖关系。 chunk 打包过程中...
一个元素的css属性box-sizing设置为border-box时,它的width指的是? 当 CSS 的box-sizing属性设置为border-box时,元素的width和height会包含边框(border)、内边距(padding)和内容区的宽度 / 高度,不会把外边距(margin)纳入计算范围;如果是默认的content-box,则width仅代表内容区的宽度。 延申 box-sizing决定了元素的总尺寸计算方式,它影响了元素的布局和定位方式。 content-box(默认值): width和height仅包含内容区,不包含边框和内边距。<...
instanceof 用来判断:某个对象的原型链上,是否能找到某个构造函数的 prototype。 obj instanceof Ctor 结论先说 instanceof 判断的是 原型链关系,不是“类型”本身。 左侧必须是对象(或函数),原始类型(1 / 'a' / true / null / undefined)一般都是 false。 右侧必须是“可作为构造器/有 prototype 的对象”(通常是函数),否则会抛 TypeError。 运行机制(核心原理) 在不考虑 `Symbol...
Array.prototype.map 用于把数组中的每个元素通过回调函数“映射”为一个新值,并返回一个等长的新数组。 const result = arr.map((value, index, array) => { return newValue; }, thisArg); 一句话理解 map 不会修改原数组(除非你的回调里主动改) 返回的新数组长度与原数组 length 相同 “空位(holes)”不会调用回调,结果里也保持空位 语义细节(高频) 1) 回调参数 value:当前元素值 `...
Array.prototype.flat 用于把多维数组“拍平”为一维数组(或指定深度的更低维数组)。 const newArr = arr.flat(depth); // depth 可选,默认 1 // 返回新数组,原数组不变 一句话理解 flat(1):只展开一层 flat(2):展开两层 flat(Infinity):展开到不能再展开 行为细节(面试容易问) 1) 只会展开数组:元素是对象不会被展开。 2) 会跳过空位(holes): [, 1, [2]].flat(); // => ...
数组去重(Unique / Deduplication)指从数组中移除“重复元素”。关键点不在于“怎么删”,而在于: 你如何定义“重复”?(值相等 / 引用相同 / 某些字段相同 / 自定义比较) 你是否需要保留原始顺序?(一般去重保留第一次出现的元素) 下面按常见场景整理:基础类型、对象按字段、联合字段、自定义比较,并补充复杂度与坑点。 1) 基础类型去重:Set 适用:number/string/boolean/null/undefined/symbol/bigint 等“可直接比较的值”。 复杂度 时间:$O(n)$ 空间:$O(n)$ ...
深拷贝(Deep Clone)指:复制出一个全新的数据结构,使得修改新对象的任意层级,不会影响原对象。 浅拷贝:只拷贝一层引用(例如 {...obj}、arr.slice()),嵌套对象仍共享引用。 深拷贝:递归地拷贝所有可达子对象(并处理循环引用)。 什么时候需要深拷贝 需要在不影响原数据的情况下做“试算/回滚”(例如表单草稿、撤销重做) Redux/不可变数据没用到结构共享,需要简单“隔离”数据 对象结构复杂且会被多处修改(避免意外的引用共享) 如果你的数据天然是“不可变”的(只读 + 通过新对象更新),通常不需要深拷贝。 常见方案...
HTTP请求特性 幂等 如果同样的请求被执行一次与连续执行多次,对服务器的预期影响是相同的,那么称这个 HTTP 方法是幂等的。幂等性只考虑服务器的状态,每次请求返回的响应可以不同。 幂等的 HTTP 方法 GET:它是用来获取资源的,不会改变服务器的状态,所以多次执行不会产生不同的结果。 HEAD:类似于 GET,但只返回响应头,不包括资源的主体内容,也不会改变服务器状态。 PUT:用来更新资源,每次发送相同的数据,都会使资源的状态保持一致。即使你多次执行,资源的最终状态依然是相同的。 DELETE:用来删除资源。虽然多次执行 D...