webpack拆包策略实践

按需加载使用import('xxx')

一般情况下路由都采取懒加载的方式

单独拆出框架依赖(如react+reactDom)vendor包

package注意固定依赖版本,然后cdn进行强缓存,这样首次访问后浏览器就会缓存下来,框架包是不会变的,就算业务代码改动也不会变,因为这是第三方依赖。如果这些第三方框架包打进index vendor里,这样业务代码改了index的hash变了,浏览器还要重新加载这部分框架代码。

设置webpack的externals

externals: {
      react: 'React',
      'react-dom': 'ReactDOM',
},

单独打出runtime包

runtime用作映射其他chunk文件,结合script-ext-html-webpack-plugin插件可将runtime文件内联进html文件,减少请求。

html-webpack-plugin模板

<html>
<head>
    <!-- 框架代码单独抽离 -->
    <script src="preact.umd.js"></script>
</head>
<body>
<div id="app"></div>
<!-- runtime的js代码体积小内联到html,减少请求,其他的通过http请求 -->
<% for (var jsPath of htmlWebpackPlugin.files.js) { %>
    <% if(/runtime~.+\.js$/.test(jsPath)) { %>
        <script>
            <%= compilation.assets[jsPath].source() %>
        </script>
    <% } else { %>
        <script src="<%= jsPath %>"></script>
    <% } %>
<% } %>
</body>
</html>

使用tree shaking

注意使用esm模块模式导入包,不然做不了tree shaking

css单独抽取出来

使用css-extract插件把css单独抽取出来