webpack动态加载与打包方式
作者:s-alone 发布时间:2024-04-23 09:16:10
webpack代码拆分
webpack有两种组织模块依赖的方式,同步和异步。异步依赖作为分割点,形成一个新的块,在优化了依赖树后,每一个异步区块都作为一个文件被打包。
上下文模块(contextModule)
上下文模块有6种类型,分别为sync/lazy/lazy-once/eager/weak/sync-weak
sync:直接打包当前文件,同步加载并执行
lazy:为每个import()导入的模块生成一个可延迟加载(lazy-loadable)的chunk
lazy-once:生成一个可满足所有import()调用的可延迟加载(lazy-loadable)的chunk
此chunk将在第一次import()调用时获取,随后import()则使用相同的网络响应。注意,这种模式仅在动态语句中有意义。例如:import(
./locales/${language}.json
),其中可能含有多个被请求的模块路径。eager:不会分离出单独的chunk文件,但是会返回promise,只有调用promise才会执行代码,可以理解为先加载了代码,但是我们可以控制延迟执行这部分代码。
此模块会阻止webpack生成额外的chunk。所有导入的模块被包含在当前chunk,所以不需要再发额外的网络请求。它仍然返回一个promise,但会被自动resolved。使用eager模式的动态导入与静态导入的区别在于整个模块只有当import()调用之后才会执行。
例子:当前vue文件为Home.vue,同级菜单有一个文件夹pages,它里面有三个文件a.vue, b.vue, c.vue
// 把Home, a, b, c分别打包到不同的chunk中
import('./pages/' + pageId)
// 把Home打成一个chunk,a/b/c统一打包到一个chunk
import(/* webpackMode: "lazy-once" */ './pages/' + pageId)
// 把Home, a, b, c打包到一个chunk中,且a/b/c中的代码只有在import之后执行(不在chunk加载时执行)
import(/* webpackMode: "eager" */ './pages/' + pageId)
注意:即使没有引用pages里面的某个文件,也会对其进行打包!
通过上下文组件请求的实际路径是相对于指定目录的相对路径;在这里相对于‘/pages’上下文的路径,即’./a.vue’, ‘./b.vue’, ‘./c.vue’
生成contextModule的方式
require(表达式)
require(./locale/${language}.js
) 会把匹配到的文件打包进去
require.context()函数
require.context(
(directory: String),
(includeSubdirs: Boolean) /* 可选的,默认值是 true */,
(filter: RegExp) /* 可选的,默认值是 /^.\/.*$/,所有文件 */,
(mode: String) /* 可选的, 'sync' | 'eager' | 'weak' | 'lazy' | 'lazy-once',默认值是 'sync' */
一个 context module 会导出一个(require)函数,此函数可以接收一个参数:request。
此导出函数有三个属性:resolve, keys, id。
resolve 是一个函数,它返回 request 被解析后得到的模块 id。
keys 也是一个函数,它返回一个数组,由所有可能被此 context module 处理的请求组成
id 是 context module 的模块 id. 它可能在你使用 module.hot.accept 时会用到
例子:
与当前文件index.js同级目录modules有 aaa/index.js和bbb/index.js两个文件
const modulesFiles = require.context('./modules', true, /index.js$/)
console.log('modulesFiles:', modulesFiles)
// ƒ webpackContext(req) {
// var id = webpackContextResolve(req);
// return __webpack_require__(id);
// }
console.log('modulesFiles.keys:', modulesFiles.keys()) // ['./aaa/index.js', './bbb/index.js']
console.log('modulesFiles.resove:', modulesFiles.resolve('./bbb/index.js')) // ./src/store/modules/bbb/index.js
console.log('modulesFiles.id:', modulesFiles.id) // ./src/store/modules sync recursive index.js$
export const modules = modulesFiles.keys().reduce((res, modulePath) => {
const pathName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
const moduleName = pathName.replace('/index', '')
const module = modulesFiles(modulePath)
const dModuleName = module.default.name || ''
console.log('modulePath:', modulePath)
console.log('moduleName:', moduleName)
console.log('module:', module)
res[dModuleName || moduleName] = module.default
console.log('res:', res)
return res
}, {})
import()函数
import(
/* webpackInclude: /\.json$/ */
/* webpackExclude: /\.noimport\.json$/ */
/* webpackChunkName: "my-chunk-name" */
/* webpackMode: "lazy" */ /* 'eager' | 'weak' | 'lazy' | 'lazy-once',默认值是 'lazy' */
/* webpackPrefetch: true */
/* webpackPreload: true */
/* webpackIgnore: false */ /* 将 webpackIgnore 设置为 true 则不进行代码分割 */
`./locale/${language}`
)
require.ensure()函数
require.ensure()已被import()代替
含有环境变量的动态加载
代码运行时通过判断环境变量(例如process.env.NODE_ENV===‘production’),只会打包满足判断条件逻辑分支的请求!!!;
export function getBaseUrl () {
if (process.env.NODE_ENV === 'production') {
require('@/prod.host.js')
return '/performance/'
} else {
const requireHostFiles = require.context('@/api', false, /devHost.js$/)
return requireHostFiles.keys().includes('./devHost.js') ? requireHostFiles('./devHost.js').devHost : require('@/dev.host.js').devHost
}
}
如果process.env.NODE_ENV === ‘production’,只会打包 ‘@/prod.host.js’
否则会打包 ‘@/api’下的直属下属文件中满足 /devHost.js$/ 正则的文件, 以及 ‘@/dev.host.js’
来源:https://blog.csdn.net/m0_65937359/article/details/122884037


猜你喜欢
- 数据库: 30万条,有ID列但无主键,在要搜索的“分类”字段上建有非聚集索引 过程T-SQL: /* 用户自定义函数:执行时间在1150-1
- 搭建vue的开发环境:1、必须要安装nodejs2、搭建vue的开发环境 ,安装vue的脚手架工具 官方命令行工具npm install -
- SQLyog是一款MySQL可视化工具,他可以将部分SQL操作通过图形化界面操作来完成,方便开发者更好的进行开发及数据库设计。在安装SQLy
- 图的实现所谓图就是节点及其连接关系的集合。所以可以通过一个一维数组表示节点,外加一个二维数组表示节点之间的关系。//图的矩阵实现typede
- 代码'''数据集:Mnist训练集数量:60000(实际使用:10000)测试集数量:10000(实际使用:1000
- 看代码吧~import torchprint(torch.__version__)补充:pytorch不同版本安装以及版本查看一:基于con
- 读视频和写视频一直由于编解码的问题给程序员造成很多麻烦。对此进行了一些探索。用Python读取视频有两种主要方法,分别是基于imageio库
- 什么是生产者消费者模型在 工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以
- 1.在浏览器下载与浏览器相对于的驱动并放到python的安装根目录下驱动的两个下载地址:http://chromedriver.storag
- 本文实例讲述了JQuery中serialize()用法。分享给大家供大家参考。具体分析如下:一、serialize()定义和用法:seria
- Flask框架是Python开发的一个基于Werkzeug和Jinja 2的web开发微框架,它的优势就是极其简洁, 但又非常灵活,而且容易
- MySQL 报错:Parameter index out of range (1 > number of parameters, which
- 1. timeit.timeit(stmt=‘pass', setup=‘pass', timer=<default
- Mysql Binlog 简介Mysql Binlog是二进制格式的日志文件Binlog是用来记录Mysql内部对数据库的改动(只记录对数据
- 1、授权机制的主要作用是什么?授权机制的基本作用是给某个主机上的用户对某个数据库以select,insert,update和detete的权
- 前言在写 python 程序的时候,经常会用到引入其他文件夹里的 py 文件,要是都在同目录下直接 import 就好了,可是有的不在同一个
- 爬虫利器BeautifulSoup中find和find_all的使用方法二话不说,先上段HTML例子<html> &
- 如何优雅地解析命令行选项随着我们编程经验的增长,对命令行的熟悉程度日渐加深,想来很多人会渐渐地体会到使用命令行带来的高效率。自然而然地,我们
- 1.实例方法Python 的实例方法用得最多,也最常见。我们先来看 Python 的实例方法。class Kls(object): &nbs
- 在教材实例编写雷达图时出现ValueError,具体如下:ValueError: The number of FixedLocator lo