webpack 中的异步块是啥?

Posted

技术标签:

【中文标题】webpack 中的异步块是啥?【英文标题】:What is an async chunk in webpack?webpack 中的异步块是什么? 【发布时间】:2018-11-16 17:43:48 【问题描述】:

这可能是一个愚蠢的问题,但是在阅读了split-chunks-plugin documentation 和this article about code splitting 之后,我仍然无法理解async 块指的是什么。

split-chunks-plugin documentation 声明了 chunks 属性:

[it] 表示将选择哪些块进行优化。如果提供了字符串,则可能的值为 all、async 和初始值。提供所有可能特别强大,因为这意味着即使在异步非异步块之间也可以共享块。

异步块和非异步块有什么区别?是否与dynamic imports 相关联?

例如:

if (myCondition) 
    import('myLib').then(myLib => 
        // Do something
    );

【问题讨论】:

【参考方案1】:

从webpack源代码中读取Chunk实体,我发现了以下代码:

getAllAsyncChunks() 
    const queue = new Set();
    const chunks = new Set();

    const initialChunks = intersect(
        Array.from(this.groupsIterable, g => new Set(g.chunks))
    );

    for (const chunkGroup of this.groupsIterable) 
        for (const child of chunkGroup.childrenIterable) 
            queue.add(child);
        
    

    for (const chunkGroup of queue) 
        for (const chunk of chunkGroup.chunks) 
            if (!initialChunks.has(chunk)) 
                chunks.add(chunk);
            
        
        for (const child of chunkGroup.childrenIterable) 
            queue.add(child);
        
    

    return chunks;

我在这里看到的是异步块是块组中最初不存在的块(if (!initialChunks.has(chunk)))。这让我认为异步块是之后加载的块,例如在运行时。

所以如果我做对了,前面的例子会产生一个异步块:

if (myCondition) 
    import('myLib').then(myLib => 
        // Do something
    );

热重载也可能是这种情况。希望有人能证实这一点。

编辑:

正如@dawncold 在评论中提到的那样,nice article 首先解释了什么是块。

【讨论】:

《Understanding chunks》有一部分,觉得对我有用,itnext.io/… 谢谢,好文章!

以上是关于webpack 中的异步块是啥?的主要内容,如果未能解决你的问题,请参考以下文章

webpack中的XX隐藏模块是啥意思

通过外部文件中的webpack.DefinePlugin设置变量 - 异步读取问题

Vue 异步导入与 Webpack

使用 webpack 导入 angularjs 的最佳实践是啥?

Webpack 开发服务器输出是啥意思?

webpack的优势