webpacak5 代码分离

代码分离. 这一章的目的在于重用以及基本的缓存

首先第一部分在于提出公用的,比如都是 loadsh 是公用的部分。

如果正常发布的话,index.jsanother-module.js. 都会打包 loadsh.

index.js

import _ from 'lodash';

console.log(_.join(['index','loaded'], ' '));

another-module.js

import _ from 'lodash';

console.log(_.join(['Another', 'module', 'loaded!'], ' '));

01 代码分离的方法 主动选择分享哪些模块

entry: {
           index: {
              import: './src/index.js',
              dependOn: 'shared',
            },
            another: {
              import: './src/another-module.js',
              dependOn: 'shared',
            },
            shared: 'lodash'
}

shared 关键字可以例举出公共的模块。
在具体的路径中 dependOn 选择 shared.

就可以选择哪些依赖。shared 也可以是数组。
我想到另一种可能,我有多种 shared 模式有多种可能,于是我测试了一下。

entry: {
        index: {
            import: './src/index.js',
            dependOn: 'shared',
        },
        another: {
            import: './src/another-module.js',
            dependOn: ['shared', 'shared1'],
        },
        shared: 'lodash',
        shared1: 'moment'
}

这样也可以。

这样相对来说比较灵活。

只是文档中有一句我实在是不明白

如果我们要在一个 HTML 页面上使用多个入口时,还需设置 optimization.runtimeChunk: 'single',否则还会遇到这里所述的麻烦。

我查看了这个链接以后,理解了问题的意思。

就是不同的入口应该是重新实例化对象,来解决文章中文问题。

但是为什么加 optimization.runtimeChunk: 'single' 就能解决,我查了下含义

optimization.runtimeChunk 具体作用是什么?

其实就是解决缓存问题的,虽然我还没有做过实验,所以这里我并没有理解。

02 代码分离的方法 自动分离公共模块

回到最初的入口方式

    entry: {
      index: './src/index.js',
      another: './src/another-module.js',
    },

但是有办法能够自动分离,而不用选择

optimization: {
        splitChunks: {
            chunks: 'all'
        }
    }

就能自动将公共的模块分离出来,我查了下 splitChunks

SplitChunksPlugin

    splitChunks: {
      chunks: 'async',
      minSize: 20000,
      minRemainingSize: 0,
      minChunks: 1,
      maxAsyncRequests: 30,
      maxInitialRequests: 30,
      enforceSizeThreshold: 50000,
      cacheGroups: {
        defaultVendors: {
          test: /[\\/]node_modules[\\/]/,
          priority: -10,
          reuseExistingChunk: true,
        },
        default: {
          minChunks: 2,
          priority: -20,
          reuseExistingChunk: true,
        },
      },
    },
  },

我开始会担心,提取成一个公共 chunk 是否会太大,这些属性证明我想多了。

代码分离这件事,主要还是优化速度。你经常改变的是业务逻辑,公共组件其实很少变,提取出来,最大化利用浏览器缓存。

大概是这样子,具体属性可以等用到了再研究。

03 dynamic import

动态导入这个东西队伍贫乏的 webpack 知识,以前似乎也有类似的方法,能够实现动态加载和拆分模块,使用 jsonp 去动态加载,只是语法似乎和这个不太一样。

说起来也简单,首先我引入 moment , 然后写个方法动态加载。

dynamic.js

export default async () => {
    let { default: m } = await import("moment");
    let timeString = m().format('MMMM Do YYYY, h:mm:ss.SSS a');
    console.log("-----dynamicImport in test------");
    console.log(timeString);
    return timeString;
}

然后外部引用后,直接编译。

图片.png

moment 会有两个,一个语言包一个程序,一般正常是一个。

原理可以看这里 深入了解 webpack 模块加载原理

就是 jsonp 加载。

那么这时候还有另外一种用法,就是写在按钮事件里或者其他延时加载的方法。

   dynamicImportBtn.innerHTML = 'dynamic import btn';
   dynamicImportBtn.onclick = async () => {
        let { default: m } = await import("moment");
        let timeString = m().format('MMMM Do YYYY, h:mm:ss.SSS a');
        console.log("-----dynamicImport in test------");
        console.log(timeString);
    }
    element.append(dynamicImportBtn);

果然在点击按钮以后,才会加载对应 js.

04. 预加载

prefetch(预获取):将来某些导航下可能需要的资源
preload(预加载):当前导航下可能需要资源

<link rel="prefetch" as="script" href="http://127.0.0.1:5500/dist/762.bundle.js">
<link rel="prefetch" as="script" href="http://127.0.0.1:5500/dist/700.bundle.js">
<link rel="prefetch" as="script" href="http://127.0.0.1:5500/dist/762.bundle.js">
<link rel="prefetch" as="script" href="http://127.0.0.1:5500/dist/700.bundle.js">

在代码中的应用就是, 你提前加入这一段注释,告诉 webpack 你需要对这段代码执行什么策略

let { default: m } = await import(/* webpackPreload: true */ "moment");

最后会在html中生成, 但是需要注意的点是,前提你是通过 webpack 来生成 html

开始我以为这个是 webpck 通过 js 实现的,原来是 html 标准。

可以参考这两篇文章

https://www.webhek.com/post/link-prefetch.html
https://www.cnblogs.com/cangqinglang/p/11308243.html

总结来说就是

preload 并行下载
prefetch 闲时下载

自己估算好使用场景,选择预加载以及预加载的顺序

这里我不过多研究以及测试,后续需要用到之后在进行学习了测试

05. end

这一章主要还是为了教会我们如何使用 webpack 对代码进行分割。

给出了几种方式

  1. 提取公共代码,将公共代码单独提取,以便减小体积,也充分利用浏览器缓存。
  2. 拆分代码,不同逻辑的代码进行拆分,达到同样的效果
  3. 预加载,不管是图片也好,模块也好。预加载达到优化速度的请求

最后文中给出了几种分析包的方式,插件。

后续有机会实验一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • 1 如何区分开发环境 目前我们所有的webpack配置信息都是放到一个配置文件中的:webpack.config....
    AShuiCoder阅读 499评论 0 0
  • 前端性能优化一直是个大话题,今天我们从资源处理、资源拉取、渲染三个方面来聊一下这个话题。 一、资源处理 1、合并 ...
    子木话阅读 1,007评论 0 1
  • 前端性能优化的七大手段,记个笔记 前面的话 本文将详细介绍前端性能优化的七大手段,包括减少请求数量、减小资源大小、...
    S_Kingtz阅读 591评论 0 0
  • 减少请求数量 【合并】如果不进行文件合并,HTTP请求次数增多,受丢包影响更严重,但是,文件合并后也会带来首屏渲染...
    小小的开发人员阅读 629评论 0 0
  • 一、什么是Webpack? 作为其核心,webpack是一个静态模块捆绑器。在特定项目中,webpack将所有文件...
    Ella_Eric阅读 307评论 0 0