vlambda博客
学习文章列表

1M带宽的机器对Vue代码的优化(第一次群发)

使用Vue + Ant Design Vue + Vue Router + Vuex + Axios 构建前端代码,部署完之后发现"chunk-vendors.xxxx.js"有将近1.8MB,我的服务器只有1M的带宽,所以导致整个网站打开很慢。这个js文件包含了vue等所有依赖的库的js代码,所以想要优化网站加载速度,就要想办法减小整个包的体积。

下面是一些减小包体积的方法,大家如果有更多减小包体积的方法,欢迎留言。

1.配置Gzip压缩

Gzip是GNU zip的缩写。它将浏览器请求的文件先在服务器端进行压缩,然后传递给浏览器,浏览器解压之后再进行页面的解析工作。在服务端开启Gzip支持后,前端需要提供资源压缩包.gz。
本文前端通过vue提供gzip文件,后端通过nginx开启gzip技术。这一步直接就减少了2/3以上的体积。

Vue端

第一步需要vue端对js, css之类的文件进行压缩, 生成Gzip文件。
首先安装插件.这里通过Compression-Webpack-Plugin插件进行压缩


npm i --save-dev compression-webpack-plugin


在vue.config.js 中配置


const CompressionWebpackPlugin = require('compression-webpack-plugin');const productionGzipExtensions = ['js', 'css'];const isProduction = process.env.NODE_ENV === 'production';
.....module.exports = {.... // 配置webpack configureWebpack: config => { if (isProduction) { // 开启gzip压缩 config.plugins.push(new CompressionWebpackPlugin({ algorithm: 'gzip', test: /\.js$|\.html$|\.json$|\.css/, threshold: 10240, minRatio: 0.8 })) } }}


这个时候build vue项目的时候,可以看到已经进行了压缩:


> npm run build...File Size Gzipped
dist/js/chunk-vendors.9443e771.js 1878.69 KiB 571.03 KiB dist/js/chunk-36ffe4aa.e846a76a.js 26.75 KiB 9.49 KiB dist/js/index.7c179d17.js 23.60 KiB 6.60 KiB dist/js/login.c24768a8.js 16.06 KiB 4.32 KiB dist/js/chunk-55bc5b71.50a41ecc.js 5.18 KiB 2.39 KiB dist/js/chunk-41632074.846f2cdc.js 4.15 KiB 1.74 KiB dist/js/chunk-4fb9b4fb.717f5c17.js 4.04 KiB 1.94 KiB dist/js/chunk-2d0d335d.a0a4a308.js 0.33 KiB 0.26 KiB dist/js/chunk-2d217c7e.20bb524b.js 0.32 KiB 0.25 KiB dist/js/chunk-2d0dd9df.5a7f107b.js 0.32 KiB 0.25 KiB dist/css/chunk-vendors.77555ead.css 451.82 KiB 53.54 KiB dist/css/index.f63c699a.css 0.66 KiB 0.33 KiB dist/css/chunk-41632074.5836bb4d.css 0.47 KiB 0.29 KiB dist/css/login.5a5d0e9d.css 0.31 KiB 0.19 KiB dist/css/chunk-55bc5b71.7f1aafa3.css 0.12 KiB 0.12 KiB dist/css/chunk-4fb9b4fb.8117ee2b.css 0.04 KiB 0.06 KiB


nginx端

我的环境是nginx/1.16.1, centos7.4
首先打开nginx的配置文件/etc/nginx/nginx.conf,在http段增加如下修改:


....http { ....
gzip on; gzip_static on; gzip_buffers 4 16k; gzip_comp_level 5; gzip_types text/plain application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; ....}


重启nginx


systemctl restart nginx


更多配置可以参考nginx官方文档点击这里[1]

2.设置CDN

CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。

使用CDN提速的原理就是把一些比较大的依赖的包通过CDN的方式加载,这样最终打包的js和css文件就会小很多,通过下面的设置可以让生产环境使用CDN加载Vue, Vuex, Axios, vue-router, Ant Design Vue。
首先打开public/index.html,引入需要的js和css文件,这里引入moment.js是因为Ant Design 需要先引入moment.js。


<head> ... <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/antd.min.css"> ...</head>
<body> ... <div id="app"></div>
<script ></script> <script ></script> <script ></script> <script ></script> <script ></script> <script ></script>

<!-- built files will be auto injected --></body>


接着在vue.config.js里配置config.externals:


module.exports = { ... //分离js,利用cdn加载 config.externals = { 'vue': 'Vue', 'vue-router': 'VueRouter', 'moment': 'moment', 'axios':'axios', 'vuex':'Vuex', 'ant-design-vue':'Antd' }; ...}


编译生成环境:


npm run build...File Size Gzipped
dist/js/chunk-2628a9c1.d6a94a7d.js 78.59 KiB 27.78 KiB dist/js/chunk-vendors.d2a55bb5.js 45.28 KiB 15.78 KiB dist/js/index.c0e5f657.js 12.63 KiB 4.38 KiB dist/js/chunk-176bfdc3.3cc0734e.js 4.48 KiB 2.07 KiB dist/js/login.a24b3c1e.js 4.34 KiB 1.77 KiB dist/css/chunk-vendors.77555ead.css 451.82 KiB 53.54 KiB dist/css/chunk-2628a9c1.2ce98721.css 38.22 KiB 9.71 KiB dist/css/index.a813fd12.css 0.97 KiB 0.43 KiB dist/css/login.0b4c464d.css 0.33 KiB 0.20 KiB dist/css/chunk-176bfdc3.8117ee2b.css 0.04 KiB 0.06 KiB...


这个时候可以看到资源文件gzip后的大小已经很小了,这样在1M带宽的情况下,打开页面快了很多。这时候打开浏览器的F12,可能会报下面的错误:

Vue is not defined

这时候我们需要打开main.js,注释掉下面的代码:


// import Vue from 'vue'// import Antd from 'ant-design-vue';// import Vuex from 'vuex'// import axios from 'axios'// import VueRouter from 'vue-router';


因为之前已经配置了config.externals,所以这里可以把这些import都注释掉。
接着npm run build 完后可能还会碰到下面的错误:

Antd is not defined

这时候需要打开main.js,将


Vue.use(Antd);


改为


Vue.use(antd);


这个时候再npm run build 完之后应该就没有错误了,页面加载的很快。

References

[1] 点击这里: http://nginx.org/en/docs/http/ngx_http_gzip_module.html