以下三种方法,一和二在本质上是一个东西,只不过是 MODULE_ 语法和 _COMMONJS 语法的区别。三是在二的低版本。
零、如果你使用vue-cli 4
一定记得去掉 prefetch 插件!!
根据 vue-cli 官方的解释:
默认情况下,一个 Vue CLI 应用会为所有作为 async chunk 生成的 JavaScript 文件 (通过动态
import()
按需 code splitting 的产物) 自动生成 prefetch 提示。 这些提示会被 @vue/preload-webpack-plugin 注入,并且可以通过chainWebpack
的config.plugin('prefetch')
进行修改和删除。但实际使用下来,被标明 prefetch 的资源也一定堵塞当前文件其余资源(本页面css、图片)的加载,并没有「pre」
一、() => import
1. 例子
{
path: '/Home',
name: 'Home',
component: () => import('@/components/Home/Home', 'com-Home'),
beforeEnter(to, from, next) {
next()
},
}
2. 语法特性
参考:异步组件
在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块。为了简化,Vue 允许你以一个工厂函数的方式定义你的组件,这个工厂函数会异步解析你的组件定义。Vue 只有在这个组件需要被渲染的时候才会触发该工厂函数,且会把结果缓存起来供未来重渲染。
一个推荐的做法是将异步组件和 > webpack 的 code-splitting 功能> 一起配合使用。
二、resolve => require([], resolve)
1. 例子
{
path: '/Home',
name: 'Home',
component: resolve => require(['@/components/Home/Home'], resolve),
beforeEnter(to, from, next) {
next()
},
}
2. 语法特性
- 参考同一
- 这个特殊的
require
语法将会告诉 webpack自动将你的构建代码切割成多个包,这些包会通过 Ajax 请求加载。
_
三、require.ensure()
配合 require()
1. 例子
{
path: '/Home',
name: 'Home',
component: require.ensure([], () => r(require('@/components/Home/Home')), 'com-home',
beforeEnter(to, from, next) {
next()
},
}
2. 语法特性
- webpack 2.2 开始支持,webpack 4 去除了 CommonsChunkPlugin ,使用 SplitChunksPlugin 替代,因此在 webpack4 的环境下,这种写法与二除了可以命名以外没有区别。
- 当使用 CommonJS 模块语法的时候,这是唯一实现动态加载的方法。
- 这个功能依赖于 Promise,如果想要支持更老的浏览器,那么记得使用类似于 es6-promise 或者 promise-polyfill 的polyfill。
3. 作用
webpack 在编译时,会静态地解析代码中的
require.ensure()
,同时将模块添加到一个分开的 chunk 当中。这个新的 chunk 会被 webpack 通过jsonp
来按需加载。
4. 语法
require.ensure(
dependencies: String[],
callback: function(require),
errorCallback: function(error),
chunkName: String
)
- 依赖 dependencies
- 这是一个字符串数组,通过这个参数,在所有的回调函数的代码被执行前,我们可以将所有需要用到的模块进行声明。
- 回调 callback
- 当所有的依赖都加载完成后,webpack会执行这个回调函数。require 对象的一个实现会作为一个参数传递给这个回调函数。因此,我们可以进一步 require() 依赖和其它模块提供下一步的执行。
- chunk名称 chunkName
- chunkName 是提供给这个特定的 require.ensure() 的 chunk 的名称。通过提供 require.ensure() 不同执行点相同的名称,我们可以保证所有的依赖都会一起放进相同的 文件束(bundle)。
5. 注意点
- callback 传入参数的变量命名,一定要是require,不然无法通过 webpack 静态解析器的处理。