浅谈vue项目打包优化策略


Posted in Javascript onSeptember 29, 2018

使用vue-cli部署生产包时,发现资源包很大,打包后的vendor.js达到了1.4M,这已经很大了,而且会影响到首屏加载。那么,怎么优化呢?

1.组件按需加载

这是首先可以优化的点。如果频繁使用了第三方组件/UI库,如我的项目中经常同时使用了 element-ui, mint-ui,echarts等组件库,如果全部引入,项目体积非常大,这时可以按需引入组件。

示例如下:

1.1 element-ui

首先,安装 babel-plugin-component:

npm install babel-plugin-component -D

然后,将.babelrc 修改为:

{
 "presets": [["es2015", { "modules": false }]],
 "plugins": [
  [
   "component",
   {
    "libraryName": "element-ui",
    "styleLibraryName": "theme-chalk"
   }
  ]
 ]
}

然后引入部分组件,这样一来,就不需要引入样式了,插件会帮我们处理。

// main.js
import Vue from 'vue'
import { Dialog, Loading } from 'element-ui'

Vue.use(Dialog)
Vue.use(Loading.directive)
Vue.prototype.$loading = Loading.service
// 然后正常使用组件

1.2 mint-ui

由于mint-ui是element-ui的移动端组件,所以它的使用和引入几乎和element-ui一样。

首先,安装 babel-plugin-component:

npm install babel-plugin-component -D

然后,将.babelrc 修改为:

{
 "presets": [
  ["es2015", { "modules": false }]
 ],
 "plugins": [["component", [
  {
   "libraryName": "mint-ui",
   "style": true
  }
 ]]]
}

然后引入部分组件

// main.js
import Vue from 'vue'
import { Toast, MessageBox } from 'element-ui'

Vue.use(Dialog)
Vue.use(Loading.directive)
Vue.prototype.$loading = Loading.service
// 然后正常使用组件

注意,element-ui和mint-ui不能同时在.babelrc中进行插件设置,这种情况下,依然可以按需引入,但是不要在.babelrc中配置,在引入的地方同时引入css即可。

1.3 echarts

首先安装babel-plugin-equire

npm i babel-plugin-equire -D

然后,在.babelrc文件中添加该插件

{
 "plugins": [
    // other plugins
    ...
    
  "equire"
 ]
}

创建一个js文件

// echarts.js
// eslint-disable-next-line
const echarts = equire([
 'tooltip',
 'candlestick',
 'bar',
 'line',
 'axisPointer',
 'legend',
 'grid'
])
export default echarts

// 业务组件,引入echarts
import echarts from '@/assets/lib/echarts'
// 使用与以前一样

按需加载echarts

解决vue-cli首屏加载慢的问题

2.路由懒加载

这里需要一个插件

vue-router官方推荐syntax-dynamic-import插件,不过它要求同时安装@bable/core^7.0.0,如果你安装了babel-core6,是会有版本冲突的。我的做法如下

npm install babel-plugin-syntax-dynamic-import --save-dev(^6.18.0)
// router.js
const login = () => import('@/components/login')
const router = new VueRouter({
 routes: [
  { path: '/login', component: login }
 ]
})

还有一种魔法注释用法

有时候我们想把某个路由下的所有组件都打包在同个异步块 (chunk) 中。只需要使用 命名 chunk,一个特殊的注释语法来提供 chunk name (需要 Webpack > 2.4)。

const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')

3.异步组件

如果组件在页面加载时不需要,只在调用时用到,这时可以使用异步组件的写法。仅仅是引入和组件注册写法不同

// template
<test v-if="showTest"></test>

// script
 components: {
  test: () => import('./test') // 将组件异步引入,告诉webpack,将该部分代码分割打包
 },
 methods:{
   clickTest () {
     this.showTest = !this.showTest
  }
 }

4.图片的压缩合并

无损压缩图片:https://3water.com/softs/605425.html

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

5.CDN加速

在index.html中引入cdn资源

...
<body>

<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>
</body>
...

修改 build/webpack.base.conf.js

module.exports = {
context: path.resolve(__dirname, '../'),
entry: {

app: './src/main.js'
},
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)

6.压缩代码

vue-cli已经使用UglifyJsPlugin 插件来压缩代码,可以设置成如下配置:

new webpack.optimize.UglifyJsPlugin({
 compress: {
  warnings: false,
  drop_console: true,
  pure_funcs: ['console.log']
 },
 sourceMap: false
})

其中sourceMap: false是禁用除错功能。

如果设为true,在部署包中会生成.map结尾的js文件。它用于在代码混淆压缩的情况下仍可进行调试。这个功能虽好,但会大大增加整体资源包的体积,所以将其禁用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript得到XML某节点的子节点个数的脚本
Oct 11 Javascript
基于jQuery实现点击同时更改两个iframe的网址
Jul 01 Javascript
自写的一个jQuery圆角插件
Oct 26 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
Oct 30 Javascript
javascript函数特点实例分析
May 14 Javascript
判断是否存在子节点的实现代码
May 18 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
Jan 12 Javascript
JS中SetTimeout和SetInterval使用初探
Mar 23 Javascript
vue2.0 实现页面导航提示引导的方法
Mar 13 Javascript
JS实现的点击按钮图片上下滚动效果示例
Jan 28 Javascript
React实现类似淘宝tab居中切换效果的示例代码
Jun 02 Javascript
Vue与React的区别和优势对比
Dec 18 Vue.js
vue里input根据value改变背景色的实例
Sep 29 #Javascript
4个顶级开源JavaScript图表库
Sep 29 #Javascript
脚手架vue-cli工程webpack的基本用法详解
Sep 29 #Javascript
vue实现条件判断动态绑定样式的方法
Sep 29 #Javascript
vue根据值给予不同class的实例
Sep 29 #Javascript
vue实现重置表单信息为空的方法
Sep 29 #Javascript
Vue中的Props(不可变状态)
Sep 29 #Javascript
You might like
PHP保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
php-fpm服务启动脚本的方法
2018/04/27 PHP
laravel入门知识点整理
2020/09/15 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
javascript oop开发滑动(slide)菜单控件
2010/08/25 Javascript
js中document.getElementByid、document.all和document.layers区分介绍
2011/12/08 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
一个简单的jQuery计算器实现了连续计算功能
2014/07/21 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
Augularjs-起步详解
2016/07/08 Javascript
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
python paramiko模块学习分享
2017/08/23 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
python能在浏览器能运行吗
2020/06/17 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
幼师自我鉴定
2014/02/01 职场文书
大学军训感言1000字
2014/02/25 职场文书
人民的好儿女观后感
2015/06/18 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS
详解nginx进程锁的实现
2021/06/14 Servers