.25-淺析webpack源碼之事件流compilation(3)

来源:https://www.cnblogs.com/QH-Jimmy/archive/2018/01/08/8243650.html
-Advertisement-
Play Games

這一節跑下一批plugin。 希望不要跟上一節一樣,全是plugin。 流程如圖(看看流程圖就行了,後面也沒有什麼內容): EnsureChunkConditionsPlugin 這個看看就懂,不解釋了。 RemoveParentModulesPlugin 難道又是另一批plugin麽…… Remo ...


  這一節跑下一批plugin。

compiler.apply(
    new EnsureChunkConditionsPlugin(),
    new RemoveParentModulesPlugin(),
    new RemoveEmptyChunksPlugin(),
    new MergeDuplicateChunksPlugin(),
    new FlagIncludedChunksPlugin(),
    new OccurrenceOrderPlugin(true),
    new FlagDependencyExportsPlugin(),
    new FlagDependencyUsagePlugin()
);

  希望不要跟上一節一樣,全是plugin。

  流程如圖(看看流程圖就行了,後面也沒有什麼內容):

 

 

EnsureChunkConditionsPlugin

class EnsureChunkConditionsPlugin {
    apply(compiler) {
        compiler.plugin("compilation", (compilation) => {
            const triesMap = new Map();
            compilation.plugin(["optimize-chunks-basic", "optimize-extracted-chunks-basic"], (chunks) => { /**/ });
        });
    }
}

  這個看看就懂,不解釋了。

 

RemoveParentModulesPlugin

class RemoveParentModulesPlugin {
    apply(compiler) {
        compiler.plugin("compilation", (compilation) => {
            compilation.plugin(["optimize-chunks-basic", "optimize-extracted-chunks-basic"], (chunks) => { /**/ });
        });
    }
}

  難道又是另一批plugin麽……

 

RemoveEmptyChunksPlugin

class RemoveEmptyChunksPlugin {
    apply(compiler) {
        compiler.plugin("compilation", (compilation) => {
            compilation.plugin(["optimize-chunks-basic", "optimize-extracted-chunks-basic"], (chunks) => { /**/ });
        });
    }
}

  是的。

 

MergeDuplicateChunksPlugin

class MergeDuplicateChunksPlugin {
    apply(compiler) {
        compiler.plugin("compilation", (compilation) => {
            compilation.plugin("optimize-chunks-basic", (chunks) => { /**/ });
        });
    }
}

 

FlagIncludedChunksPlugin

class FlagIncludedChunksPlugin {
    apply(compiler) {
        compiler.plugin("compilation", (compilation) => {
            compilation.plugin("optimize-chunk-ids", (chunks) => { /**/ });
        });
    }
}

 

OccurrenceOrderPlugin

class OccurrenceOrderPlugin {
    // true
    constructor(preferEntry) {
        if (preferEntry !== undefined && typeof preferEntry !== "boolean") {
            throw new Error("Argument should be a boolean.\nFor more info on this plugin, see https://webpack.js.org/plugins/");
        }
        this.preferEntry = preferEntry;
    }
    apply(compiler) {
        const preferEntry = this.preferEntry;
        compiler.plugin("compilation", (compilation) => {
            compilation.plugin("optimize-module-order", (modules) => { /**/ });
            compilation.plugin("optimize-chunk-order", (chunks) => { /**/ });
        });
    }
}

  看到那個錯誤提示就想笑,這個插件除了你自己誰會去調用啊。

 

FlagDependencyExportsPlugin

class FlagDependencyExportsPlugin {
    apply(compiler) {
        compiler.plugin("compilation", (compilation) => {
            compilation.plugin("finish-modules", (modules) => { /**/ });

            function addToSet(a, b) { /**/ }
        });
    }
}

 

FlagDependencyUsagePlugin

class FlagDependencyUsagePlugin {
    apply(compiler) {
        compiler.plugin("compilation", compilation => {
            compilation.plugin("optimize-modules-advanced", modules => { /**/ });

            function addToSet(a, b) { /**/ }

            function isSubset(biggerSet, subset) { /**/ }
        });
    }
}

  總的來說,這一批plugin是針對模塊的,不過仍然沒有任何實際行為。

 

  還剩下3個也一併過了吧。

TemplatedPathPlugin

