浅谈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 相关文章推荐
jQuery获取浏览器中的分辨率实现代码
Apr 23 Javascript
关于ExtJS4.1:快捷键支持的问题
Apr 24 Javascript
jquery特效 幻灯片效果示例代码
Jul 16 Javascript
JS实现的一个简单的Autocomplete自动完成例子
Apr 16 Javascript
JS实现简单路由器功能的方法
May 27 Javascript
javascript判断网页是关闭还是刷新
Sep 12 Javascript
javascript实现C语言经典程序题
Nov 29 Javascript
解读Bootstrap v4 sass设计
May 29 Javascript
BootStrap注意事项小结(五)表单
Mar 10 Javascript
node使用Koa2搭建web项目的方法
Oct 17 Javascript
Vue.js实现开发购物车功能的方法详解
Feb 22 Javascript
JavaScript中的this基本问题实例小结
Mar 09 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
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
php使用PDO方法详解
2014/12/27 PHP
PHP Opcache安装和配置方法介绍
2015/05/28 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
namespace.js Javascript的命名空间库
2011/10/11 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
浅析JSONP技术原理及实现
2016/06/08 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
浅谈手写node可读流之流动模式
2018/06/01 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
vue引用外部JS的两种种方法
2020/01/28 Javascript
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
linux面试题参考答案(10)
2016/10/26 面试题
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
高中生自我评价个人范文
2013/11/09 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
狼和鹿教学反思
2014/02/05 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
法人代表资格证明书
2015/06/18 职场文书
《雷雨》教学反思
2016/02/20 职场文书
2019银行竞聘书
2019/06/21 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python