【问题标题】:webpack generating chunks for nested linkwebpack 为嵌套链接生成块
【发布时间】:2021-10-05 15:55:46
【问题描述】:

我正在使用 React.lazy 进行基于路由的代码拆分。在某些页面中,有指向其他页面的链接。在这种情况下,它也会为该链接页面创建块。

网络包

optimization: {
      runtimeChunk: 'single',
      splitChunks: {
        cacheGroups: {
          vendor: {
            test: new RegExp(
              /[\\/]node_modules[\\/]/,
            ),
            chunks: 'all',
            name: 'vendor',
            enforce: true,
          },
        },
      },
    },

Routes.js

const Home = React.lazy(() => import('./Pages/Home' /* webpackChunkName: "home" */));
const Profile = React.lazy(() => import('./Pages/Profile' /* webpackChunkName: "profile" */))
const Settings = React.lazy(() => import('./Pages/Settings' /* webpackChunkName: "Settings" */))


const Routes = () => {
    return (
        <Suspense fallback={<div>loading...</div>}>
            <Switch>
                <Route path="/" exact component={Home}/>
                <Route path="/Profile"  component={Profile}/>
                <Route path="/Settings"  component={Settings}/>
            </Switch>
        </Suspense>
    )
}

首页

export default function Home() {
    return (
        <div>
            <p>Home</p>
            <Link to="/profile">Go to Profile</Link>
            <Link to="/settings">Go to Settings</Link>
        </div>
    )
}

在这里我得到了下面的块 -

app.[hash].js
runtime.[hash].js
vendor.[hash].js
Home.[hash].js
Profile.[hash].js
Home~Profile.[hash].js
Home~Setting.[hash].js

得到最后两个块的原因是什么?

【问题讨论】:

    标签: javascript reactjs webpack


    【解决方案1】:

    您可以通过一些 webpack 包分析器检查这些块的内容,也可以查看里面的内容。很可能在两个页面之间存在一些类似的供应商包,因此从性能角度来看,最好将此包放在共享块中,而不是在每个块中复制这些包。

    【讨论】:

    • 感谢您的回答。但我的问题是为什么有两个额外的块 Home~Profile.[hash].js, Home~Setting.[hash].js?虽然 Home~Profile.[hash].js 和 Profile[hash].js 的内容是一样的
    • 回答你的问题为什么:因为 webpack 块优化。您的主页配置文件和设置页面有一些导入。其中一些进口是相同的。为了优化块大小,webpack 将一些导入从主页及其代码拆分到 Home.[hash].js 块,然后在主页和配置文件页面中使用的导入转到 Home-Profile.[hash].js 共享块。如果没有这样的优化,客户会在访问主页时下载这些共享导入两次,然后在访问个人资料页面时再次下载。
    • 有了这个优化,客户端在访问主页时下载 Home.[hash].js + Home-Profile.[hash].js 块,然后访问 Profile 只需要小的 Profile.[hash].js
    • 明白你的意思。不管怎样,有没有从 webpack 配置中禁用它?
    • 问题是你为什么要这样做?你讨厌你的用户?只是开玩笑 :) 这应该是避免这种优化的一个非常具体的原因。根据文档webpack.js.org/guides/code-splitting,没有这样的选项。可能你可以为每个页面使用一个新的入口点,但这真的取决于你为什么需要这个
    猜你喜欢
    • 2014-02-13
    • 2016-09-17
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多