React函数组件更新

React的函数组件(Function Components)自Hooks推出以来已成为React开发的主流方式。理解函数组件的更新原理对于编写高效、可维护的React应用至关重要。本文将深入探讨React函数组件的更新机制。 一、函数组件与类组件的本质区别 在深入更新原理前,我们需要明确函数组件与类组件的根本区别: 类组件:是类的实例,拥有实例属性和生命周期方法 函数组件:是纯函数,接收props作为参数,返回JSX 这种本质区别决定了它们的更新行为完全不同。 二、函数组件的执行机制 当React需要渲染一个函数组件时,它只是简单地调用这个函数: function MyComponent(props) { return <div>{props.message}</div>; } // React内部大致这样处理 const element = MyComponent({ message: 'Hello' }); 每次渲染都是全新的函数调用,所有局部变量和函数都会重新创建。这与类组件形成鲜明对比,类组件在更新时会复用同一个实例。 三、触发更新的场景 函数组件的更新主要由以下情况触发: 父组件重新渲染:即使props未变化,父组件渲染也会导致子组件重新渲染 props发生变化:当传入组件的props值改变时 状态更新:通过useState、useReducer等Hook更新状态 context变化:组件订阅的context值发生变化 Hooks依赖变化:useEffect、useMemo等Hook的依赖项发生变化 四、React的渲染流程 函数组件的更新遵循React的渲染流程: 触发更新:通过setState、父组件渲染等途径触发更新 协调阶段(Reconciliation): React调用函数组件获取新的JSX 与上一次渲染的JSX进行对比(Virtual DOM Diff) 提交阶段(Commit): 将差异应用到真实DOM 执行useLayoutEffect的回调 浏览器绘制:浏览器重绘屏幕 副作用执行:执行useEffect的回调 五、Hooks与组件更新 Hooks是函数组件能够拥有状态和生命周期的关键。理解Hooks的工作机制对理解组件更新至关重要。 useState的工作原理 const [count, setCount] = useState(0); React会在组件首次渲染时为每个useState调用分配一个"状态单元" 后续更新时,React会按照Hooks的调用顺序来提供对应的状态值 setCount调用会触发组件的重新渲染 useEffect与更新 useEffect(() => { // 副作用代码 return () => { // 清理函数 }; }, [dependencies]); 组件每次渲染后,React会比较依赖项数组 如果依赖项变化或没有提供依赖项数组,副作用会重新执行 清理函数会在副作用重新执行前或组件卸载时执行 六、优化更新性能 由于函数组件每次更新都会完整执行函数体,我们需要一些优化手段: ...

December 17, 2024

深拷贝/浅拷贝

浅拷贝和深拷贝都是对于JS中的引用类型而言的,浅拷贝就只是复制对象的引用,如果拷贝后的对象发生变化,原对象也会发生变化。只有深拷贝才是真正地对对象的拷贝。 前言 说到深浅拷贝,必须先提到的是JavaScript的数据类型,大家可以看前面的知识点,这里不多说了。 初学前端的同学,需要知道的一点就是:JavaScript的数据类型分为基本数据类型和引用数据类型。 对于基本数据类型的拷贝,并没有深浅拷贝的区别,我们所说的深浅拷贝都是对于引用数据类型而言的。 浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 const originArray = [1,2,3,4,5]; const originObj = {a:'a',b:'b',c:[1,2,3],d:{dd:'dd'}}; const cloneArray = originArray; const cloneObj = originObj; console.log(cloneArray); // [1,2,3,4,5] console.log(originObj); // {a:'a',b:'b',c:Array[3],d:{dd:'dd'}} cloneArray.push(6); cloneObj.a = {aa:'aa'}; console.log(cloneArray); // [1,2,3,4,5,6] console.log(originArray); // [1,2,3,4,5,6] console.log(cloneObj); // {a:{aa:'aa'},b:'b',c:Array[3],d:{dd:'dd'}} console.log(originArray); // {a:{aa:'aa'},b:'b',c:Array[3],d:{dd:'dd'}} 上面的代码是最简单的利用 = 赋值操作符实现了一个浅拷贝,可以很清楚的看到,随着 cloneArray 和 cloneObj 改变,originArray 和 originObj 也随着发生了变化。 深拷贝 深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制了一层引用,就连值也都复制了。 只要进行了深拷贝,它们老死不相往来,谁也不会影响谁。 目前实现深拷贝的方法不多,主要是两种: 利用 JSON 对象中的 parse 和 stringify 利用递归来实现每一层都重新创建对象并赋值 JSON.stringify/parse的方法 先看看这两个方法吧: The JSON.stringify() method converts a JavaScript value to a JSON string. JSON.stringify 是将一个 JavaScript 值转成一个 JSON 字符串。 ...

