首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

4-3~8 code-splitting,懒加载,预拉取,预加载

image.png 可以看到,jquery 和 lodash 被分离后,index 和 another 显著变小,而第三方模块基本是很少改变,也就是某个业务模块改变,我们只需要重新上传新业务模块代码...{cacheGroup}.test 控制此缓存组选择哪些模块。省略它将选择所有模块。它可以匹配绝对模块资源路径或块名称。一个 chunk 名匹配,chunk 中所有模块都被选中。...压缩之前) 按需加载 chunk ,并行请求最大数量小于或等于 6 初始页面加载并行请求最大数量将小于或等于 4 4....ps:webpack将在加载父模块后立即添加预拉取提示。 Preload 不同于 prefetch: 一个预加载块开始与父块并行加载。预拉取父块完成加载后启动。...ps: 不正确地使用 webpackPreload 实际上会损害性能,所以使用它小心。

1.5K20
您找到你想要的搜索结果了吗?
是的
没有找到

前端性能优化小结

,有些大有些小,如果我们操作比较频繁或者波及范围较大,那么就要讲究方式和技巧 reflow 和 repaint 就是我们改变页面或者说操作 DOM ,会带来两种后果 reflow 意味着结构改变...所以通常来看 repaint 代价远小于 reflow, 速度也更快 CSS 中可使用 transform 和 opacity 属性更改来实现动画,这两个属性更改不会触发重排与重绘,它们是可以由合成器...DOM ,这里就推荐先遍历完数组,然后一次性 DOM 上操作。...(element); } 函数控制 主要涉及到优化有定时器动画、函数防抖节流、闭包、减少判断层级、减少循环体活动、事件绑定、事件队列等,监听事件控制函数触发间隔(如滚动对页面性能造成影响,如可视区懒加载...通过F12控制台中 Rendering 选项卡可检测页面FPS,LFC页面性能参数等。

12010

18 vue 实例及其双向绑定实现原理

这些钩子函数给了开发者vue生命不同周期阶段执行自己代码机会。大多数情况下业务逻辑都是放在created函数内,若干事件监听移除、资源销毁等放在destroyed函数内。...访问this.text执行是get;调用this.text = 'xx'执行是set。...Vue选项对象中data,只能在实例化前指定;如果运行时想添加被监察变化属性,可以使用this.$set方法。 v-model属性与{{text}}模板中是如何被解析?...nodeType为1,看看没有v-mode属性,如果有,把它删除;删除之前,对node添加一个input事件监听,输入文本有变化时,调用vmset。在这里是vm.text。...nodeType为3,这是一个模板变量,在这里就是{{text}}。这也是一个node对象。通过正则匹配出变量名称,并注册变量监听器,变量变化时更新这个nodenodeValue。

56220

JavaScript 高级程序设计(第 4 版)- DOM

每个节点都有 nodeType 属性,表示该节点类型 节点类型由定义 Node 类型 12 个数值常量表示 Node.ELEMENT_NODE(1) Node.ATTRIBUTE_NODE(2...,则该节点会从文档树中移除,不会再被浏览器渲染 可以通过 appendChild()或 insertBefore()方法将文档片段内容添加到文档 把文档片段作为参数传给这些方法,文档片段所有子节点会被添加到文档中相应位置...提前终止执行回调,可以调用 disconnect()方法。同步调用disconnect()之后,不仅会停止此后变化事件回调,也会抛弃已经加入任务队列异步执行回调。... Document使用 querySelector()方法,会从文档元素开始搜索;Element使用querySelector()方法,则只会从当前元素后代中查询。...可以Document、DocumentFragment和Element类型使用。 # matches() 接收一个CSS选择符参数,如果元素匹配则该选择符返回true,否则返回false。

1.1K30

Chrome 浏览器垃圾回收机制与内存泄漏分析

新加入对象都会存放到对象区域,对象区域快被写满,就需要执行一次垃圾清理操作。...使用增量标记算法,可以把一个完整垃圾回收任务拆分为很多小任务,这些小任务执行时间比较短,可以穿插在其他 JavaScript 任务中间执行,这样执行上述动画效果,就不会让用户因为垃圾回收任务而感受到页面的卡顿了...但是这个Node节点被删除后,这里逻辑其实都不需要了,可是这样写,却导致了计时器里面的回调函数无法被回收,同时,someData里数据也是无法被回收。 5.... Agent keepAlive 为 true 时候,将会复用之前使用过 socket,如果在 socket 添加事件监听,忘记清除的话,因为 socket 复用,将导致事件重复监听从而产生内存泄漏...Weakmap 保存这个键值对,也会自动消失。 基本,如果你往对象添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。

3K11

Vue.js 双向数据绑定基本实现认知

Vue.js 早期版本中,一个对象被用作数据模型,Vue 会遍历它所有属性,并使用 Object.defineProperty() 将它们转化为getter/setter,以便在数据变化时能够立即感知到...视图需要读取数据模型,getter方法会被调用;视图需要更新数据模型,setter方法会被调用,并且可以在这里触发视图更新。...Publisher-Subscriber Pattern) 发布者-订阅者模式是一种软件设计模式,它允许一个或多个发布者(Publisher)发布事件,而零个或多个订阅者(Subscriber)会监听这些事件,并在事件发生执行相应操作...它接收一个选项对象,其中包含挂载元素选择器和双向绑定数据对象。...动态属性和删除属性: Object.defineProperty:在对象创建后,无法动态添加或删除拦截属性。 Proxy:可以动态添加和删除属性,并在拦截器中处理相应操作。

13220

前端工程化之Webpack优化

3 个方面Cache 选项 默认开启使用缓存能够极大程度上提升再次构建工作效率Parallel 选项 默认开启并发选项大多数情况下能够提升该插件工作效率适用大项目terserOptions 选项...即 Terser 工具中 minify 选项集合主要看其中compress和mangle选项compress 参数作用 执行特定压缩策略例如省略变量赋值语句,从而将变量值直接替换到引入变量位置...,减小代码体积在需要对压缩阶段效率进行优化情况下,可以优先选择设置该参数mangle 参数作用 对源代码中变量与函数名称进行压缩compress参数为 false ,压缩阶段效率有明显提升...「初次构建」压缩代码过程中,就将这一阶段结果写入了缓存目录(node_modules/.cache/插件名/)中有缓存。「再次构建」进行到压缩代码阶段,即可对比读取已有缓存。...在这种情况下,「默认项目构建缓存目录(node_mo dules/.cache)将无法留存」。

1K72

如何编写自己虚拟DOM

构建自己虚拟DOM,需要知道两件事。你甚至不需要深入 React 源代码或者深入任何其他虚拟DOM实现源代码,因为它们是如此庞大和复杂——但实际,虚拟DOM主要部分只需不到50行代码。...有两个概念: Virtual DOM 是真实DOM映射 虚拟 DOM 树中某些节点改变,会得到一个新虚拟树。...是的,这就像递归一样,所以我们可以为每个元素子元素调用 createElement(…),然后使用 appendChild() 添加到我们元素中: function createElement(node...需要处理下面的情况: 添加新节点,使用 appendChild(…) 方法添加节点 移除老节点,使用 removeChild(…) 方法移除老节点 节点替换,使用 replaceChild(…) 方法...节点是 DOM 元素我们才需要比较( 文本节点没有子节点 ) 我们需要传递当前节点引用作为父节点 我们应该一个一个比较所有的子节点,即使它是 undefined 也没有关系,我们函数也会正确处理它

93841

前端开发必备之Chrome开发者工具(上篇)

添加、启用和停用 CSS 类 点击 .cls 按钮可以查看与当前选定元素关联所有 CSS 类。 从这里,您可以执行以下操作: 启用或停用当前与元素关联类 向元素添加新类 ?...添加或移除动态样式(伪类) 您可以元素上手动设置动态伪类选择器(例如 :active、:focus、:hover 和 :visited) 可以通过两种方式元素设置动态状态: Elements...由于每一条消息时间戳均不同,因此,每一条消息都将显示各自 ? 选择执行环境 以下屏幕截图中以蓝色突出显示下拉菜单称为 Execution Context Selector ?...XHR断点 XHR请求URL包含指定字符串,如果中断,使用XHR断点 设置XHR断点: 点击 Sources 选项卡。 展开 XHR Breakpoints 窗格。 点击添加断点。...事件监听器断点 想要暂停事件侦听器代码,使用事件侦听器断点 设置事件监听器断点: 点击 Sources 选项卡。 展开 “Event Listener Breakpoints” 窗格。

8.2K111

从0到1实现一个虚拟DOM

构建自己虚拟 DOM,需要知道两件事。...有两个概念: Virtual DOM 是真实 DOM 映射 虚拟 DOM 树中某些节点改变,会得到一个新虚拟树。...是的,这就像递归一样,所以我们可以为每个元素子元素调用 createElement(…),然后使用 appendChild() 添加到我们元素中: function createElement(node...需要处理下面的情况: 添加新节点,使用 appendChild(…) 方法添加节点 移除老节点,使用 removeChild(…) 方法移除老节点 节点替换,使用 replaceChild(…)...节点是 DOM 元素我们才需要比较( 文本节点没有子节点 ) 我们需要传递当前节点引用作为父节点 我们应该一个一个比较所有的子节点,即使它是 undefined 也没有关系,我们函数也会正确处理它

61620

JavaScript 是如何工作: Shadow DOM 内部结构+如何编写独立组件!

可以 customElement Api 能定义一个自定义元素,并且告知 HTML 解析器如何正确地构造一个元素,以及该元素属性变化时执行相应处理。...(templateContent.cloneNode(true)); } }); 这里需要注意关键点是,我们向影子根添加了模板内容克隆,影子根是使用 Node.cloneNode() 方法创建...内部使用 CSS 选择本地应用于组件实际,这意味着我们可以再次使用公共vid/类名,而不用担心页面上其他地方冲突,最佳做法是 Shadow DOM 内使用更简单 CSS 选择器,它们性能上也不错...此外,访问 slot 中元素,可以调用 assignedNodes() 来查看元素分配给哪个组件 slot。 事件模型 值得注意是,发生在 Shadow DOM 中事件冒泡,会发生什么。...如果希望分派自定义事件并使其传播,则需要添加 bubbles: true 和 composed: true 选项

