1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Webpack 的運行機制和核心工作原理

        共 1295字,需瀏覽 3分鐘

         ·

        2021-05-31 12:09

        我們來解讀一下 Webpack 的運行機制和核心工作原理。


        其實 Webpack 官網(wǎng)首屏的英雄區(qū)就已經(jīng)很清楚地描述了它的工作原理,如下圖所示:


         

        我們以一個普通的前端項目為例,項目中一般都會散落著各種各樣的代碼及資源文件,如下圖所示:



        比如 JS、CSS、圖片、字體等,這些文件在 Webpack 的思想中都屬于當前項目中的一個模塊。Webpack 可以通過打包,將它們最終聚集到一起。


        Webpack 在整個打包的過程中:


        • 通過 Loader 處理特殊類型資源的加載,例如加載樣式、圖片;

        • 通過 Plugin 實現(xiàn)各種自動化的構建任務,例如自動壓縮、自動發(fā)布。


        具體來看打包的過程。


        Webpack 啟動后,會根據(jù)我們的配置,找到項目中的某個指定文件(一般這個文件都會是一個 JS 文件)作為入口。


        然后順著入口文件中的代碼,根據(jù)代碼中出現(xiàn)的 import(ES Modules)或者是 require(CommonJS)之類的語句,解析推斷出來這個文件所依賴的資源模塊。


        接著再分別去解析每個資源模塊的依賴,周而復始,最后形成整個項目中所有用到的文件之間的依賴關系樹。下面這個動畫生動的演示了這個過程:



        有了這個依賴關系樹過后,Webpack 會遍歷(遞歸)這個依賴樹,找到每個節(jié)點對應的資源文件。


        然后根據(jù)配置選項中的 Loader 配置,交給對應的 Loader 去加載這個模塊。


        最后將加載的結果放入 bundle.js(打包結果)中,從而實現(xiàn)整個項目的打包。


        具體操作可以參考下面的動畫:

         


        對于依賴模塊中無法通過 JavaScript 代碼表示的資源模塊,例如圖片或字體文件,一般的 Loader 會將它們單獨作為資源文件拷貝到輸出目錄中,然后將這個資源文件所對應的訪問路徑作為這個模塊的導出成員暴露給外部。


        整個打包過程中,Loader 機制起了很重要的作用。因為如果沒有 Loader 的話,Webpack 就無法實現(xiàn)各種各樣類型的資源文件加載,那 Webpack 也就只能算是一個用來合并 JS 模塊代碼的工具了。


        至此,你就已經(jīng)了解到了 Webpack 的核心工作過程。


        至于插件機制,只是 Webpack 為了提供一個強大的擴展能力,它為整個工作過程的每個環(huán)節(jié)都預制了一個鉤子,它并不會影響 Webpack 的核心工作過程,也就是說我們可以通過插件往 Webpack 工作過程的任意環(huán)節(jié)植入一些自定義的任務,從而擴展 Webpack 打包功能以外的能力。

         

        推薦閱讀:

        前端為什么需要打包工具?

        前端工程化中的重要環(huán)節(jié)——自動化構建

        尤雨溪是個惡魔,Vite 三天 10 更

        前端工程化到底是什么?

        原理解析:如何實現(xiàn)自己的腳手架工具?

        如何使用 Webpack 實現(xiàn)模塊化打包?


        恭喜你又在前端道路上進步了一點點。

        點個“在看”和“”吧!

        瀏覽 61
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            囯产精品久久久久久久久久久久久久 | 做爱免费网站 | 涩漫天堂免费下 | 欧美福利视频一区二区 | 探花网站 | 娇妻4p被八个男人伺候 | 中文字幕乱码亚洲无线三区 | 两男一女h揉捏娇喘乳 | 在教室跟老师做爰好爽小说h | www.日批 |