November 7, 2024

与 CSS/JS 的交互

HTML、CSS 和 JavaScript 是前端开发的三大基础技术,它们通过不同的方式相互作用,创建交互性良好的网页。 1. HTML 与 CSS 的交互 HTML 负责定义网页的结构,而 CSS 则负责美化这些结构元素。两者的交互主要通过以下方式: <style> 标签:直接在 HTML 中嵌入 CSS 样式。 这种方式将 CSS 写入到 HTML 文件中,但不推荐用于大型项目,因为这会导致样式与结构混杂在一起。 <style> h1 { color: red; } </style> <link> 标签:通过 <link> 标签引入外部 CSS 文件。 这种方式通常用于大型项目中,将样式与结构分离,维护更加清晰。 <link rel="stylesheet" href="styles.css"> 内联样式:直接将样式属性写在 HTML 标签内。 这种方式适合临时的小改动,但不推荐频繁使用,尤其在大型项目中不利于维护。 <h1 style="color: blue;">这是一个标题</h1> 2. HTML 与 JavaScript 的交互 JavaScript 负责操作和控制网页内容,主要与 HTML 进行交互以实现动态效果。以下是交互方式: <script> 标签:通过 <script> 标签直接在 HTML 中嵌入 JavaScript 代码。 此方法会在 HTML 中直接执行 JavaScript,适合小规模的脚本。 <script> alert('这是一个弹窗'); </script> 外部 JavaScript 文件:通过 <script> 标签引入外部 JavaScript 文件。 这种方式将 JavaScript 逻辑与 HTML 分离,便于维护和重用。 <script src="script.js"></script> DOM 操作:通过 JavaScript 操作 DOM(文档对象模型),动态更改 HTML 元素的内容和属性。例如: <p id="text">这是原始文本</p> <script> document.getElementById('text').innerText = '这是通过 JS 改变的文本'; </script> 事件监听:JavaScript 可以通过事件监听器响应用户的交互。例如: <button id="btn">点击我</button> <script> document.getElementById('btn').addEventListener('click', function() { alert('按钮被点击了'); }); </script> 3. CSS 与 JavaScript 的交互 JavaScript 也可以与 CSS 进行交互,动态地控制页面的样式。常见的方法有: ...

October 17, 2024

display

