webpack 配置层面的优化;
根本的 Web 技能层面的优化。
当我们须要进行数值打算,并且依赖于其它数据时,该当利用 computed,由于可以利用 computed 的缓存特性,避免每次获取值时,都要重新打算;

当我们须要在数据变革时实行异步或开销较大的操作时,该当利用 watch,利用 watch 选项许可我们实行异步操作 ( 访问一个 API ),限定我们实行该操作的频率,并在我们得到终极结果前,设置中间状态。这些都是打算属性无法做到的。
1.3、v-for 遍历必须为 item 添加 key,且避免同时利用 v-if(1)v-for 遍历必须为 item 添加 key在列表数据进行遍历渲染时,须要为每一项 item 设置唯一 key 值,方便 Vue.js 内部机制精准找到该条列表数据。当 state 更新时,新的状态值和旧的状态值比拟,较快地定位到 diff 。(2)v-for 遍历避免同时利用 v-ifv-for 比 v-if 优先级高,如果每一次都须要遍历全体数组,将会影响速率,尤其是当之须要渲染很小一部分的时候,必要情形下该当更换成 computed 属性。推举不推举:1.4、长列表性能优化Vue 会通过 Object.defineProperty 对数据进行挟制,来实现视图相应数据的变革,然而有些时候我们的组件便是纯粹的数据展示,不会有任何改变,我们就不须要 Vue 来挟制我们的数据,在大量数据展示的情形下,这能够很明显的减少组件初始化的韶光,那如何禁止 Vue 挟制我们的数据呢?可以通过 Object.freeze 方法来冻结一个工具,一旦被冻结的工具就再也不能被修正了。1.5、事宜的销毁Vue 组件销毁时,会自动清理它与其它实例的连接,解绑它的全部指令及事宜监听器,但是仅限于组件本身的事宜。如果在 js 内利用 addEventListene 等办法是不会自动销毁的,我们须要在组件销毁时手动移除这些事宜的监听,以免造成内存透露,如:1.6、图片资源更快的内容到达韶光(首屏加载更快):SPA 会等待所有 Vue 编译后的 js 文件都下载完成后,才开始进行页面的渲染,文件下载等须要一定的韶光等,以是首屏渲染须要一定的韶光;SSR 直接由做事端渲染好页面直接返回显示,无需等待下载 js 文件及再去渲染等,以是 SSR 有更快的内容到达韶光;
(2)做事端渲染的缺陷:更多的开拓条件限定:例如做事端渲染只支持 beforCreate 和 created 两个钩子函数,这会导致一些外部扩展库须要分外处理,才能在做事端渲染运用程序中运行;并且与可以支配在任何静态文件做事器上的完备静态单页面运用程序 SPA 不同,做事端渲染运用程序,须要处于 Node.js server 运行环境;
更多的做事器负载:在 Node.js 中渲染完全的运用程序,显然会比仅仅供应静态文件的 server 更加大量占用CPU 资源,因此如果你预见在高流量环境下利用,请准备相应的做事器负载,并明智地采取缓存策略。
如果你的项目的 SEO 和 首屏渲染是评价项目的关键指标,那么你的项目就须要做事端渲染来帮助你实现最佳的初始加载性能和 SEO,详细的 Vue SSR 如何实现,可以参考作者的另一篇文章《Vue SSR 踩坑之旅》。如果你的 Vue 项目只需改进少数营销页面(例如/, /about, /contac
t 等)的 SEO,那么你可能须要预渲染,在构建时 (build time) 大略地天生针对特定路由的静态 HTML 文件。优点是设置预渲染更大略,并可以将你的前端作为一个完备静态的站点,详细你可以利用 prerender-spa-plugin 就可以轻松地添加预渲染 。二、Webpack 层面的优化2.1、Webpack 对图片进行压缩在 vue 项目中除了可以在 webpack.base.conf.js
中 url-loader 中设置 limit 大小来对图片处理,对小于 limit 的图片转化为 base64 格式,别的的不做操作。以是对有些较大的图片资源,在要求资源的时候,加载会很慢,我们可以用 image-webpack-loader
来压缩图片:(1)首先,安装 image-webpack-loader :npm install image-webpack-loader --save-dev
(2)然后,在 webpack.base.conf.js 中进行配置:
{
test: /\.(png|jpe?g|gif|svg)(\?.)?$/,
use:[
{
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
loader: 'image-webpack-loader',
options: {
bypassOnDebug: true,
}
}
]}
2.2、减少 ES6 转为 ES5 的冗余代码Babel 插件会在将
ES6
代码转换成 ES5 代码时会注入一些赞助函数,例如下面的 ES6 代码:class HelloWebpack extends Component{...}
这段代码再被转换成能正常运行的 ES5 代码时须要以下两个赞助函数:
babel-runtime/helpers/createClass // 用于实现 class 语法
babel-runtime/helpers/inherits // 用于实现 extends 语法
在默认情形下, Babel 会在每个输出文件中内嵌这些依赖的赞助函数代码,如果多个源代码文件都依赖这些赞助函数,那么这些赞助函数的代码将会涌现很多次,造成代码冗余。为了不让这些赞助函数的代码重复涌现,可以在依赖它们时通过 require('babel-runtime/helpers/createClass')
的办法导入,这样就能做到只让它们涌现一次。babel-plugin-transform-runtime
插件便是用来实现这个浸染的,将干系赞助函数进行更换成导入语句,从而减小 babel 编译出来的代码的文件大小。(1)首先,安装 babel-plugin-transform-runtime
:
npm install babel-plugin-transform-runtime --save-dev
(2)然后,修正 .babelrc 配置文件为:
plugins: [transform-runtime]
如果要看插件的更多详细内容,可以查看babel-plugin-transform-runtime 的 详细先容。2.3、提取公共代码如果项目中没有去将每个页面的第三方库和公共模块提取出来,则项目会存在以下问题:
相同的资源被重复加载,摧残浪费蹂躏用户的流量和做事器的本钱。
每个页面须要加载的资源太大,导致网页首屏加载缓慢,影响用户体验。
以是我们须要将多个页面的公共代码抽离成单独的文件,来优化以上问题 。Webpack 内置了专门用于提取多个Chunk 中的公共部分的插件 CommonsChunkPlugin,我们在项目中 CommonsChunkPlugin 的配置如下:// 所有在 package.json 里面依赖的包,都会被打包进 vendor.js 这个文件中。new webpack.optimize.CommonsChunkPlugin(
{
name: 'vendor',
minChunks: function(module, count) {
return (module.resource &&/\.js$/.test(module.resource) &&module.resource.indexOf( path.join(__dirname, '../node_modules')) === 0
);
}
}),// 抽取出代码模块的映射关系new webpack.optimize.CommonsChunkPlugin({name: 'manifest',chunks: ['vendor']})
如果要看插件的更多详细内容,可以查看 CommonsChunkPlugin 的 详细先容。2.4、模板预编译当利用 DOM 内模板或 JavaScript 内的字符串模板时,模板会在运行时被编译为渲染函数。常日情形下这个过程已经足够快了,但对性能敏感的运用还是最好避免这种用法。预编译模板最大略的办法便是利用单文件组件——干系的构培植置会自动把预编译处理好,以是构建好的代码已经包含了编译出来的渲染函数而不是原始的模板字符串。如果你利用 webpack,并且喜好分离 JavaScript 和模板文件,你可以利用 vue-template-loader,它也可以在构建过程中把模板文件转换成为 JavaScript 渲染函数。2.5、提取组件的 CSS当利用单文件组件时,组件内的 CSS 会以 style 标签的办法通过 JavaScript 动态注入。这有一些小小的运行时开销,如果你利用做事端渲染,这会导致一段 “无样式内容闪烁 (fouc) ” 。将所有组件的 CSS 提取到同一个文件可以避免这个问题,也会让 CSS 更好地进行压缩和缓存。查阅这个构建工具各自的文档来理解更多:
webpack + vue-loader ( vue-cli 的 webpack 模板已经预先配置好)
Browserify + vueify
Rollup + rollup-plugin-vue
2.6、优化 SourceMap我们在项目进行打包后,会将开拓中的多个文件代码打包到一个文件中,并且经由压缩、去掉多余的空格、babel编译化后,终极将编译得到的代码会用于线上环境,那么这样处理后的代码和源代码会有很大的差别,当有 bug的时候,我们只能定位到压缩处理后的代码位置,无法定位到开拓环境中的代码,对付开拓来说不好调式定位问题,因此 sourceMap 涌现了,它便是为理解决不好调式代码问题的。SourceMap 的可选值如下(+ 号越多,代表速率越快,- 号越多,代表速率越慢, o 代表中等速率 )开拓环境推举:cheap-module-eval-source-map生产环境推举:cheap-module-source-map缘故原由如下:cheap:源代码中的列信息是没有任何浸染,因此我们打包后的文件不肯望包含列干系信息,只有行信息能建立打包前后的依赖关系。因此不管是开拓环境或生产环境,我们都希望添加 cheap 的基本类型来忽略打包前后的列信息;
module :不管是开拓环境还是正式环境,我们都希望能定位到bug的源代码详细的位置,比如说某个 Vue 文件报错了,我们希望能定位到详细的 Vue 文件,因此我们也须要 module 配置;
soure-map :source-map 会为每一个打包后的模块天生独立的 soucemap 文件 ,因此我们须要增加source-map 属性;
eval-source-map:eval 打包代码的速率非常快,由于它不天生 map 文件,但是可以对 eval 组合利用 eval-source-map 利用会将 map 文件以 DataURL 的形式存在打包后的 js 文件中。在正式环境中不要利用 eval-source-map, 由于它会增加文件的大小,但是在开拓环境中,可以试用下,由于他们打包的速率很快。
2.7、构建结果输出剖析Webpack 输出的代码可读性非常差而且文件非常大,让我们非常头疼。为了更大略、直不雅观地剖析输出结果,社区中涌现了许多可视化剖析工具。这些工具以图形的办法将结果更直不雅观地展示出来,让我们快速理解问题所在。接下来讲解我们在 Vue 项目中用到的剖析工具:webpack-bundle-analyzer
。我们在项目中 webpack.prod.conf.js
进行配置:if (config.build.bundleAnalyzerReport) {
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
webpackConfig.plugins.push(new BundleAnalyzerPlugin());
}
实行 $ npm run build --report
后天生剖析报告如下:2.8、Vue 项目的编译优化如果你的 Vue 项目利用 Webpack 编译,须要你喝一杯咖啡的韶光,那么大概你须要对项目的 Webpack 配置进行优化,提高 Webpack 的构建效率。详细如何进行 Vue 项目的 Webpack 构建优化,可以参考作者的另一篇文章《
Vue 项目
Webpack 优化实践》三、根本的 Web 技能优化3.1、开启 gzip 压缩gzip 是 GNUzip 的缩写,最早用于 UNIX 系统的文件压缩。HTTP 协议上的 gzip 编码是一种用来改进 web 运用程序性能的技能,web 做事器和客户端(浏览器)必须共同支持 gzip。目前主流的浏览器,Chrome,firefox,IE等都支持该协议。常见的做事器如 Apache,Nginx,IIS 同样支持,gzip 压缩效率非常高,常日可以达到 70% 的压缩率,也便是说,如果你的网页有 30K,压缩之后就变成了 9K 旁边以下我们以做事端利用我们熟习的 express 为例,开启 gzip 非常大略,干系步骤如下:安装:
npm install compression --save
添加代码逻辑:
var compression = require('compression');
var app = express();app.use(compression())
重启做事,不雅观察网络面板里面的 response header,如果看到如下红圈里的字段则表明 gzip 开启成功 :
3.2、浏览器缓存为了提高用户加载页面的速率,对静态资源进行缓存是非常必要的,根据是否须要重新向做事器发起要求来分类,将 HTTP 缓存规则分为两大类(逼迫缓存,比拟缓存),如果对缓存机制还不是理解很清楚的,可以参考作者写的关于 HTTP 缓存的文章《深入理解HTTP缓存机制及事理》,这里不再赘述。3.3、CDN 的利用浏览器从做事器高下载CSS
、js 和图片等文件时都要和做事器连接,而大部分做事器的带宽有限,如果超过限定,网页就半天反应不过来。而 CDN 可以通过不同的域名来加载文件,从而使下载文件的并发连接数大大增加,且CDN 具有更好的可用性,更低的网络延迟和丢包率 。3.4、利用 Chrome Performance 查找性能瓶颈Chrome 的 Performance 面板可以录制一段韶光内的 js 实行细节及时间。利用 Chrome 开拓者工具剖析页面性能的步骤如下。打开 Chrome 开拓者工具,切换到 Performance 面板
点击 Record 开始录制
刷新页面或展开某个节点
点击 Stop 停滞录制
更多关于 Performance 的内容可以点击这里查看。总结本文通过以下三部分组成:Vue
代码层面的优化、webpack 配置层面的优化、根本的 Web 技能层面的优化;来先容怎么去优化 Vue 项目的性能。希望对读完本文的你有帮助、有启示,如果有不敷之处,欢迎批评示正互换!作者:我是你的超级英雄https://juejin.im/post/5d548b83f265da03ab42471d