vite拆分打包配置详情,以及碰到的问题和解决方法。

最近在做一个小项目,玩一下分包碰到了不少的问题,在此记录一下。

pnpm下每个依赖单独打包不生效问题

分包生效但是部署报错问题

解决方法都在下方例子里

题外话:最近在找前端工作,有不卡本科工作机会的可以推一下,地点最好是成都/上海的。

方式一:

把node_modules单独打一个包

javascript 复制代码
manualChunks(id) {
// 分两个包
if (id.includes("node_modules")) {
  return "vendor";
}
},

方式二:

npm下每个依赖单独打包

scss 复制代码
manualChunks(id) {
// 有多少模块就分多少包
// npm写法
 if (id.includes("node_modules")) {
   return id
     .toString()
     .split("node_modules/")[1]
     .split("/")[0]
     .toString();
 }
},

pnpm下每个依赖单独打包会不生效

项目使用的pnpm时,这个规则会把所有的依赖打包在一个文件,pnpm的文件路径有点不一样

juejin.cn/post/723268...

评论区的AmorDiamond老哥提供思路

javascript 复制代码
manualChunks(id) {
// 尝试匹配 npm 或 pnpm 的 node_modules 路径格式
const npmPattern = /node_modules/(.+)/node_modules//;
const pnpmPattern = /node_modules/(@[^/]+/[^/]+)/node_modules//;

// 检查是否是 npm 格式的路径
let match = id.toString().match(npmPattern);
if (match) {
  return match[1];
}

// 检查是否是 pnpm 格式的路径
match = id.toString().match(pnpmPattern);
if (match) {
  // pnpm 路径中,第一个分割的部分是包的 scope 名称,需要保留
  return match[1];
}

// 如果都不是,则不进行分包
return undefined;
},

方式三:

指定依赖单独打包

css 复制代码
manualChunks = {
  // 使用 legacy 会导致报错
  manualChunks: {
    elementplus: ["element-plus"],
    vue: ["vue"],
    // leafer: ["leafer-ui", "leafer-in"],
  },
};

方式四

指定依赖单独打包,剩下的依赖打包到 vendor,代码逻辑打包到 index

perl 复制代码
manualChunks(id) {
// 创建一个对象映射,用于存储库名及其对应的chunk名称
const libraryChunkMap = {
  "element-plus": "element-plus",
  // vue: "vue",
  // "leafer-in": "leafer",
  // "leafer-ui": "leafer",
};

// 检查模块ID是否包含'node_modules',即是否为第三方依赖
if (id.includes("node_modules")) {
  // 遍历libraryChunkMap的键(即库名),查找与模块ID存在包含关系的库名
  const matchedLibrary = Object.keys(libraryChunkMap).find((library) =>
    id.includes(library)
  );

  // 如果找到了匹配的库名,返回对应的chunk名称(从libraryChunkMap中获取)
  if (matchedLibrary) {
    return libraryChunkMap[matchedLibrary];
  } else {
    // 如果未找到匹配的库名,将该第三方依赖归入默认的'vendor' chunk
    return "vendor";
  }
} else {
  // 如果模块ID不包含'node_modules',即不是第三方依赖,则将其归入'index' chunk
  return "index";
}
},

分包生效但是部署报错问题解决方法

经过反复排查是因为 @vitejs/plugin-legacy 插件导致的

之前使用这个插件是为了让打包出来的文件可以直接在浏览器运行,纯离线的工具随处运行更方便。

所以现在的解决方法就是在 legacy 模式下不使用分包

增加打包模式,环境变量配置

在vite.config.js判断一下就行了

具体代码省略

有需要可以在我的这个小项目里面查看一下。

github.com/wumingluren...

相关推荐
阿酷tony26 分钟前
视频专栏列表的防录屏水印和跑马灯效果(也可网站调用)
java·前端·音视频
Bs_MoneyMagnet1 小时前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物
凌风的跨境分享1 小时前
Temu店群运维提效:定时策略自动化任务全场景实操指南
大数据·运维·前端·人工智能·架构·自动化
linux_cfan1 小时前
videojs v10 源代码系列解读:06 · DOM 工具箱:事件、聚焦、Shadow DOM、定位
前端
尾善爱看海1 小时前
Vue 面试进阶篇:Composition API、插槽、自定义指令……8 个章节 + 高频面试题全解析
前端·javascript·vue.js·面试·vue
SEO_juper2 小时前
外贸多语言站最隐蔽的流量杀手:hreflang 错了,谷歌把德语页推给美国人(附审计脚本)
开发语言·前端·python·seo·独立站·谷歌优化
亿元程序员2 小时前
为什么现在 AI 这么发达了,还要坚持手搓教程?
前端
三小河2 小时前
在 Codex 桌面端接入 DeepSeek 模型(CC Switch 代理中转)
前端·javascript·人工智能
CoderYanger3 小时前
前端基础——JavaScript(WebAPI)代码案例
java·开发语言·前端·javascript·css·前端框架·html5
恋猫de小郭3 小时前
Shopify 从 React Native 回到 Swift/Kotlin,但是你以为有手就行??
android·前端·ios