浅谈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 相关文章推荐
JS 建立对象的方法
Apr 21 Javascript
JS获取dom 对象 ajax操作 读写cookie函数
Nov 18 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
Apr 16 Javascript
禁止空格提交表单的js代码
Nov 17 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
May 31 Javascript
ES6深入理解之“let”能替代”var“吗?
Jun 28 Javascript
jQuery实现定时隐藏对话框的方法分析
Feb 12 jQuery
Angular4 反向代理Details实践
May 30 Javascript
vue使用ajax获取后台数据进行显示的示例
Aug 09 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
Nov 15 Javascript
layui的面包屑或者表单不显示的解决方法
Sep 05 Javascript
JavaScript实现显示和隐藏图片
Apr 29 Javascript
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
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
比较完整的微信开发php代码
2016/08/02 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
JavaScript URL参数读取改进版
2009/01/16 Javascript
读jQuery之十一 添加事件核心方法
2011/07/31 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
7个JS基础知识总结
2014/03/05 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
浅析javascript的return语句
2015/12/15 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
python中的全局变量用法分析
2015/06/09 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
Python函数式编程实例详解
2020/01/17 Python
python实现滑雪者小游戏
2020/02/22 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
国贸专业个人求职信分享
2013/12/04 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
教师节校长致辞
2015/07/31 职场文书
Redis中一个String类型引发的惨案
2021/07/25 Redis
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android