当前位置: 首页 > news >正文

splitchunk(如何将指定文件从主包拆分为单独的js文件)

1. 说明

webpack打包会默认将入口文件引入依赖js打包为一个入口文件,导致这个文件会比较大,页面首次加载时造成加载时间较长
可通过splitchunk配置相应的规则,对匹配的规则打包为单独的js,减小入口js的体积

2. 示例

通过正则匹配,会把入口中引入的c.js打包为单独c.js

  • webpack.config.js
const path = require('path');
module.exports = {entry: "./src/index.js",output: {path: path.resolve(__dirname, 'dist1'),publicPath: "/dist1/",},optimization: {minimize: false,splitChunks: {minSize: 0,cacheGroups: {cJs: {test: /c\.js$/,  // 通过正则匹配,会把入口中引入的c.js打包为单独c.js,在html里也需引入c.jsname: 'c',chunks: 'all',priority: 10 // 设置较高的优先级}}}}
}
  • index.js
import a from './a.js'
import './cc/c.js'
import './c.js'a()
  • a.js
const testArrowFuntion = () => {console.log('this is testArrowFuntion')
}const aSignFuntion = () => {testArrowFuntion()console.log('this is a')
}export default aSignFuntion
  • cc/c.js
const getUuid = (len, radix) => {var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')var uuid = []var iradix = radix || chars.lengthif (len) {for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]} else {var ruuid[8] = uuid[13] = uuid[18] = uuid[23] = ''uuid[14] = '4'for (i = 0; i < 36; i++) {if (!uuid[i]) {r = 0 | Math.random() * 16uuid[i] = chars[(i === 19) ? (r & 0x3) | 0x8 : r]}}}return uuid.join('')
}export {getUuid
}
  • c.js
console.log('This is c.js');
window.sunlight = 'ght'

3. 结果展示

  • 大包会生成 mains.js、c.js 两个文件 正常不配置splitchunk情况只会生成一个main.js
    在这里插入图片描述
  • main.js中只包含了a.js代码
    在这里插入图片描述
  • c.js 文件包含了 cc/c.js、c.js 两部分的代码

在这里插入图片描述
【注】
页面里需要把main.js和c.js都引入

4. main.js里是如何加载 c.js 里的代码的呢

  • mainx.js 会对window[“webpackJsonp”].push进行劫持,在c.js里调用window[“webpackJsonp”].push时,会触发main.js里的webpackJsonpCallback 回调函数
    在这里插入图片描述
  • webpackJsonpCallback 函数里会将依赖的代码获取到,并用对应chunkId关联对应的模块代码

在这里插入图片描述

  • c.js 会默认调用window[“webpackJsonp”] || []).push 添加对应的模块代码
    在这里插入图片描述

相关文章:

  • Python+Selenium+Pytest+Allure PO模式UI自动化框架
  • 文章记单词 | 第48篇(六级)
  • 关于Android Studio的Gradle各项配置2
  • 优化无头浏览器流量:使用Puppeteer进行高效数据抓取的成本降低策略
  • 微深节能 平板小车运动监测与控制系统 格雷母线
  • java_基础Java 转义字符学习笔记
  • Kaamel白皮书:IoT设备安全隐私评估实践
  • 【MCP Node.js SDK 全栈进阶指南】中级篇(6):MCP与Web框架集成
  • 网络安全漏洞现状与风险管理分析
  • OceanBase数据库-学习笔记1-概论
  • C# 类的基本概念(声明类)
  • RAGFlow解决Docker Compose include 报错问题
  • 计算机网络学习笔记 4-6章
  • RAG(Retrieval-Augmented Generation,检索增强生成)
  • Vue2 与 Vue3 深度对比与技术解析
  • 文章记单词 | 第49篇(六级)
  • 频谱感知方法简要介绍与比较分析
  • ByeCode,AI无代码开发平台,拖拽式操作构建应用
  • 第十一章-PHP表单传值
  • Tauri窗口与界面管理:打造专业桌面应用体验 (入门系列五)
  • 从 “沪惠保” 到 “沪骑保”看普惠保险的 “上海样式”
  • 伊朗国防部发言人:发生爆炸的港口无进出口军用物资
  • 13家券商一季报出炉:超七成业绩预喜,财通、湘财、第一创业下滑
  • 热点问答|第三轮间接谈判结束,美伊分歧还有多大?
  • 银川市市长信箱被指已读乱回,官方回应
  • 最高法知产庭年度报告:民事案件二审发回重审率持续下降