前言

随着移动设备的升级、网络速度的提高,用户对于web应用的要求越来越高,web应用要提供的功能越来越。功能的增加导致的最直观的后果就是资源文件越来越大。为了维护越来越庞大的客户端代码,提出了模块化的概念来组织代码。webpack作为一种模块化打包工具,随着react的流行也越来越流行。
使用 Vue 开发项目时,如果要使用其单文件组件特性,必然要使用 webpack 或者 browserify 进行打包,对于大型应用,为了提升加载速度,可以使用 webpack 的 code split 功能进行分割打包,生成较小的模块并按需加载,这在 Vue 文档及 vue-router 文档中均有介绍:Async Components、Lazy Loading。
webpack 的 code split 可以使用 webpack 的 require.ensure 特殊语法或者使用 AMD 风格的 callback-require 语法,以 AMD 风格的 callback-require 语法为例——
全局注册 Async Component:
let myAsyncComponent = resolve => {
require(['./my-async-component'], resolve)
}
Vue.component('async-webpack-example', myAsyncComponent)
局部注册 Async Component,单文件组件中 script 块内容:
let myAsyncComponent = resolve => {
require(['./my-async-component'], resolve)
}
// Vue 扩展实例选项,其他选项略
export default {
components: {
'async-webpack-example': myAsyncComponent
}
}
在使用 vue-router 时,为实现不同路由下的组件异步加载,在路由映射中可以使用同样的方式来设置路由项的 component 属性。
这里的 myAsyncComponent 被定义为一个工厂函数,在需要时才会以 Vue 或者 vue-router 定义的用于解析组件选项的 resolve 回调函数(是的,在 Vue 和 vue-router 中有两个不同的解析组件选项的函数)为参数执行 callback-require 函数(resolve 回调函数的参数是组件选项),这样,在执行打包脚本时,my-async-component.vue 文件会被单独打包成一个文件,并且仅当该组件被使用时才会加载。
当要求异步加载的组件较多时,将会生成更多的单个文件,对于前端性能而言,虽然每个文件更小了,但可能意味着更多的网络连接建立和关闭的开销,因此在前端优化的实践中,通常需要在文件数量和单个文件大小之间取得平衡。
本文介绍如何将多个组件合并打包成一个单独的文件,一方面可以减少代码块的数量,另一方面,如果合并打包的这些组件在不同地方多次重复使用,由于 Vue 的缓存机制,可以加快后续组件的加载速度,并且如果这些通用组件长时间不会变化(如 UI 相关的组件),打包生成的文件也长期不会变化,可以充分利用浏览器的缓存功能,实现前端加载速度的优化。
先上效果图,在使用 vue-router 的 SPA 应用中,将除根路由之外的路由项对应的 ComponentA、ComponentB、ComponentC 等三个组件合并打包成一个文件。初次加载页面时,从开发者工具的 Network 面板上可以看到,此时未加载包含 ComponentA、ComponentB、ComponentC 这三个组件的 0.a5a1bae6addad442ac82.js 文件,当点击 Page A 链接时,加载了该文件,然后再点击 Page B、Page C 链接时,没有重新加载该文件。
我们首先通过 vue-cli 命令行工具使用 webpack 项目模板创建一个包含 vue-router 的项目,在其 src/components 目录下创建一个 CommonComponents 目录,在该目录中创建 ComponentA、ComponentB、ComponentC 这三个组件。
同时在 CommonComponents 目录下创建 index.js,其内容如下:
exports.ComponentA = require('./ComponentA')
exports.ComponentB = require('./ComponentB')
exports.ComponentC = require('./ComponentC')
这样,我们只需要使用 webpack 的 require.ensure 特殊语法或者使用 AMD 风格的 callback-require 语法异步加载 CommonComponents 目录下的 index.js,在使用 webpack 进行打包时,就可以实现将 ComponentA、ComponentB、ComponentC 这三个组件合并打包。以 AMD 风格的 callback-require 语法为例示范如下,这里的 callback 回调函数的形式没有任何特殊要求。
require(['component/CommonComponents'], function (CommonComponents) {
// do whatever you want with CommonComponents
})
component/CommonComponents 模块加载成功时,这里的回调函数中的 CommonComponents 参数将会是一个包含 ComponentA、ComponentB、ComponentC 这三个组件选项的对象。
在定义异步解析组件时,我们使用的是一个工厂函数 resolve => {require(['./my-async-component'], resolve)},如果需要在路由配置文件中添加 component 属性为 ComponentA 组件的路由项,应该定义什么样的工厂函数呢?记住这里的 resolve 是一个用于解析组件选项的回调函数,其参数是所获取的组件选项,而上一段代码中的 CommonComponents 恰好是包含若干个组件选项的对象,因此我们可以将 CommonComponents 的子属性作为参数用于 resolve 调用,我们编写一个函数 getCommonComponent,用于根据组件名称返回获取相应的组件选项的工厂函数。
let getCommonComponent = componentName => resolve => require(['components/CommonComponents'], components => resolve(components[componentName]))
在组件模板或者路由映射等使用其中某一个组件的地方,可以使用类似于 getCommonComponent('ComponentA') 这样的函数调用进行组件设置,在路由映射中的使用示例如下:
routes: [
{
path: '/',
name: 'Hello',
component: Hello
},
{
path: '/a',
name: 'A',
component: getCommonComponent('ComponentA')
},
{
path: '/b',
name: 'B',
component: getCommonComponent('ComponentB')
},
{
path: '/c',
name: 'C',
component: getCommonComponent('ComponentC')
}
]
最终打包生成的文件列表如下图所示,其中的 0.a5a1bae6addad442ac82.js 包含了 ComponentA、ComponentB、ComponentC 这三个组件。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# webpack
# 打包vue组件
# vue
# 打包
# 按需加载
# webpack如何打包一个按需引入的vue组件库
# Webpack按需加载打包chunk命名的方法
# Webpack实现按需打包Lodash的几种方法详解
# Webpack中实现条件组件的按需打包的多种方法
# 加载
# 这三个
# 回调
# 可以使用
# 是一个
# 将会
# 为例
# 目录下
# 时才
# 该文件
# 创建一个
# 要使
# 的是
# 文档
# 多个
# 没有任何
# 中有
# 长时间
# 提出了
# 我们可以
相关文章:
Python多线程使用规范_线程安全解析【教程】
子杰智能建站系统|零代码开发与AI生成SEO优化指南
如何通过云梦建站系统实现SEO快速优化?
文字头像制作网站推荐软件,醒图能自动配文字吗?
建站之星安装后如何自定义网站颜色与字体?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
兔展官网 在线制作,怎样制作微信请帖?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
智能起名网站制作软件有哪些,制作logo的软件?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
建站之星在线版空间:自助建站+智能模板一键生成方案
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
建站之星安装需要哪些步骤及注意事项?
如何用低价快速搭建高质量网站?
如何通过免费商城建站系统源码自定义网站主题与功能?
建站之星上传入口如何快速找到?
css网站制作参考文献有哪些,易聊怎么注册?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
手机网站制作与建设方案,手机网站如何建设?
网站制作公司,橙子建站是合法的吗?
如何快速生成专业多端适配建站电话?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
南京网站制作费用,南京远驱官方网站?
如何在宝塔面板中创建新站点?
开心动漫网站制作软件下载,十分开心动画为何停播?
开源网站制作软件,开源网站什么意思?
威客平台建站流程解析:高效搭建教程与设计优化方案
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
定制建站策划方案_专业建站与网站建设方案一站式指南
C#如何使用XPathNavigator高效查询XML
如何在搬瓦工VPS快速搭建网站?
c# await 一个已经完成的Task会发生什么
如何快速重置建站主机并恢复默认配置?
如何在VPS电脑上快速搭建网站?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
c++怎么用jemalloc c++替换默认内存分配器【性能】
建站三合一如何选?哪家性价比更高?
c# 在ASP.NET Core中管理和取消后台任务
如何快速生成高效建站系统源代码?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
如何用y主机助手快速搭建网站?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何在宝塔面板中修改默认建站目录?
建站DNS解析失败?如何正确配置域名服务器?
网站微信制作软件,如何制作微信链接?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
*请认真填写需求信息,我们会在24小时内与您取得联系。