一、display属性介绍 display 属性规定元素应该生成的框的类型。 以下是一些关于display比较常用的属性值: 值 描述 none 元素不会显示 block 此元素将显示为块级元素,此元素前后会带有换行符。 inline 默认。此元素会被显示为内联元素,元素前后没有换行符。 line-block 行内块元素。(CSS2.1 新增的值)[IE6/7不支持] list-item 此元素会作为列表显示。 inline-table 此元素会作为内联表格来显示(类似 table),表格前后没有换行符。 table 此元素会作为块级表格来显示(类似 table),表格前后带有换行符。 table-row 此元素会作为一个表格行显示(类似 tr)。 table-cell 此元素会作为一个表格单元格显示(类似 td 和 th). inherit 规定应该从父元素继承 display 属性的值。 其中我们在前端开发中比较常用的属性值一般是none、block、inline、inline-block。我将按顺序为这些属性值一一讲解。 二、display:none 将元素与其子元素从普通文档流中移除。这时文档的渲染就像元素从来没有存在过一样,也就是说它所占据的空间消失了。元素的内容也会消失。 三、display:block block元素会独占一行,多个block元素会各自新起一行。默认情况下,block元素宽度自动填满其父元素宽度; block元素可以设置margin和padding属性; block元素可以设置width、height属性。 块级元素即使设置了宽度,仍然是独占一行。块级元素在设置宽度的情况下,是通过自定义margin-right来自动填满一行,这个时候你设置margin-right是无效的;块级元素在没有设置宽度的时候,margin-right会生效,块级元素的width通过自定义在自动填满一行。 块级元素在设置宽度的情况下,是通过自定义margin-right来自动填满一行,这个时候你设置margin-right是无效的,如下图所示: 块级元素在没有设置宽度的时候,margin-right会生效,块级元素的width通过自定义在自动填满一行,如下图所示: 四、display:inline inline元素不会独占一行,多个相邻的行内元素会排列在同一行里,直到一行排列不下,才会新换一行,其宽度随元素的内容而变化; inline元素设置width、height属性无效; inline元素的margin和padding属性,水平方向的padding-left、padding-right、margin-left、margin-right都产生边距效果;但竖直方向的padding-top、padding-bottom、margin-top、margin-bottom不会产生边距效果。 如下图所示: 五、display:inline-block 将对象呈现为inline对象,但是对象的内容作为block对象呈现,之后的内联对象会被排列在同一行内。就是集合了block和inline的全部优点。width、height、margin、padding设置都会生效。 如下图所示: 原文:https://juejin.cn/post/6844903781566513160 常见考点 1. 基本概念 请简述 CSS 中的 display 属性及其作用。 display 属性的常见值有哪些?请列举并解释其含义。 例如:block、inline、inline-block、flex、grid、none 等。 2. display: block 什么是 display: block?它会给元素带来哪些表现? 一个块级元素通常具有哪些特点?例如:它的宽度会如何变化?它是否会换行? 3. display: inline 什么是 display: inline?它与 display: block 有什么不同? 内联元素如何处理宽度和高度?它们是否会占据整个可用宽度? 如何让一个内联元素变得像块级元素一样换行? 4. display: inline-block 什么是 display: inline-block?它结合了 inline 和 block 的哪些特点? 使用 inline-block 时,元素的宽高如何影响布局? inline-block 元素如何与其他元素对齐? 5. display: none 请解释 display: none 的作用与 visibility: hidden 的区别。 使用 display: none 会有什么样的表现?例如,它对页面布局有何影响? 当你将一个元素的 display 设置为 none 时,它会消失,但仍然存在于 DOM 中。如何通过 JavaScript 使其重新显示? 6. display: flex display: flex 是什么?它通常用来实现什么样的布局效果? 在使用 flex 布局时,如何控制子元素的排列方向、对齐方式等? justify-content、align-items、flex-direction 等 Flexbox 属性的作用是什么? 7. display: grid 什么是 display: grid 布局?它与 flex 布局有何区别? 在 grid 布局中,如何设置行和列的大小?如何控制子元素的位置? 请举例说明 grid-template-columns、grid-template-rows、grid-gap 等属性的使用方法。 8. display: table 什么是 display: table,它如何模仿传统的 HTML <table> 元素? 使用 display: table 时,如何控制表格的行和列布局? display: table-row、display: table-cell 和 display: table-caption 的作用是什么? 9. 布局模型对比:block vs inline vs flex vs grid 你如何选择使用 block、inline、flex 或 grid 布局? 在实际项目中,什么时候使用 flex 布局,什么时候使用 grid 布局? 请比较 flex 和 grid 布局的优缺点及应用场景。 10. display 与其他布局属性 在使用 display: flex 或 display: grid 布局时,如何与其他布局属性(如 position、float 等)配合使用? 如何解决使用 display: flex 或 display: grid 布局时遇到的常见布局问题,例如元素溢出、对齐等? 11. display: none 与性能 display: none 对页面性能有何影响?如何通过 JavaScript 动态控制显示/隐藏元素以提高性能? 12. display: contents 什么是 display: contents?它是如何工作的?它与其他 display 值有什么区别? 请举例说明 display: contents 的应用场景及可能的问题。 13. display 的继承性 display 属性是否继承?如果没有,如何通过样式继承的方式控制多个元素的 display 属性? 你如何在多个嵌套元素中保持一致的布局设置? 14. display 的可见性与布局 display 属性会影响元素的布局、渲染和可见性。请简要解释 display: none 和 visibility: hidden 的区别,它们对页面的影响不同吗? 15. 实际应用 请描述一个你在实际开发中使用 display 属性解决布局问题的案例。 如果需要在一个响应式设计中调整元素的布局,如何根据屏幕尺寸调整 display 属性?

