我有一个项目用了 vue.js 来构建单页应用程序。随着上线日期的临近,性能优化的工作变得越来越重要。在本文中,我收集了有关在加载时间和渲染性能方面提高 Vue.js 应用性能的所有知识。
使用 Vue.js,你可以快速构建单页应用。 webpack 会为你将所有内容捆绑到文件(html、JavaScript、css)中,最后可以用 nginx 来提供。至少,这是我们的设置。但是 Webpack 会警告你某些资源太大。
需要注意的是,一旦用户访问 SPA,这三个文件将会被加载,并且只有在加载完毕之后才会渲染页面。但是最初加载的页面一般不需要太多文件内容,并且不应拖慢用户访问我们的网站的速度。
以下介绍了有关如何缓解此类问题的几种方法,以及在响应性和性能方面进一步改进 Vue.js 应用的其他方法。
功能组件是不包含任何状态和实例的组件。将无状态 Vue 组件转换为功能组件可以大大提高渲染性能。
只需在顶层 template 标记中添加 functional 关键字即可:
<template functional> <div>...</div> </template>
要像以前一样访问 prop 和数据,你必须进行一些小的调整。
<template functional>
<div>{{ props.someProp }}</div>
</template>
<script>
export default {
props: {
someProp: String
}
}
</script>
如果你使用 i18n 进行国际化,则必须在 parent 之前加上 $t:
{{ parent.$t('app.not-found.message') }}
使用功能组件,我们无权使用方法或计算的 prop。但是,我们仍然可以使用 $options 访问方法。
<template functional>
<div>
{{ $options.username(props.user) }}
</div>
</template>
<script>
export default {
props: {
user: User,
},
username(user: User): string {
return user.name;
}
}
</script>
延迟加载组件可以节省大量的初始下载时间。调用 import() 函数时,将会下载所有延迟加载的资源。对于 Vue 组件,仅在请求渲染时才发生。对话框是注定会这样的。通常仅在用户交互后才显示它们。
<template>
<div>
...
<app-modal-dialog v-if="showDialog" />
</div>
</template>
<script>
export default {
components: {
ModalDialog: () => import('./ModalDialog.vue')
}
}
</script>
Webpack 将为 ModalDialog 组件创建一个单独的块,该块不会在页面加载时立即下载,而是仅在需要时才下载。
注意不要延迟加载应自动显示的组件。例如以下内容(无提示)将无法加载模式对话框。
mounted() {
this.$bvModal.show('password-check');
},
原因是已安装的 hook 是在延迟加载模态组件之前进行评估的。
构建 SPA 时,JavaScript 捆绑包可能会变得很大,从而增加页面加载时间。如果我们可以将每个路由的组成部分拆分为一个单独的块,然后仅在访问路由时才加载它们,则效率会更高。
import ProjectList from '@/components/ProjectList.vue';
export const routes = [
{
path: '/projects',
name: 'projects',
component: ProjectList,
},
]
定义一个异步组件非常容易,该组件将由 Webpack 自动进行代码拆分。只需更改导入语句:
const ProjectList = () => import('@/components/ProjectList.vue');
除此之外,无需更改路由配置。通过以下方式在生产模式下构建你的应用:
"build": "vue-cli-service build --mode production"
并确认会生成很多块
你还可以通过在浏览器中打开开发者控制台来验证此功能是否正常。在 Network 标签中,一旦你访问新路由,就会异步加载多个 JavaScript 文件。在开发模式下,每个块都将被赋予一个自动递增的数字。在生产模式下,将使用自动计算的哈希值代替。
Vue 有一个很酷的功能就是 Vue 自动添加 Webpack 的魔术注释,以便进一步自动预取其他块(请参阅预取缓存一节) 。但是,预取仅在浏览器完成初始加载并变为空闲之后才开始。
通常,我们将从后端获取对象列表,例如用户、项目、文章等。默认情况下,Vue 使数组中每个对象的每个第一级属性都具有响应性。对于大量对象而言,这代价可能会很大。有时我们只想显示对象时就不需要去修改它们。
所以在这种情况下,如果我们阻止 Vue 使列表具有响应性,那么就可以获得一些性能。我们可以通过使用列表中的 Object.freeze 来做到这一点,例如使其一直不变。
export async function get(url: string): Promise<User[]> {
const response = await Object.freeze(axios.get<User[]>(url));
return response.data;
}
我们已经讨论了许多改进 Vue SPA 的方法,但是不知道我们实际获得了多少性能。可以通过使用浏览器中开发者工具的 Performance 标签来实现。
为了获得准确的数据,我们必须在 Vue 应用中激活性能模式。让我们在 main.ts 文件中用开发模式激活它
Vue.config.performance = process.env.NODE_ENV !== "production";
这将激活 Vue 内部使用的 User Timing API。
打开浏览器,然后按 F12 键打开开发者控制台。切换到 Performance 选项卡,然后单击 Start Profiling。在 Chrome 中,“ Timings” 行显示重要标记,例如 “First Contentful Paint” 和 “First Meanfulful Paint” 时间。你应该尝试减少它们,以便你的用户可以尽快使用该网站。
在本文中,我们了解了如何对路由和组件使用延迟加载以将 SPA 分成多个块,功能组件如何提高性能以及如何衡量这些改进。
作者:Matthias Sommer
翻译:疯狂的技术宅
原文:https://dzone.com/articles/
在程序开发中,经常会使用到for循环的,但是很多人写的for循环效率都是比较低的,下面就举例说明,并总结优化for循环的方法,来提高我们程序的执行效率。
网站的加载速度不仅影响着用户体验,也会影响搜索引擎的排名,在百度推出“闪电算法”以来,将网站首屏打开速度被列入优化排名行列,作为前端开发的我们需要如果来优化网站的打开速度呢?下面就整理挖掘出很多细节上可以提升性能的东西分享给大家
DocumentFragments是DOM节点。它们不是主DOM树的一部分。通常的用例是创建文档片段,将元素附加到文档片段,然后将文档片段附加到DOM树。在DOM树中,文档片段被其所有的子元素所代替。因为文档片段存在于内存中,并不在DOM树中
对于代码裡面的 if else,我们可以使用逻辑判断式,或更好的三元判断式来优化代码。除了可以降低维护项目的成本之外,还可以提升代码可读性。就让我们从最简单的 if else 例子开始吧。
小程序从发布到现在也已经有将近两年的时间,越来越来多的公司开始重视小程序生态带来的流量,今年也由于小程序平台对外能力的越来越多的开放以及小程序平台的自身优化,越来越多的开发者也自主的投入到小程序的开发当中
无论你正在将 GIF 动图转换为 MP4 视频,还是手头已经有一大堆 MP4 视频,你都可以优化文件结构,以使得这些视频更快地加载和播放。通过重组 atoms 将 moov 放到文件开头,浏览器可以避免发送额外的 HTTP range request 请求来搜寻和定位 moovatom
要优化 Web 服务器的性能,我们先来看看 Web 服务器在 web 页面处理上的步骤:Web 浏览器向一个特定的服务器发出 Web 页面请求; Web 服务器接收到 web 页面请求后,寻找所请求的 web 页面,并将所请求的 Web 页面传送给 Web 浏览器; 显示出来
浏览器下载完页面所有的资源后,就要开始构建DOM树,于此同时还会构建渲染树(Render Tree)。(其实在构建渲染树之前,和DOM树同期会构建Style Tree。DOM树与Style Tree合并为渲染树)
写篇文章的目的,是以开放小程序代码的层面的优化。包括:条件判断将wx:if换成了hidden 、页面跳转请销毁之前使用的资源、列表的局部更新、小程序中多张图片懒加载方案、Input状态下隐藏input,应预留出键盘收起的时间
生活在信息爆炸的今天,我们每天不得不面对和过滤海量的信息--无疑是焦躁和浮动的,这就意味着用户对你站点投入的时间可能是及其吝啬的(当然有一些刚需站点除外)。如何给用户提供迅速的响应就显得十分重要了
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!