在vue单页应用中,当项目不断完善丰富时,即使使用webpack打包,文件依然是非常大的,影响页面的加载。如果我们能把不同路由对应的组件分割成不同的代码块,当路由被访问时才加载对应的组件(也就是按需加载),这样就更加高效了。——引自vue-router官方文档

如何实现??

vue异步组件

vue-router配置路由,使用vue的异步组件技术,可以实现懒加载,代码如下:// 每个组件都会生成一个js文件


import Vue from 'vue'
import Router from 'vue-router'
import Login from '../view/List.vue'; Vue.use(Router); export default new Router({
routes: [
{
path: '/home/list',
name: 'list',
components: resolve => require(['../view/List.vue'], resolve)
}
],

动态import(webpack > 2.4)

vue、webpack官方推荐

情况一:每个组件都会打包生成一个js文件



const List = () => import('../view/List.vue')

// 在路由配置中什么都不需要改变,像往常一样使用组件:
export default new Router({
routes: [
{
path: '/home/list',
name: 'login',
components: Login
},
{
path: '/home/user',
name: 'user',
components: User
}
],

情况二:所有组件合并打包在一个异步块chunk中



const List = () => import(/* webpackChunkName: "home" */ './List.vue')
const User = () => import(/* webpackChunkName: "home" */ './User.vue') // 在路由配置中什么都不需要改变,像往常一样使用组件:
export default new Router({
routes: [
{
path: '/home/list',
name: 'list',
components: List
},
{
path: '/home/user',
name: 'user',
components: User
}
], // 在webpack.base.config.js中配置 ChunkFileName:
output: {
path: config.build.assetsRoot,
filename: '[name].js',
chunkFilename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},

另一种写法,更简洁:同样需要在webpack.base.config.js中配置 ChunkFileName:



{
path: '/home/list',
name: 'list',
component: () => import(/* webpackChunkName:"list"*/ '../view/List.vue')
},
{
path: '/home/user',
name: 'user',
component: () => import(/* webpackChunkName:"user"*/ '../view/User.vue')
},

webpack提供的require.ensure()

语法如下:摘自官网


require.ensure(dependencies: String[], callback: function(require), chunkName: String

多个路由指定相同的chunkName,在这里chunkName为home,会合并打包成一个js文件。


{
path: '/home/list',
name: 'list',
// component:list
component: r => require.ensure([], () => r(require('../view/Lst.vue')), 'home')
},
{
path: '/home/user',
name: 'user',
// component:user
component: r => require.ensure([], () => r(require('../view/User.vue')), 'home')
} // 在webpack.base.config.js中配置 ChunkFileName 和 publicPath:
output: {
path: config.build.assetsRoot,
filename: '[name].js',
chunkFilename: '[name].js',
publicPath: './',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},

在实践过程中应该会遇到各种问题,到时候再继续补充,前端新手,多多指教!

来源:https://segmentfault.com/a/1190000017766798

vue-router和webpack懒加载,页面性能优化篇的更多相关文章

  1. js动态加载js文件(js异步加载之性能优化篇)

    1.[基本优化] 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完成页面渲染而不会造成页面堵塞问题,这个大家都懂. 2.[合并JS代码,尽可能少的使 ...

  2. Android ViewPager Fragment使用懒加载提升性能

     Android ViewPager Fragment使用懒加载提升性能 Fragment在如今的Android开发中越来越普遍,但是当ViewPager结合Fragment时候,由于Androi ...

  3. 一步一步实现listview加载的性能优化

    listview加载的核心是其adapter,本文针对listview加载的性能优化就是对adpter的优化,总共分四个层次: 0.最原始的加载 1.利用convertView 2.利用ViewHol ...

  4. vue webpack 懒加载

    自己项目中的写法 const router = new Router({ routes: [ { path: '/index', component: (resolve) => { requir ...

  5. vue 路由懒加载 使用,优化对比

    vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,时间过长,会出啊先长时间的白屏,即使做了loading也是不利于用户体验,而运 ...

  6. Vue实现一个图片懒加载插件(转载)

    Vue是可以自定义指令的,最近学习过程中遇见了一个需要图片懒加载的功能,最后参考了别人的代码和思路自己重新写了一遍.以下将详细介绍如何实现自定义指令v-lazyload. 先看如何使用这个指令: &l ...

  7. Vue Router根据后台数据加载不同的组件(思考->实现->不止于实现)

    实际项目中遇到的需求 同一个链接需要加载不同的页面组件.根据用户所购买服务的不同,有不同的页面展现. 有一些不好的实现方式 直接把这几个组件写在同一个组件下,通过v-if去判断.如果这么做的话,甚至可 ...

  8. vue + vue-lazyload 实现图片懒加载

    1.安装 npm i vue-lazyload -S 2.配置 main.js /***图片模板等懒加载 start ***/ import VueLazyload from 'vue-lazyloa ...

  9. vue实现menu菜单懒加载

    本文将在vue+element ui项目中简单实现menu菜单的懒加载. 最近接到这样的需求:菜单的选项不要固定的,而是下一级菜单选项需要根据上级菜单调接口来获取.what? 这不就是懒加载吗?翻了一 ...

随机推荐

  1. SQL语句中 NOT IN 子句的“正确打开方式”

    在写SQL语句的时候,若where条件是判断用户不在某个集合当中,我们习惯使用 where 列名 not in (集合) 子句,这种写法本身没有问题,但实践过程中却发现很多人在写类似的SQL语句时,写 ...

  2. 微信小程序 改变radio(单选钮)默认大小

    /* 单选钮样式 */ radio { transform:scale(0.5); }

  3. linux安装mysql可视化界面

    之前是一直用shell交互界面,但是最近频繁地检查数据库中的数据感觉特别麻烦,便装了一个可视化工具. 安装: $ sudo apt-get install mysql-workbench [sudo] ...

  4. synchronized三种使用方式,及锁的类型验证

    Synchronized常用三种使用方式 1.修饰普通方法:锁对象即为当前对象 2.修饰静态方法:锁对象为当前Class对象 3.修饰代码块:锁对象为synchronized紧接着的小括号内的对象 一 ...

  5. ceph-----常用命令

    #查看存储池 ceph osd lspools #设置存储池副本数 ceph osd pool set data size 3 #查看存储池具体信息 ceph osd pool ls detail # ...

  6. GitHub:Tencent

    ylbtech-GitHub:Tencent 1.返回顶部 1. https://opensource.tencent.com/ 2. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶 ...

  7. SQL Server批量备份数据库

    --批量备份数据库201911 --开启文件夹权限 GO SP_CONFIGURE RECONFIGURE GO SP_CONFIGURE RECONFIGURE GO DECLARE ), ), ) ...

  8. CompletableFuture.allOf that doens't return Void(CompletableFuture.allOf不能返回Void的解决方法)

    import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Ti ...

  9. Hibernate不同数据库的连接及SQL方言

    本文讲述Hibernate不同数据库的连接及SQL方言.Hibernate不同数据库的连接可能会出现错误,有一种情况是由于Hibernate SQL方言设置不正确而导致的. 以下代码展示Hiberna ...

  10. 实验一 part2

    #include <stdio.h> int main () { int x; printf("输入一个整数:\n"); scanf("%d",&a ...