October 10, 2024

服务器渲染

前言 什么是SSR(Server-Side Rendering)?类似于用Java、ASP.NET、php开发前端页面,服务端准备数据并执行页面渲染,然后把完整的HTML发送给客户端。现代化的SSR通常和Vue、React等前端框架强关联,通过Node.js在服务端提前将page、component使用同构方式渲染为html代码,其目的是在实现SSR时尽量复用一套渲染机制。例如Vue框架就同时支持了CSR(Client-Side Rendering)和SSR。 SSR能解决什么问题? SEO: Google、百度、Yandex、Bing或者Yahoo等搜索引擎会通过网络爬取你的页面并建立索引,如果的信息越完整,那么你的网站就更容易被检索到。使用SSR技术,让页面在服务端提前渲染好再返回给客户端,这样各类搜索引擎就能拿到比较完整的页面信息,提升检索质量。 首屏渲染:SPA(Single Page Application)将页面渲染放到客户端执行,并且在渲染之前要加载大量的Javascript代码,所以首屏渲染需要花费较长时间。而SSR直接在服务端渲染完再返回客户端,使用户能够快速看到页面内容。 有哪些框架支持SSR? 开源库 支持语言 star数 描述 Nuxt Vue 54.9k 快速构架、类型安全、高性能、易扩展 Next React 127k 老牌框架、社区完善、Data Fetch、Styling quasar Vue 26k 丰富的UI、支持桌面端和移动端 Remix React 29.9k 极致的用户体验、开箱即用 本知识点将以 Nuxt 为例,介绍如何实现 SSR。 什么是Nuxt 基于Vue、React、Angular实现的full-stack框架数不胜数,但就Vue框架领域内,应该数Nuxt最为Top 1。Nuxt保持了Vue生态的“开箱即用”特性,类似于Vite,几条指令就可直接run起来。如果你熟悉Vue,那么基于Nuxt写应用,体验上和写Vue客户端应用极其相似。 Nuxt提前预制了一套目录结构,并自动处理路由、导入、数据获取,开发人员仅需按约定的规则实现页面、组件、数据API即可,极大降低开发人员学习成本。Nuxt的特性可总结为: 基于文件的路由: 页面统一添加到pages/目录下,例如添加index.vue、about.vue、contact.vue,就可以通过/访问首页,通过/about返回关于页面; 代码分割:得益于Vue的Virtual Node,Nuxt根据目录规则提前生成完整的依赖树,这样能够将所有code拆分为最小单元的chunks, 从而减少应用初始化加载时间; 开箱即用的SSR:Nuxt内部使用Vue的SSR,除了Vue实现SSR、CSR本身的差异,可以像开发CSR的Vue应用一样来开发SSR,降低研发心智负担; 自动导入:在实现页面或组件时,不需要像CSR手动导入(import Card from './Card.Vue')依赖,当Nuxt识别到有使用外部组件,bundle过程会自动识别; 数据获取工具:提供一套组合式FetchAPI,实现client、server端的同构; 配置好的构建工具:默认使用Vite构建,同时支持Webpack、Rspack; Nuxt的架构设计和vue/core很相似,将整体功能拆分为独立的package: 核心引擎:nuxt; bundlers: 打包器包含@nuxt/vite-builde、nuxt/webpack-builder、@nuxt/rspack-builder; 命令行工具:nuxi; 服务端引擎:nitro; 开发套件:@nuxt/kit; 上手体验 初始化项目 使用nuxi提供的指令初始化项目: npx nuxi@latest init nuxt-learn-examples 如果安装过程下载失败,可能需要配置hosts: 185.199.108.133 raw.githubusercontent.com 最新nuxt版本3.14初始化的项目目录比较简单,少了pages、plugins等目录,入口为app.vue: ...

October 5, 2024

react 组件设计模式

