Webpack chunk的url增加查询字符串

第一次写文章,分享一点 baidu 得不到的东西。

遇到的问题

使用Webpack做SPA项目,项目稍微大了之后,大家都会想到按需加载,比如 React 使用 React.Lazy 。然后我们的 webpack.config.js 这样写:

javascript 复制代码
module.export = {
  output: {
    path: "dist",
    filename: "[name].[contenthash:6].js",
    chunkFilename: "[name]-chunk.[contenthash:6].js",
  },
}

最后浏览器里我们的加载url可能就变成了这样的:

入口文件 https://site.example.com/static/js/index.f67ab1.js

chunk文件 https://site.example.com/static/js/settings-chunk.af21e1.js

入口文件是通过 HtmlWebpackPlugin 挂载到 html 上的,入口文件已经做到随意配置querystring了,但是 chunk 文件是动态加载的,也想把它改成如下:
https://site.example.com/static/js/settings-chunk.af21e1.js?h=[某动态参数]

解决方案

javascript 复制代码
// 解决 js 文件 querystring 问题
// eslint-disable-next-line prefer-const, no-var
declare var __webpack_get_script_filename__: (chunkId: string) => string; // NOSONAR
const oldFn = __webpack_get_script_filename__;
__webpack_get_script_filename__ = (chunkId) => {
  const filename = oldFn(chunkId);
  if (filename.includes("?")) {
    return filename + `&ts=${Date.now()}`;
  }
  return filename + `?ts=${Date.now()}`;
};

// 解决 css 文件 querystring 问题
declare namespace __webpack_require__ {
  // eslint-disable-next-line prefer-const, no-var
  var miniCssF: (chunkId: string) => string; // NOSONAR
}
const oldMiniCssF = __webpack_require__.miniCssF;
__webpack_require__.miniCssF = (chunkId) => {
  const filename = oldMiniCssF(chunkId);
  if (filename.includes("?")) {
    return filename + `&ts=${Date.now()}`;
  }
  return filename + `?ts=${Date.now()}`;
};

嘿嘿嘿

chunk js文件的方法,百度能搜到,但是chunk css 文件的方法,百度没搜到,拿去用吧。如果还是没生效,那就换个位置写一下,比如:

javascript 复制代码
import { somethingA } from './something-a';

// 解决 js 文件 querystring 问题
// eslint-disable-next-line prefer-const, no-var
declare var __webpack_get_script_filename__: (chunkId: string) => string; // NOSONAR
const oldFn = __webpack_get_script_filename__;
__webpack_get_script_filename__ = (chunkId) => {
  const filename = oldFn(chunkId);
  if (filename.includes("?")) {
    return filename + `&ts=${Date.now()}`;
  }
  return filename + `?ts=${Date.now()}`;
};

// 解决 css 文件 querystring 问题
declare namespace __webpack_require__ {
  // eslint-disable-next-line prefer-const, no-var
  var miniCssF: (chunkId: string) => string; // NOSONAR
}
const oldMiniCssF = __webpack_require__.miniCssF;
__webpack_require__.miniCssF = (chunkId) => {
  const filename = oldMiniCssF(chunkId);
  if (filename.includes("?")) {
    return filename + `&ts=${Date.now()}`;
  }
  return filename + `?ts=${Date.now()}`;
};

if (somethingA()) {
  import('../other-theme.less');
}

课后作业

__webpack_require__.miniCssF 是哪个plugin暴露出来的方法呢? 嗯~ o( ̄▽ ̄)o

相关推荐
程序员爱钓鱼9 分钟前
Rust String 与 &str 详解:字符串所有权、借用与转换
前端·后端·rust
码农学院14 分钟前
GEO与SEO协同:从传统搜索到生成式搜索的平滑迁移路径
服务器·前端·python
咩咩啃树皮9 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny9 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹9 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny9 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
小林ixn10 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker10 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
এ慕ོ冬℘゜10 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康10 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端