【发布时间】:2019-09-07 10:39:39
【问题描述】:
我正在使用新的(反应)代码部分更新现有的 Web 应用程序,并正在使用 webpack 将所有内容捆绑在一起以进行生产。因为现有的 HTML 页面(实际上是 XML 转换为 HTML)已经存在,所以我无法使用由 HtmlWebpackPlugin 生成的 index.html。
我想要实现的是 webpack 生成一个小的 runtime.bundle.js,它将动态加载其他生成的块(main.[contenthash] 和 vendor.[contenthash]),而不是将这些条目作为 script 标签添加到 @987654327 @。这样runtime.bundle.js 可以设置为nocache,而其他大块可以被浏览器缓存并在代码更改时正确获取。
例如,这里是生成的index.html的body块,注意注释:
<html>
<head>...</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<script type="text/javascript" src="runtime.bundle.js"></script>
<!-- I want these two files below not injected as script tags,
but loaded from the runtime.bundle.js file above -->
<script type="text/javascript" src="vendors.31b8acd750477817012d.js"></script>
<script type="text/javascript" src="main.1e4a456d496cdd2e1771.js"></script>
</body>
</html>
运行时文件已经加载了一个不同的块,该块是从 JS 动态导入的,代码如下:
const App = React.lazy(() => import(/* webpackChunkName: "modulex" */ './App'));
这会在 runtime.bundle.js 中的某处创建以下 sn-p
a = document.createElement('script');
(a.charset = 'utf-8'),
(a.timeout = 120),
i.nc && a.setAttribute('nonce', i.nc),
(a.src = (function(e) {
return (
i.p +
'' +
({ 1: 'modulex' }[e] || e) +
'.' +
{ 1: '0e0c4000d075e81c1e5b' }[e] +
'.js'
);
那么vendors 和main 块可以实现同样的效果吗?
我能想到的唯一其他替代解决方案是使用WebpackManifestPlugin 生成manifest.json 并使用它将块注入到已经存在的HTML 文件中。
【问题讨论】:
-
我正在为完全相同的场景而苦苦挣扎。你找到解决办法了吗?
-
@nevermind777 我编写了一个脚本来创建一个“运行时”JS 文件,该文件会将散列块作为脚本注入 HTML 文档的头部(使用由
WebpackManifestPlugin创建的manifest.json。这个脚本可以称为 npm 脚本,如果你喜欢我可以分享... -
谢谢@Sjiep 听起来很有趣,我想看看你的解决方案
标签: javascript webpack