vue 项目优化总结

1、配置 webpack-bundle-analyzer 插件

2、分析

2.1、路由懒加载

把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件。

import Login from '@/components/login/index'

{ path: 'login', name: 'Login', component: Login }

修改为

{ path: '/login', component: () => import('@/components/login/index')}

以函数的形式动态引入,这样就可以把各自的路由文件分别打包,只有在解析给定的路由时,才会下载路由组件

vue cli 3 默认情况下,一个 Vue CLI 应用会为所有作为 async chunk 生成的 JavaScript 文件 (通过动态 import() 按需 code splitting 的产物) 自动生成 prefetch 提示。
引入路由懒加载也会一次全部加载,所以我们需要关闭prefetch

官方文档例子如下,我再项目中配置不起作用。

// vue.config.js
module.exports = {
  chainWebpack: config => {
    // 移除 prefetch 插件
    config.plugins.delete('prefetch')

    // 或者
    // 修改它的选项:
    config.plugin('prefetch').tap(options => {
      options[0].fileBlacklist = options[0].fileBlacklist || []
      options[0].fileBlacklist.push(/myasyncRoute(.)+?\.js$/)
      return options
    })
  }
}

打印chainWebpack,发现用的是prefetch-index,项目应用如下,完美解决!

chainWebpack: (config) => {
        // console.log(config,'chainWebpack')
        config.plugins.delete('prefetch-index');
        //    'html-index' => [Object],
        //   'preload-index' => [Object],
        //   'prefetch-index' => [Object],
        // config.plugins.delete('preload-index'); 
    },

如果想提前加载那个界面可以配置

component: () => import(/* webpackChunkName: "setting",webpackPrefetch: true */'../component/login/setting')
2.2 优化moment.js
2.2.1方法1

默认多语言都会加载,选择需要的语言进行加载。
vue.confgi.js

configureWebpack: config => {
        //忽略/moment/locale下的所有文件
        config.plugins.push(new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/));
}
//设定moment区域为中国
import 'moment/locale/zh-cn';
2.2.1方法2

moment 也被替换为了date-fns

2.2productionSourceMap 配置

Type: boolean

Default: true

如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。

看打包文件会多一个.map 文件,map文件的作用在于:项目打包后,代码都是经过压缩加密的,如果运行时报错,输出的错误信息无法准确得知是哪里的代码报错。有了map就可以像未加密的代码一样,准确的输出是哪一行哪一列有错。

image.png

2.3Echarts 打包文件过大

2.3.1方法1按需要引入

创建一个echarts.js文件

import echarts from 'echarts/lib/echarts'

import 'echarts/lib/chart/radar'
import 'echarts/lib/chart/bar'
import 'echarts/lib/chart/line'
import 'echarts/lib/chart/pie'
import 'echarts/lib/chart/funnel'
import 'echarts/lib/chart/scatter'
import 'echarts/lib/component/title'
import 'echarts/lib/component/legend'
import 'echarts/lib/component/tooltip'
import 'echarts/lib/component/axisPointer'
import 'echarts/lib/component/visualMap'
import 'echarts/lib/component/markLine'
import 'echarts/lib/component/markPoint'
import 'echarts/lib/component/markArea'
import 'echarts/lib/component/geo'

export default echarts

然后再到需要引用echarts的页面写上如下代码 进行引入

import echarts from '../echarts';
4.使用CDN加载
  • 在index.html中引入cdn资源
<div id="app">
</div>
<!-- built files will be auto injected -->
<script src="https://cdn.bootcss.com/vue/2.5.2/vue.min.js"></script>
<script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>
<script src="https://cdn.bootcss.com/vuex/3.0.1/vuex.min.js"></script>
<script src="https://cdn.bootcss.com/vue-resource/1.5.1/vue-resource.min.js"></script>
  • 在vue.config.js配置
 config.externals = {
            'vue': 'Vue',
            'vue-router': 'VueRouter',
            'vuex':'Vuex',
            'vue-resource': 'VueResource'
 }
  • 修改src/main.js src/router/index.js 注释掉import引入的vue,vue-resource