首先我们想一个问题,那就是 为什么要学习设计模式? 原因我总结有以下几个方面。 1. 功能复杂,逻辑复用问题。 首先 React 灵活多变性,就决定了 React 项目可以应用多种设计模式。但是这些设计模式的产生也确实办了实事: 场景一: 在一个项目中,全局有一个状态,可以称之为 theme (主题),那么有很多 UI 功能组件需要这个主题,而且这个主题是可以切换的,就像 github 切换暗黑模式一样,那么如何优雅的实现这个功能呢? 这个场景如果我们用 React 的提供者模式,就能轻松搞定了,通过 context 保存全局的主题,然后将 theme 通过 Provider 形式传递下去,需要 theme ,那么消费 context ,就可以了,这样的好处是,只要 theme 改变,消费 context 的组件就会重新更新,达到了切换主题的目的。 场景二: 表单设计场景也需要一定程度上的 React 的设计模式,首先对于表单状态的整体验证需要外层的 Form 绑定事件控制,调度表单的状态下发,验证功能。内层对于每一个表单控件还需要 FormItem 收集数据,让控件变成受控的。 这样的 Form 和 FormItem 方式,就是通过组合模式实现的。 2. 培养设计能力,编程能力 熟练运用 React 的设计模式,可以培养开发者的设计能力,比如 HOC 的设计 ,公共组件的设计 ,自定义 hooks 的设计,一些开源的优秀的库就是通过 React 的灵活性和优秀的设计模式实现的。 例子: 比如在 React 状态管理工具中,无论是 react-redux ,还是 mobx-react,一方面想要把 state 和 dispatch 函数传递给组件,另一方面订阅 state 变化,来促使业务组件更新,那么整个流程中,需要一个或多个 HOC 来搞定。于是 react-redux 提供了 connect,mobx-react 提供了 inject ,observer 等优秀的 hoc。由此可见,学会 React 的设计模式,有助于开发者小到编写公共组件,大到开发开源项目。 ...

December 17, 2024

字符串常见方法

1. 获取字符串长度 JavaScript中的字符串有一个length属性,该属性可以用来获取字符串的长度: const str = 'hello'; str.length // 输出结果:5 2. 获取字符串指定位置的值 charAt()和charCodeAt()方法都可以通过索引来获取指定位置的值: charAt() 方法获取到的是指定位置的字符; charCodeAt()方法获取的是指定位置字符的Unicode值。 (1)charAt() charAt() 方法可以返回指定位置的字符。其语法如下: string.charAt(index) index表示字符在字符串中的索引值: const str = 'hello'; str.charAt(1) // 输出结果:e 我们知道,字符串也可以通过索引值来直接获取对应字符,那它和charAt()有什么区别呢?来看例子: const str = 'hello'; str.charAt(1) // 输出结果:e str[1] // 输出结果:e str.charAt(5) // 输出结果:'' str[5] // 输出结果:undefined 可以看到,当index的取值不在str的长度范围内时,str[index]会返回undefined,而charAt(index)会返回空字符串;除此之外,str[index]不兼容ie6-ie8,charAt(index)可以兼容。 (2)charCodeAt() charCodeAt():该方法会返回指定索引位置字符的 Unicode 值,返回值是 0 - 65535 之间的整数,表示给定索引处的 UTF-16 代码单元,如果指定位置没有字符,将返回 NaN: let str = "abcdefg"; console.log(str.charCodeAt(1)); // "b" --> 98 通过这个方法,可以获取字符串中指定Unicode编码值范围的字符。比如,数字0~9的Unicode编码范围是: 48~57,可以通过这个方法来筛选字符串中的数字,当然如果你更熟悉正则表达式,会更方便。 3. 检索字符串是否包含特定序列 这5个方法都可以用来检索一个字符串中是否包含特定的序列。其中前两个方法得到的指定元素的索引值,并且只会返回第一次匹配到的值的位置。后三个方法返回的是布尔值,表示是否匹配到指定的值。 注意:这5个方法都对大小写敏感! (1)indexOf() indexOf():查找某个字符,有则返回第一次匹配到的位置,否则返回-1,其语法如下: string.indexOf(searchvalue,fromindex) 该方法有两个参数: searchvalue:必需,规定需检索的字符串值; fromindex:可选的整数参数,规定在字符串中开始检索的位置。它的合法取值是 0 到 string.length - 1。如省略该,则从字符串的首字符开始检索。 let str = "abcdefgabc"; console.log(str.indexOf("a")); // 输出结果:0 console.log(str.indexOf("z")); // 输出结果:-1 console.log(str.indexOf("c", 4)) // 输出结果:9 (2)lastIndexOf() lastIndexOf():查找某个字符,有则返回最后一次匹配到的位置,否则返回-1 ...