1.7K30

dom-to-image库是如何将html转换成图片

就是我们转换成图片DOM节点,首先调用了getWindow方法获取window对象: function getWindow(node) { const ownerDocument = node...克隆节点 接下来执行了cloneNode方法: cloneNode(clonee, options, null, ownerWindow) // 参数:需要克隆节点、选项、父节点样式、所属window...不过使用这两个值都需要服务端返回Access-Control-Allow-Credentials响应头,否则肯定无法跨域使用。...styleElement.appendChild(formatPseudoElementStyle()); // 将样式标签添加到克隆节点内 clone.appendChild...到这里,节点克隆部分就结束了,不得不说,还是有点复杂,很多操作其实我们也没有看懂为什么这么做,开发一个库就是这样,处理很多边界和异常情况,这个只有遇到了才知道为什么。

82910

从0到1实现一个虚拟DOM

有两个概念: Virtual DOM 是真实 DOM 映射 虚拟 DOM 树中某些节点改变,会得到一个新虚拟树。...是的,这就像递归一样,所以我们可以为每个元素子元素调用 createElement(…),然后使用 appendChild() 添加到我们元素中: function createElement(node...需要处理下面的情况: 添加新节点,使用 appendChild(…) 方法添加节点 移除老节点,使用 removeChild(…) 方法移除老节点 节点替换,使用 replaceChild(…)...节点是 DOM 元素我们才需要比较( 文本节点没有子节点 ) 我们需要传递当前节点引用作为父节点 我们应该一个一个比较所有的子节点,即使它是 undefined 也没有关系,我们函数也会正确处理它...“Reload”按钮应用更改。

56940

通过编写简易虚拟DOM,来学习虚拟DOM 知识!

构建自己虚拟DOM,需要知道两件事。你甚至不需要深入 React 源代码或者深入任何其他虚拟DOM实现源代码,因为它们是如此庞大和复杂——但实际,虚拟DOM主要部分只需不到50行代码。...有两个概念: Virtual DOM 是真实DOM映射 虚拟 DOM 树中某些节点改变,会得到一个新虚拟树。...是的,这就像递归一样,所以我们可以为每个元素子元素调用 createElement(…),然后使用 appendChild() 添加到我们元素中: function createElement(node...需要处理下面的情况: 添加新节点,使用 appendChild(…) 方法添加节点 移除老节点,使用 removeChild(…) 方法移除老节点 节点替换,使用 replaceChild(…)...节点是 DOM 元素我们才需要比较( 文本节点没有子节点 ) 我们需要传递当前节点引用作为父节点 我们应该一个一个比较所有的子节点,即使它是 undefined 也没有关系,我们函数也会正确处理它

1.5K30

浏览器原理学习笔记05—浏览器中页面渲染

("mian_div").appendChild(new_node) // 由于获取最新 offsetHeight 所以需要立即执行布局操作 console.log(main_div.offsetHeight...").appendChild(new_node) } 避免布局抖动 布局抖动是指在一次 JavaScript 执行过程中,多次执行强制布局和抖动操作,应该尽量避免修改 DOM 结构再查询一些相关值...").appendChild(new_node) } } [xcv2olx34z.png] 合理利用 CSS 合成动画 合成动画在合成线程执行,不影响主线程,还可以使用 will-change...Service Worker Web Worker 基础增加储存功能,解决了 Web Worker 每次执行完脚本后退出不保存结果而导致重复执行问题。...将模板添加到影子 DOM shadowDOM.appendChild(content.cloneNode(true)) } }

1.5K199

JavaScript 异步编程指南 — Give me a Promise

Promise A+ 规范中有一些专业术语,先了解下: fulfill:Promise 成功一个结果,表示解决,很多 Promise 实现中会使用 resolve 代替,这是一个意思,通常在...for 循环执行传入多个 Promise 实例,所有结果都成功之后返回结果,执行过程中一旦其中某个 Promise 实例发生 reject 就会触发 Promise.all() catch()...Promise 链式调用中,任意时刻都只有一个任务执行,下一个任务要等待这个任务完成之后才能执行,如果现在我有两个或以上任务,之间没有顺序依赖关系,希望它们能够并行执行,这样可以提高效率,此时就可以选择...好比短跑比赛,我只想知道第一是谁,第一个人跨越终点线之后,我目的就达到了。还是基于上面的示例,只要有一个图片加载完成就直接添加到页面。...我们也无法从外部取消。如果 then 后面还有业务需要处理,也将会一直等待下去,当我们自己去包装一个 Promise 对象要尽可能避免这种情况发生。

1.2K10
领券