Skip to content

Latest commit

 

History

History
63 lines (37 loc) · 2.49 KB

chunks.md

File metadata and controls

63 lines (37 loc) · 2.49 KB

webpack之代码拆分

  • chunk vs bundle vs module

    • chunk webpack特有的,用于管理打包的过程(代码合并和分割),分包成多个chunk,一个chunk里面可以包含多个module。

    • bundle 就是打包到一个文件中的相关代码,通过情况下,chunk会直接输入对应的bundle,当然不是所有的配置都会产生这一对一的关系。

    • module js模块,所有静态资源都可以成为module,一切皆模块,一个模块对应一个文件。

  • hash

    在 webpack 中提供了两种方式,hash 和 chunkhash。不推荐在开发环境使用hash,增加编译时间。

    • hash:在 webpack 一次构建中会产生一个 compilation 对象,该 hash 值是对 compilation 内所有的内容计算(MD5摘要算法)而来的,

    • chunkhash: 每一个chunk 都根据自身的内容计算而来, 可以保证在chunk没有变化的时候hash不变,文件不需要更新,chunk变了后,可保证hash唯一,由于hash太长,这里截取了hash的5个字符。

    /* webpack.config.js */
    module.exports = {
        entry: {
            app: 'app.js',
            vendor: ['react', 'react-dom']
        },
        output: {
            chunkFilename: '[name].[chunkhash:5].chunk.js',
        }
    }

    备注:hash 的默认长度为 20 个字符,可通过 output.hashDigestLength 全局配置,或使用 [hash:16] 方式配置,还可以通过 output.hashDigest 配置何时生成 hash。

  • 不稳定的chunkhash

    Chunk 的生成还涉及到依赖解析和模块 ID 分配,这是无法稳定实质上没有变化的 chunk 文件的 chunkhash 变动问题的本源。

  • 模块ID

    模块的 ID 是 webpack 根据依赖的收集顺序递增的正整数。

  • webpack runtime

    runtime 包含 chunks ID 及其对应 chunkhash 的对象。runtime其他主要功能:

    • 全局 webpackJsonp 方法:模块读取函数,用来区分模块是否加载,并调用 webpack_require 函数;

    • 私有 webpack_require 方法:模块初始化执行函数,并给执行过的模块做标记;

    • 异步 chunk 加载函数(用 script 标签异步加载),加载的 chunk 内容均被 webpackJsonp 包裹的,script 加载成功会直接执行。这个函数还包含了所有生成的 chunks 的路径。

合理划分公用模块

  • 根据更新频率

    • 库和工具 - libs

    • 定制 UI 库和工具 - vendor

    • 业务模块 - entries

    • 低频库/工具/代码 - 分割为 chunk