最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 【得物技术】JS资源分包

    正文概述 掘金(得物技术)   2021-06-05   470

    背景

    在版本更新迭代、新代码上线后,如果用户需要重新从服务器加载全部资源(js、css),肯定会让页面打开变慢,这其实是没有必要的。

    为了优化用户体验,提高页面打开速度,可以将js拆分成多个模块,每次有更新,用户只需要加载更新了的业务代码即可,这就是分包。

    方案

    一般来说,前端项目不管框架是什么,大多是基于webpack打包的,比如umi、next、nuxt、vue-cli,所以本文只基于webpack打包工具给出方案。

    webpack4提供了 splitChunks 插件,就是用来做代码分割的,具体使用方法可以查看官方文档。

    比较普遍的分包策略是按照体积大小、共用率、更新频率重新划分我们的包,使其尽可能的利用浏览器缓存。

    根据这一策略给出通用的分包方案,将js拆分成以下三个模块:

    1. 第三方依赖(node_modules)
    2. UI库(antd、element-ui、cube-ui)
    3. 业务代码

    因此,每次发布代码之后通常需要更新的只有3、而1和2直接从浏览器缓存中读取即可。

    实施

    以phoenix项目为例,目前的线上页面打包后的情况如下图: 【得物技术】JS资源分包 通过分析工具看看各个模块是什么: 【得物技术】JS资源分包

    • umi.js:框架js
    • verdors.async.js:第三方依赖
    • layouts_index.async.js和p_discountDetail_index.async.js:业务代码
    • (忽略bundle.min.js,这是sentry脚本)

    在什么都不做的情况下umi其实已经默认分包了,这是因为其内置的webpack提供了默认分包策略:

    • 新的 chunk 是否被共享或者是来自 node_modules 的模块
    • 新的 chunk 体积在压缩之前是否大于 30kb
    • 按需加载 chunk 的并发请求数量小于等于 5 个
    • 页面初始加载时的并发请求数量小于等于 3 个

    使用上述方案对默认分包策略进行优化,将UI库提取出来,在配置文件(umirc.ts)中加入自定义分包代码:

    config.optimization.splitChunks({
      chunks: 'async',
      minSize: 30000,
      maxSize: 0,
      minChunks: 1,
      maxAsyncRequests: 5,
      maxInitialRequests: 3,
      automaticNameDelimiter: '~',
      name: true,
      cacheGroups: {
      	vendors: {
        	name: 'vendors',
          test: /[\\/]node_modules[\\/]/,
            priority: -10,
    		},
        antdesigns: {
          name: 'antdesigns',
          test: /[\\/]node_modules[\\/]antd-mobile[\\/]/,
          priority: -9,
    		}
      }
    })
    

    各个字段的表示的含义不再此赘述,可查看官方文档。主要看cacheGroups,把antd提取了出来。

    再来看下打包之后的效果: 【得物技术】JS资源分包

    【得物技术】JS资源分包 多了一个antdesigns.js,成功将antd提取出来。

    Q:其实这里可以思考一下,将antd提取到底合不合适?

    A:phoenix项目是个多页面应用,目前页面数量不多,而antd也支持按需引入,将antd代码打包进各个页面的业务代码或者node_modules中也不会增加多少体积,而antd代码体积并不大,单独提取出来后需要多一次http链接,感觉没有必要。不过随着以后项目体积变大,也就不一定了。所以各个项目还是要根据自身情况进行分包。

    结论

    分包是一个博弈的过程,是让 a bundle 大一点还是 b?

    是让首次加载快一点还是让 cache 的利用率高一点?

    但有一点要切记,拆包的时候不要过分的追求颗粒化,什么都单独的打成一个 bundle,不然你一个页面可能需要加载十几个js文件,如果你还不是HTTP/2的情况下,请求的阻塞还是很明显的(受限于浏览器并发请求数)。

    所以还是那句话资源的加载策略并没什么完全的方案,都需要根据项目自身情况进行分包。

    后续要做的

    分包之后的下一步就是充分使用浏览器缓存,首先需要把静态资源放到cdn上,再设置合理的缓存策略,只要chunk的hash没有改变,都从浏览器缓存读取。

    参考资料:panjiachen.github.io/awesome-boo…

    文/小辰

    关注得物技术,携手走向技术的云端


    起源地下载网 » 【得物技术】JS资源分包

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元