November 8, 2024

SEO

🌻 前言 SEO 代表搜寻引擎最佳化/搜寻引擎优化(英文全名Search Engine Optimization,简称SEO),是指通过了解搜寻引擎的自然排名的算法逻辑,以提高目标网站在有关搜寻引擎内排名的方式。 网站的 SEO 至关重要,它可以让你的网站获得更好的排名和流量,从而提高网站知名度。对于一些盈利的网站,做好seo,还可以以低成本提高投资回报率。 本文将为你带来非常全面的SEO方案🔥🔥🔥,当然了,网站SEO是长线工作,在做好一些基础的配置之后,更重要的是后期的维护,比如定期更新网站动态文章,不断寻找优质外链资源等🤌。 本文将以三个层面展开: TDK优化 网站质量 SEO手段(10种手段) ❄️ 一、TDK优化 TDK是Title(页面标题)、Meta Description(页面描述)和Meta Keywords(页面关键词)的缩写,对网站的这三个信息的提炼是网站SEO的重要环节。 但是由于一些原因,各大主流搜索引擎基本都已经大大降低甚至移除了 <keywords> 对排名的影响。例如: 百度:几乎放弃了对标签的参考价值。参考:百度官方称:keywords这个meta标签已经被丢进历史垃圾堆了; 谷歌:目前几乎已经不考虑这个标签对于SEO的作用了,它可能更侧重于内容的相关性以及反向链接的考量。参考:# Google 不会将关键字元标记用于网页排名 必应:目前 keywords 标签仍然对排名有一定影响; (一)title标签-网站名片 title标签相当于网站的名片,他会直接显示在搜索结果中。一个好的标题势必可以为网站带来流量,从而提升网站排名。 注意:网站标题避免冗长 例如:<title>掘金</title> (二)META标签-网站信息 META标签是网页head区的辅助性标签,它的作用是经过配置一些参数用以描述页面属性。目前几乎所有搜索引擎都使用网上机器人自动查找meta值来给网页分类。 2.1 meta标签如何使用 meta标签的属性有两种:name和http- equiv。 🍀 “name"属性有以下配置项: Keywords(关键词,现在不再重要了):逗号分隔的关键词列表(告诉搜索引擎页面是与什么相关的); description(网站内容描述,很重要):页面描述。搜索引擎会把这个描述显示在搜索结果中; format-detection:格式检测,比如禁止识别电话,邮箱等; author:作者的名字; Robots:用来告诉搜索机器人哪些页面需要索引,哪些页面不需要索引; theme-color:网站主题色; <meta name="keywords" content="掘金,稀土,Vue.js,前端面试题,Kotlin,ReactNative,Python"> <meta name="description" content="掘金是面向全球中文开发者的技术内容分享与交流平台。我们通过技术文章、沸点、课程、直播等产品和服务,打造一个激发开发者创作灵感,激励开发者沉淀分享,陪伴开发者成长的综合类技术社区。"> <meta name="format-detection" content="telephone=no"> <meta name="author" content="cece"> <Meta name="Robots" Content="Nofollow"> /** all:文件将被检索,且页面上的链接可以被查询; none:文件将不被检索,且页面上的链接不可以被查询;(和 "noindex, no follow" 起相同作用) index:文件将被检索;(让robot/spider登录) follow:页面上的链接可以被查询; noindex:文件将不被检索,但页面上的链接可以被查询;(不让robot/spider登录) nofollow:文件将不被检索,页面上的链接可以被查询。(不让robot/spider顺着此页的连接往下探找) */ <meta name="theme-color" content="#4285f4" /> 🍀 “http- equiv"属性有以下配置项: ...

November 5, 2024

预处理器

