Vue实现路由懒加载的方式以及打包问题

隐私侠
• 阅读 2766

一、实现路由懒加载的方式

webpack支持amd、commonJS、es6这三种模块语法,因此vue实现动态路有3种方式:

1. 使用AMD规范的require语法

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: resolve => require(['../views/About.vue'], resolve)
  },
]

这种语法不能指定模块的名称,默认使用webpack配置中output.chunkFileName

2. 使用commonJS规范的require.ensure语法

require.ensure() 是 webpack 特有的,已经被 import() 取代。
const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
     component: resolve => require.ensure([], () => resolve(
      require('@/' + about + '.vue')
    ), 'about')
  },
]

此语法和下面的import语法均可以指定模块名称

3. 使用ES6原生的import语法

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  },
]

这种是vue-cli3默认使用的方式。

二、懒加载可能会出现的打包问题

以上三种方式,如果路径参数中都包含变量,webpack打包就会出现问题。

1. import()会将该组件所在的目录内的所有组件都引入进来。

const about = 'views/About'
const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: () => import(/* webpackChunkName: "about" */ `../${about}.vue`)
  },
]

这样会将views目录下的所有组件都进行打包,即使没有在路由中没有配置。
因此wbepackChunkName指定的文件名也会有所改变,上面的About页面组件会打包成about1about2类似的名称。
如果后续的路由配置中的路径参数也带有变量,那不管你指定什么webpackChunkName,打包出来的都是按照第一个import指定的webpackChunkName。例如:

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: () => import(/* webpackChunkName: "about" */ `../${about}.vue`) // 打包成about2.js
  },
  {
    path: '/test',
    name: 'Test',
    component: () => import(/* webpackChunkName: "test" */ `../${test}.vue`) // 最终打包成 about3.js 这样的文件名,而不是test.js
  },

2. require()和require.ensure则会将所有带上变量的路由组件打包为一个js

let home = 'views/Home'
let about = 'views/About'
let test = 'views/Test'
const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: resolve => require(['../' + about + '.vue'], resolve)
  },
  {
    path: '/test',
    name: 'Test',
    component: resolve => require(['../' + test + '.vue'], resolve)
  },

about页面组件和test页面组件会被打包进同一个js文件。

所以尽量不要在路径参数中带上变量。

点赞
收藏
评论区
推荐文章
Easter79 Easter79
4年前
vue 路由懒加载
原文链接: vue路由懒加载(https://my.oschina.net/ahaoboy/blog/1796979)路由懒加载当打包构建应用时,Javascript包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。结合Vue的异步组件
Easter79 Easter79
4年前
vue 路由 懒加载
原文链接: vue路由懒加载(https://my.oschina.net/ahaoboy/blog/1618024)路由懒加载当打包构建应用时,Javascript包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。结合Vue的异步组
Jacquelyn38 Jacquelyn38
4年前
Vue3.0系列——「vue3.0学习手册」第一期
Vue3.0一、项目搭建vite是尤大大开发的一款意图取代webpack的工具。其实现原理是利用ES6的import发送请求加载文件的特性。拦截这些请求,做一些编译,省去webpack冗长的打包时间。并将其与Rollup捆绑在一起用于生产。在开发过程中没有捆绑。源代码中的ESImport语法直接提供给浏览器,浏览器通过本机<scriptmodule支持对
Stella981 Stella981
4年前
JS 中的require 和 import 区别
在研究react和webpack的时候,经常看到在js文件中出现require,还有import,这两个都是为了JS模块化编程使用。CSS的是@import1.ES6模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。Require是CommonJS的语法,CommonJS的模块是对象,输入时
Stella981 Stella981
4年前
ES6 模块化(Module)export和import详解
ES6模块化(Module)export和import详解ES6在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。ES6模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS和AMD模块,都只能
Wesley13 Wesley13
4年前
KO
KOKO是一个基于Webpack开发的快速开始Web开发的脚手架工具,具有以下特性:可以当做一个Webpack配置种子来使用,无需二次配置、开箱即用自动支持多页应用(可选)Vue单文件组件的开发方式资源分块加载,内联和异步加载方式管理,低成本实现首屏优化支
Stella981 Stella981
4年前
ES6学习笔记(二十)Module 的加载实现
上一章介绍了模块的语法,本章介绍如何在浏览器和Node之中加载ES6模块,以及实际开发中经常遇到的一些问题(比如循环加载)。1.浏览器加载传统方法 HTML网页中,浏览器通过<script标签加载JavaScript脚本。<!页面内嵌的脚本<scripttype
Stella981 Stella981
4年前
CommonJs 与 AMD 与 requirejs
CommonJS规范主要解决服务端中library的导入导出问题。NodeJS(同时也包括webpack与npm)是CommonJS规范的实现由于CommonJS规范引入依赖的方式是同步的,而在浏览器端需要进行异步加载,因此创建了AMD规范用于浏览器端管理依赖问题。require.js是AMD规范的一管实现。U
Wesley13 Wesley13
4年前
@JavaScript程序员,如何写出令人惊叹的高级代码?
△是新朋友吗?记得先点web前端学习圈关注我哦~!(https://oscimg.oschina.net/oscnet/332f31ec504043fa90fa06a0b296c308.jpg)各种包管理器到ESLint,从CommonJS到AMD,再从ES6模块到Babel和Webpack,好多工具啊!!(http
Stella981 Stella981
4年前
Angular中,模块加载的几种方法
一、懒加载  通过路由配置: {path:'flightbooking',loadChildren:'./flightbooking/flightbooking.moduleFlightBookingModule'}好处:这种方式有利于
程序员小五 程序员小五
1年前
融云IM干货丨有没有插件能帮我优化uni-app的页面加载速度?
根据您的需求,以下是一些可以帮助优化uniapp页面加载速度的插件和方法:1.图片懒加载插件:使用图片懒加载可以显著减少首屏的加载时间。可以在页面滚动时才加载图片,减少初次加载的压力。2.代码拆分和懒加载:根据页面和功能的使用情况,将代码拆分为多个模块,并