在 webpack 4 中,供应商块具有诸如 之类的名称vendors~main~secondary.js,这些名称指的是与其相关的块。现在,在 webpack 5 中,供应商块名称是这样的 : vendors-node_modules_react-dom_index_js.js,这确实不太可读和理解。
关于如何在使用 webpack 5 时恢复到 webpack 4 的行为有什么建议吗?
我想我必须做点什么splitChunks.name,但我找不到合适的函数来做到这一点。
编辑
虽然 @MrP01 的答案更彻底,并且对使用提供了更多见解splitChunks.name,但这里有一个我最终使用的简短片段,它允许我回到确切的旧行为。
optimization: {
splitChunks: {
chunks: 'all',
name: (module, chunks, cacheGroupKey) => {
const allChunksNames = chunks.map((chunk) => chunk.name).join('~');
const prefix = cacheGroupKey === 'defaultVendors' ? 'vendors' : cacheGroupKey;
return `${prefix}~${allChunksNames}`;
},
},
},
Run Code Online (Sandbox Code Playgroud) 我有两个条目:page1.js,page2.js.
我不想在两个条目之间提取共享代码.我只想提取page2.js中使用的node_modules.
我如何在webpack 4中实现这一目标?谢谢.
在 Docker 中部署我的应用程序的新版本后,
我看到console以下错误会破坏我的应用程序:
Uncaught SyntaxError: Unexpected token '<'
Run Code Online (Sandbox Code Playgroud)
在此屏幕截图中,缺少的源称为:10.bbfbcd9d.chunk.js,该文件的内容如下所示:
Uncaught SyntaxError: Unexpected token '<'
Run Code Online (Sandbox Code Playgroud)
发生此错误的原因是:
Docker镜像块是
.js由 生成的文件,webpack有关详细信息,请参阅代码拆分
重新加载应用程序会将版本更新为最新版本,但对于使用过时版本的所有用户来说,它仍然会破坏应用程序。
我尝试过的一个可能的解决方法是刷新应用程序。如果请求的块在服务器上丢失,如果对.js文件的请求最终出现在通配符路由中,我将发送重新加载信号。
通配符服务于
index.htmlWeb 应用程序,这用于在用户刷新其页面的情况下将路由委托给客户端路由
(this.webpackJsonp=this.webpackJsonp||[]).push([[10],{1062:function(e,t,n){"use strict";var r=n(182);n.d(t,"a",(function(){return r.a}))},1063:function(e,t,n){var ...{source:Z[De],resizeMode:"cover",style:[Y.fixed,{zIndex:-1}]})))}))}}]);
//# sourceMappingURL=10.859374a0.chunk.js.map
Run Code Online (Sandbox Code Playgroud)
这似乎是一个糟糕的修复,尤其是在 Android 版 Google Chrome 上,我看到我的应用程序在无限循环中刷新。(是的,这也是一个丑陋的修复!)
由于它对我的最终用户来说不是一个可靠的解决方案,如果用户客户端已过时,我正在寻找另一种方法来重新加载应用程序。
我的 Web 应用程序是使用 构建的webpack,就好像它是一个create-react-app应用程序一样,分布式构建目录包含许多.js块文件。
这些是我在 …
javascript docker webpack create-react-app webpack-splitchunks
我想通过以下方式使用 Webpack 分割我的块:
每当我导入 NPM 包时,例如
import styled from "styled-components";
Run Code Online (Sandbox Code Playgroud)
我想要一个像这样的块:
styled-components.[contenthash:5].js // INCLUDING ITS DEPENDENCIES
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的配置:
webpack.config.js
optimization: {
runtimeChunk: 'single',
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name(module) {
const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
return `npm.${packageName.replace('@', '')}`;
},
},
},
},
}
Run Code Online (Sandbox Code Playgroud)
现在我将每个依赖项styled-components作为不同的块。例如:下面的3个包都是需要的styled-components
理想情况下,我还希望有一个commons或shared块以避免多个模块需要可能的模块。
有人知道该怎么做吗?
javascript webpack webpack-4 splitchunksplugin webpack-splitchunks
Webpack 配置是 Vue CLI 设置的一部分(可以使用 进行检查vue inspect)。这是其中的一个相关部分:
entry: {
foo: [
'.../src/foo.js'
],
barWidget: [
'.../src/barWidget.js'
],
},
optimization: {
splitChunks: {
cacheGroups: {
vendors: {
name: 'chunk-vendors',
test: /[\\/]node_modules[\\/]/,
priority: -10,
chunks: 'initial'
},
common: {
name: 'chunk-common',
minChunks: 2,
priority: -20,
chunks: 'initial',
reuseExistingChunk: true
}
}
},
...
Run Code Online (Sandbox Code Playgroud)
而 HTML 输出是:
<script type="text/javascript" src="/assets/js/chunk-vendors.[HASH].js"></script>
<script type="text/javascript" src="/assets/js/foo.[HASH].js"></script>
Run Code Online (Sandbox Code Playgroud)
和
<script type="text/javascript" src="/assets/js/chunk-vendors.[HASH].js"></script>
<script type="text/javascript" src="/assets/js/barWidget.[HASH].js"></script>
Run Code Online (Sandbox Code Playgroud)
foo根据需要拥有尽可能多的脚本标签没有问题,但barWidget小部件入口点应该立即加载,没有初始块依赖性。我的目的是barWidget加载一行代码(为此可能会禁用散列):
<script type="text/javascript" src="/assets/js/barWidget.js"></script>
Run Code Online (Sandbox Code Playgroud)
但在当前状态下,如果chunk-vendors …
我正在尝试按以下方式使用 splitChunks 插件拆分我的 React 代码(使用 create-react-app 创建):
我有以下组件(JSX)结构:
我想要以下输出(构建):
(其他运行时/主电源位于 /static/js 的根目录下)
另一个限制是组件是动态加载的
const Component = lazy(() => import(componentPath));
...
<Suspense fallback={..}>Component</suspense>
Run Code Online (Sandbox Code Playgroud)
“componentPath”是动态确定的(当用户单击图标时,它会打开给定的服务)。
这样做的原因是我想将每个包包含到运行后端的单独 Docker 映像中。然后,由于应用程序路由,每个 Docker 映像都可以访问:
static/js/serviceA/ ==> js served by Docker container running service A
static/js/serviceB/ ==> js served by Docker container running service B
static/js/serviceC/ ==> js served by Docker container running service …Run Code Online (Sandbox Code Playgroud) 我们使用 webpacksplitChunks来捆绑共享包,现在我们对我们的模块进行了 tree shake。(我们的图标、ui 组件、钩子和助手都是 npm 包)。
问题是,我们的包是完全可以进行树摇动的,但是splitChunks我们所有的包都被视为vendor~main.js并导入,没有任何树摇动。
Tree Shaking 只适用于本地进口吗?我们应该如何将 tree shake 和 splitChunks 用于 npm 包?
我从 create-react-app 的新副本开始。然后我运行弹出,并想添加代码分割。但是,每当我添加
splitChunks: {
automaticNameDelimiter: '.',
chunks: 'all',
},
Run Code Online (Sandbox Code Playgroud)
该应用程序卡在正在启动开发服务器...
如果我删除chunks: all该应用程序将再次开始工作。
注意:我根本没有改变任何其他内容。
我没有收到任何错误或任何关于如何找出问题所在的有用信息。它只是卡住了,有什么想法可能是错误的,或者我可以做些什么来获得更多关于卡住的地方的调试信息吗?
webpack.config.js
module.exports = function (webpackEnv) {
const isEnvDevelopment = webpackEnv === "development";
const isEnvProduction = webpackEnv === "production";
const isEnvProductionProfile =
isEnvProduction && process.argv.includes("--profile");
const env = getClientEnvironment(paths.publicUrlOrPath.slice(0, -1));
const shouldUseReactRefresh = env.raw.FAST_REFRESH;
// common function to get style loaders
const getStyleLoaders = (cssOptions, preProcessor) => {
const loaders …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 React.lazy() 来减小主 webpack 包的大小。我延迟加载的组件已成功拆分为自己的 js 块,在需要时按需下载。
\n\n但是,延迟加载组件的依赖项仍然包含在主 js 包中。这是预期的行为吗?如何正确地将延迟加载组件的依赖项拆分为自己的块或包含在延迟加载组件的块中?
\n\n// This code is part of our main bundle\nconst LazySection = React.lazy(() => import('./BaseSection'));\nconst Section = (\n <Suspense>\n <LazySection />\n </Suspense>\n);\n\xe2\x80\x8b\nexport default Section;\n\xe2\x80\x8b\n\xe2\x80\x8b\n// This code is split into its own chunk\nimport { OtherComponent } from './OtherComponent ';\nimport { NonReactStuff } from './NonReactStuff'; \n// NonReactStuff is included in main bundle. How can I split into a separate lazy loaded chunk \n// or part of the BaseSection chunk?\n\xe2\x80\x8b\nconst BaseSection = …Run Code Online (Sandbox Code Playgroud)
我有一个问题,了解Webpack splitChunks插件的行为.我正在研究的是将现有站点上的旧脚本重写为组件并使用Webpack进行捆绑.捆绑只是JS,大多数是在身体的末端加载.但是一个小脚本需要位于页面的标题中,因为它还会在标题和正文中创建很少的全局方法,主要用作内联脚本.由于它用于GA跟踪,它不会改变,事件必须尽快发送.
下面的配置工作适合我,但问题是,为什么它的工作原理只是这样?
确切的问题是在下面的代码中的注释,但我也把它放在这里:我不明白为什么有必要也包括!isUsedInAppHeader在common块的条件.如果没有!isUsedInAppHeader条件,则不会common.header创建块.然后,当我尝试通过为common.header块添加更高优先级来修复它时,它会导致脚本中的脚本异步初始化app.header.js.
异步行为是我根本不理解的,因为它从未发生过app.js.
实际上,我有另一个问题.是否可以导出一个同时立即初始化的公共块?或者你会提出另一个解决方案吗?标题中的脚本无法移动,也必须同步初始化,因为它的主要作用是为GA跟踪创建全局方法,这些方法必须立即用于以下代码中.
谢谢!
Webpack配置:
...
gulp.task('webpack', function(callback) {
var settings = {
...
entry: {
'app.header': './js/app.header.js',
'app': './js/app.js',
... // page specific files etc.
},
...
optimization: {
splitChunks: {
cacheGroups: {
// Node modules used in app.js
vendorsApp: {
test(module, chunks) {
let isInAppEntryPoint = chunks.map(chunk => chunk.name).includes('app');
let isNodeModule = /\/node_modules\//.test(upath.normalize(module.resource));
return isInAppEntryPoint && …Run Code Online (Sandbox Code Playgroud) webpack ×9
javascript ×3
reactjs ×3
webpack-4 ×3
chunks ×1
docker ×1
tree-shaking ×1
vue-cli ×1
vue.js ×1