class TemplatedPathPlugin {
    apply(compiler) {
        compiler.plugin("compilation", compilation => {
            const mainTemplate = compilation.mainTemplate;
            mainTemplate.plugin("asset-path", replacePathVariables);
            mainTemplate.plugin("global-hash", function(chunk, paths) { /**/ });
            mainTemplate.plugin("hash-for-chunk", function(hash, chunk) { /**/ });
        });
    }
}

 

RecordIdsPlugin

class RecordIdsPlugin {
    apply(compiler) {
        compiler.plugin("compilation", compilation => {
            compilation.plugin("record-modules", (modules, records) => { /**/ });
            compilation.plugin("revive-modules", (modules, records) => { /**/ });

            function getDepBlockIdent(chunk, block) { /**/ }
            compilation.plugin("record-chunks", (chunks, records) => { /**/ });
            compilation.plugin("revive-chunks", (chunks, records) => { /**/ });
        });
    }
}

 

WarnCaseSensitiveModulesPlugin

class WarnCaseSensitiveModulesPlugin {
    apply(compiler) {
        compiler.plugin("compilation", compilation => {
            compilation.plugin("seal", () => { /**/ });
        });
    }
}

 

  這裡把所有compilation事件流觸發完後,也只是針對不同的階段再次進行plugin,所以詳細過程還需要繼續跑流程。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Runtime 前言 從字面意思看,就是運行時。但是這個運行時究竟什麼意思?可以把它理解成:不是在編譯期也不是在鏈接期,而是在運行時。那究竟在運行期間做了什麼呢?按照蘋果官方的說法,就是把一些決策(方法的調用,類的添加等)推遲,推遲到運行期間。只要有可能,程式就可以動態的完成任務,而不是我們在編譯期 ...
  • 1,Instruments iOS自帶的自動化測試工具。 2,TuneupJs 最早的iOS自動化測試工具 https://github.com/alexvollmer/tuneup_js 3,ynm3k 在UI控制項遍歷方面有比較大的優勢 https://github.com/douban/ynm3 ...
  • 第一次寫博客,想著就從頭來吧,希望幫助到需要的人。 HTML超文本標記語言(Hyper text markup language),“超文本”就是指頁面內可以包含圖片、鏈接,甚至音樂、程式等非文字元素;標記語言指語言具有可讀性,什麼是可讀性呢?比如在html裡面的table指表格、p(pragrap ...
  • 這個世界需要一個特定的惡人,可以供人們指名道姓,千夫所指:“全都怪你”。 ——村上春樹《當我談跑步時我談些什麼》 本文為讀 lodash 源碼的第六篇,後續文章會更新到這個倉庫中,歡迎 star: "pocket lodash" gitbook也會同步倉庫的更新,gitbook地址: "pocket ...
  • 1. screen 1.1 availHeight/Width screen.availWidth返回瀏覽器視窗可占用的水平寬度(單位:像素)。 screen.availHeight返回瀏覽器視窗在屏幕上可占用的垂直空間,即最大高度。 1.2 availLeft/Top availTop:瀏覽器視窗 ...
  • 自己打造一把趁手的武器,高效率完成前端業務代碼。 前言 作為戰鬥在業務一線的前端,要想少加班,就要想辦法提高工作效率。這裡提一個小點,我們在業務開發過程中,經常會重覆用到日期格式化、url參數轉對象、瀏覽器類型判斷、節流函數等一類函數,這些工具類函數,基本上在每個項目都會用到,為避免不同項目多次複製 ...
  • 昨天看到這篇文章[置頂]開源組件NanUI一周年 - 使用HTML/CSS/JS來構建.Net Winform應用程式界面 就想弄一個winform結合html5的一個小東西,突有興緻,想在裡面嵌套一個微信網頁版。 好了,想法一齣來,就行動吧,最終效果如下圖: 一開始就打算在頁面裡面嵌套一個ifra ...
  • Javascript函數 Javascript函數是由事件驅動的或者當他被調用時執行的可重覆使用的代碼塊。所以說我們光創建了函數不調用是沒有啥用的,我們必須得調用它才能執行。 1.什麼是函數 (1)函數是完成某一功能的代碼段 (2)函數是可重覆執行的代碼段 (3)函數方便維護和管理 2.創建函數時我 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...