前言 花样不断的前端,貌似多技术方案并行,已经成了家常便饭。 从大的框架开始,已经分裂react与vue派系。两者思维上虽然有相互不断的借鉴,但在大的方向思维上却是截然不同。而在react与vue的竞争以及相互较量的过程中,往往把其他的对手都干倒了,现在市场angular,jQuery等都逐步没落。 预编译css也同样,曾经也有多个派系。而后在sass与less的不断竞争中,stylus等其他的编译器也逐步退出市场。本文的重点,对比预编译css,scss与less对比。 基本介绍 先一起看看官方是如何定义或者介绍他们。 Sass 官方定义: Sass是一种基于Ruby的CSS预处理器,它可以扩展CSS语言,并添加许多其他功能,如变量、嵌套规则、Mixin、函数等。Sass文件以“.scss”扩展名保存,与标准CSS文件兼容,并且可以使用普通CSS代码和语法。Sass也有一个较早的语法格式,以“.sass”扩展名保存,使用缩进的语法来代替括号和分号,但它现在已经不那么流行了。 个人理解: sass是第一个流行的CSS预处理器,在2006年产生,这也为后续他用户量第一埋下伏笔。 Scss 官方定义: Scss也是一种基于Ruby的CSS预处理器,它与Sass有很多相似之处,但是它的语法更接近标准CSS,使用花括号和分号。它是一种非常流行的CSS预处理器,与Sass相比,它更容易学习和使用,并且与现有的CSS代码更兼容。 个人理解: Scss是Sass的一种语法格式,由2007推出。这还要从sass的规范语法说起,最典型的就是Sass使用缩进来表示代码块。这使部分使用者比较别扭。而产生了Scss,基于花括号和分号的CSS语法格式,使得它更易于阅读和理解。随着时间的推移,Scss逐渐取代了Sass作为Sass的主要语法格式。 Less 官方定义: Less是一种基于JavaScript的CSS预处理器,它与Sass和Scss有很多相似之处,但它使用类似CSS的语法,并且更容易学习和使用。Less支持变量、Mixin、嵌套规则等功能,并且可以在客户端和服务器端使用。 个人理解: Less由2009推出,也是提供了一套完整的生态链。它的语法跟sass不同。Less的学习成本更低,更容易理解和编写。此外,Less的编译速度比Sass更快。 Stylus 官方定义: Stylus是一种基于JavaScript的CSS预处理器,它与Less、Sass和Scss有很多相似之处,但它的语法非常灵活,可以自由选择使用缩进或花括号来表示嵌套和块。Stylus还支持变量、Mixin、函数等功能,并且具有非常强大的插件系统,可以轻松地扩展其功能。 个人理解: Stylus也是曾经一个比较完善的预编译语言。 但市场份额却原来越少。个人的观点,一是的学习成本高一些,有入门的门槛。而是生态链的问题,sass跟less的有较完善的生态链,而Stylus更像一个独立的东西。 PostCSS 官方定义: PostCSS不是一种独立的CSS预处理器,而是一个CSS处理工具集合,可以通过各种插件扩展其功能。PostCSS可以用于转换CSS语法、提供自动前缀、压缩CSS代码、处理嵌套规则、优化图片等。它不像其他预处理器那样提供自己的语言,而是基于现有的CSS语法。使用PostCSS可以通过插件来实现更多的自定义和灵活性,使其成为一个强大的CSS处理工具。 个人理解: 跟上述的其他的处理器不同,PostCSS不应该算是一个预处理器,但却是我们做适配,压缩等处理时的一个选择。 数据分析 市场占有率分析 我们借助npm官网统计工具对比,查看less与scss的数据量对比: 链接: npm-stat.com/charts.html… npm-stat.com/charts.html… 如上图,左侧为less的数据,右侧为scss的数据。 我们可以通过统计清晰的看到。单单一个sass的下载量,基本达到less的两倍以上。此处还不包含sass阵营的其他工具,包括node-scss,dart-scss的下载量。 可以得出结论:sass的使用量约为less的几倍。(但此处有个值得一提的地方:统计为全球的用户量的统计,并非针对国内) 组件库选择分析 从上述的数据中,我们了解到sass的使用量较多,但是国内出名的组件库,却是less居多。毕竟组件库,也代表我们的使用习惯之一。我们一起看看组件库的选择。 ant design 选择了Less,地址:www.antdv.com/docs/vue/cu… element 选择了scss,地址:element.eleme.io/#/zh-CN/com… varlet 选择了Less,地址:varlet.gitee.io/varlet-ui/#… vant 选择了Less,地址:vant-contrib.gitee.io/vant/v3/#/z… 结论:关于组件库的选择,Less还是占大多数,当然Scss也是部分组件库的选择。 个人分析 相同点 都属于css语法编译的工具。 工具提供的方法也很多雷同。如都支持嵌套,都支持混合器(Mixin),都支持扩展(Extend),都支持颜色函数,都支持变量等等。 生态链都一致丰富,常用构建工具都基本支持,如webpack,vite, rollup等。 社区支持都强,提供了大量的插件、工具和资源,可以帮助开发者更好地使用Sass。 目的性也一致,都提高了CSS编写的效率和可维护性而产生。 不同点 部分语法不同,如Sass 和 SCSS 中的变量使用 $ 符号进行定义和引用,而不是 Less 中使用的 @ 符号 Sass 和 Scss 还提供了一些 Less 没有的特性,例如控制流语句和继承等。 Sass 和 Scss 是基于Ruby或者Dart,Node的预处理器,他需要借助机器安装这些环境来支持。而Less, 是基于JavaScript的CSS预处理器,引入一段JS即可编译,有浏览器还是服务端,他都能编译。 虽然都有强大的社区,生态链。但总体还是Scss更丰富一些。 特性分析 Node-Sass 在国内有一定的兼容性问题,但是基于Dart 语言编写的 Dart Sass以及解决了这个问题。还在使用Node-Sass的建议切换Dart Sass。 Less 的语法相对于 Sass 更加简洁,易于学习和理解。这使得 Less 在国内开发者中更受欢迎,尤其是对于那些不太熟悉预处理器语言的开发者来说。 Sass的阵营更丰富,使用量更高一些,市场份额也更加稳定。除了发家早,这也得益于生态圈,例如 Bootstrap、Foundation、Bulma、Vue.js 等,都在曾经的版本自带了Sass。 国内组件库,还是Less居多,很多"高级前端", 都觉得less 一直都比 sass 要稳定。至少不会出现Node版本,Python版本不一致等问题。 结语 所以Sass与Less谁更强?估计短期还是分不出成败。 ...