// import Vue from 'vue'
// import VueResource from 'vue-resource'
// Vue.use(VueResource)
  • 使用 webpack-cdn-plugin 插件

过去我们外部引入 CDN 需要手动编写 index.html 模板,在里面指定加载的版本,通过这个插件就能自动的把指定的公共库写入到 index.html 模板里,目前的文档有坑,我已经提了PR

需要注意的是,通过CDN引入,在使用 VueRouter Vuex ElmentUI 的时候要改下写法。CDN会它们挂载到window上,因此不再使用 Vue.use(xxx)

import Vue from 'vue'
import VueRouter from 'vue-router'

if (!window.VueRouter) Vue.use(VueRouter)

通过webpack-chunk-name 合并一些包

5.图片的压缩合并

无损压缩图片:https://tinypng.com/

如有可能,将图片制作成精灵图

6.引入按需加载插件,babel-plugin-component、babel-plugin-equire,做项目优化
7.gzip

拆完包之后,我们再用gzip做一下压缩
安装compression-webpack-plugin

const CompressionPlugin = require('compression-webpack-plugin')
// 要压缩的文件
const productionGzipExtensions = ['js', 'css'];

config.plugins.push(
                new CompressionWebpackPlugin({
                    algorithm: 'gzip',
                    //test: /\.js$|\.html$|\.json$|\.css/,
                    test: new RegExp(`\\.(${productionGzipExtensions.join('|')})$`),
                    threshold: 10240,// 只有大小大于该值的资源会被处理
                    minRatio: 0.8, // 只有压缩率小于这个值的资源才会被处理
                    filename: '[path].gz[query]',
                    deleteOriginalAssets: false // 删除原文件
                })
 );

可以看到200k以上的文件被压缩到了100k以内


image.png

在服务器我们也要做相应的配置
如果发送请求的浏览器支持gzip,就发送给它gzip格式的文件
服务器是用express框架搭建的
只要安装一下compression就能使用

const compression = require('compression')
app.use(compression())

注意,后面这一句,要放在所有其他中间件注册之前

8.CSS分离
9.图片压缩

vue正常打包之后一些图片文件很大,使打包体积很大,通过image-webpack-loader插件可将大的图片进行压缩从而缩小打包体积

(1) 先安装依赖:cnpm install image-webpack-loader --save-dev
(2) 在vue.config.jsmodule.exports写入:

module.exports = {
    productionSourceMap: false,
    chainWebpack: config => {
     
        config.module
            .rule('images')
            .use('image-webpack-loader')
            .loader('image-webpack-loader')
            .options({ bypassOnDebug: true })
            .end()
      
    }
}
10.UglifyJsPlugin 压缩

通过UglifyJSPlugin可以压缩我们的*.js文件。
1)安装uglifyjs-webpack-plugin

npm i -D uglifyjs-webpack-plugin

2.vue.config.js 添加 configureWebpack 生产环境

config.plugins.push(
                new UglifyJsPlugin({
                    uglifyOptions: {
                        compress: {
                            drop_debugger: true, // 注释debugger
                            drop_console: true, // 注释console
                            pure_funcs: ['console.log'] // 移除console
                        },
                        warnings: false,
                    },
                    sourceMap: false,
                    parallel: true,//使用多进程并行运行来提高构建速度。默认并发运行数:os.cpus().length - 1。
                })
            );
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,287评论 4 31
  • 主要分为三个方面来优化 Vue 代码层面的优化 webpack 配置层面的优化 基础的 Web 技术层面的优化 一...
    alanwhy阅读 791评论 0 10
  • vue-cli3项目搭建配置以及性能优化 在之前的开发中主要用的是vue-cli2,最近空闲时间比较多,接下来有新...
    bayi_lzp阅读 19,483评论 16 68
  • 这里写自定义目录标题 分析工具Coverage:查看代码的使用状况移除死代码懒加载代码webpack-bundle...
    world_7735阅读 1,745评论 0 14
  • 响应式布局的理解 响应式开发目的是一套代码可以在多种终端运行,适应不同屏幕的大小,其原理是运用媒体查询,在不同屏幕...
    懒猫_6500阅读 787评论 0 0