October 10, 2024

Vue3 API

📍前言 最近在一次理解vue项目的代码时,发现周一对好多API都不太熟悉。这间接导致的问题是,代码理解速度要比平常要慢很多。于是乎,赶忙把vue API的学习提上了日程。 在下面的文章中,将地板式地扫盲vue3文档中API模块的所有内容,融入周一的理解进行深入介绍。下面就来一起看看吧~🍬 一、🖇框架搭建 1、关于文档 首先附上官方文档的具体材料:cn.vuejs.org/api/ 2、VUE3 API整体盘点 在vue3的全新API中,有部分在vue2的基础上沿用了。还有另外一部分,是vue3所新增加的。我们先来看vue3 API文档主要包含哪些内容? vue3 API主要包含以下六个部分: 全局API —— 全局会用到的API 组合式API —— vue3所拥有的组合式API 选项式API —— vue2所拥有的选项式API 内置内容 —— 指令、组件、特殊元素和特殊属性 单文件组件 —— 语法定义、 进阶API —— 渲染函数、服务端渲染、TS工具类型和自定义渲染 下面将依据上面提到的六大点内容,来进行相应的剖析和讲解。 二、🎨全局API vue3的全局API包含两个部分:应用实例和通用API。那它们各自都有哪些内容呢? 1、应用实例 2、通用API 三、🚲组合式API 谈到vue3 ,相信大家最为熟悉的就是 composition API 了,也就是 组合式 API 。那么,vue3 的 组合式 API 都给我们带来了什么呢? 1、setup 2、响应式:核心 3、响应式:工具函数 4、响应式:进阶 5、生命周期钩子 6、依赖注入 四、🌠选项式API 选项式API 即 options API 。可能有的小伙伴会觉得它在 vue2 项目下会更为常见一些。但在 vue3 项目中,也是有一些 选项式API 值得我们去挖掘的。那都有哪些内容呢,我们来一探究竟。 ...

October 5, 2024