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,看這篇就夠了【超詳細】

        共 3355字,需瀏覽 7分鐘

         ·

        2020-12-06 12:34

        關(guān)注公眾號?前端人,回復“加群

        添加無廣告優(yōu)質(zhì)學習群


        摘要:Webpack是一種前端資源構(gòu)建工具,一個靜態(tài)模塊打包器。

        1. 摘要

        Webpack是一種前端資源構(gòu)建工具,一個靜態(tài)模塊打包器。在Webpack看來,前端的所有資源文件(js/json/css/img/less/…)都會作為模塊處理,當Webpack處理應用程序時,它將根據(jù)模塊的依賴關(guān)系進行靜態(tài)分析,打包生成對應的靜態(tài)資源。Webpack打包流程

        Webpack打包流程圖

        2. Webpack五個核心概念

        2.1 Entry

        入口(Entry)指示W(wǎng)ebpack以哪個文件作為入口起點分析構(gòu)建內(nèi)部依賴圖并進行打包。

        2.2 Output

        輸出(Output)指示W(wǎng)ebpack打包后的資源bundles輸出到哪里去,以及如何命名。

        2.3 Loader

        Loader讓Webpack能夠去處理那些非JavaScript語言的文件,Webpack本身只能理解JavaScript。

        2.4 Plugins

        插件(Plugins)可以用于執(zhí)行范圍更廣的任務,插件的范圍包括從打包和壓縮,一直到重新定義環(huán)境中的變量等。

        2.5 Mode

        模式(Mode)指示W(wǎng)ebpack使用相應模式的配置。

        分為development和production兩種模式,下面分別進行簡述。

        development:

        開發(fā)模式,能讓代碼本地運行的環(huán)境,會將process.env.NODE_ENV的值設(shè)為development,同時啟用NamedChunksPlugin和NamedModulesPlugin插件;

        production:

        生產(chǎn)模式,能讓代碼優(yōu)化運行的環(huán)境,會將process.env.NODE_ENV的值設(shè)為production,同時啟用FlagDependencyUsagePlugin、FlagIncludedChunksPlugin、ModuleConcatenationPlugin、NoEmitreplaceStringsPlugin、OccurrenceOrderPlugin、SideEffectsFlagPlugin和UglifyJsPlugin插件。

        3. Wbepack配置

        3.1 webpack.config.js文件

        webpack.config.js是webpack的配置文件,用來指示webpack工作,運行webpack指令時,會加載里面的配置,所有構(gòu)建工具都是基于nodejs平臺運行的,默認采用commonjs模塊化。

        webpack.config.js基礎(chǔ)配置如圖

        3.2 devServer配置

        開發(fā)服務器(devServer)用來實現(xiàn)自動化(自動編譯、自動打開瀏覽器、自動刷新瀏覽器),只會在內(nèi)存中編譯打包,不會有任何文件輸出,本地安裝webpack-dev-server后,通過npx webpack-dev-server命令啟動devServer

        devServer配置核心代碼

        3.3 打包html/樣式/圖片/其它資源

        打包不同的資源會使用不同的loader和插件,打包html/樣式/圖片/其它資源的流程如下所述。

        3.3.1 打包html資源

        1.下載html-webpack-plugin插件;

        2.引入html-webpack-plugin插件;

        3.使用html-webpack-plugin插件,并進行相應配置。

        3.3.2 打包樣式資源

        不同的樣式文件需要配置不同的loader

        1.下載loader;

        2.配置loader,css樣式文件使用css-loader和style-loader,less文件使用less-loader、css-loader和style-loader。

        其中css-loader的作用是將css文件變成commonjs模塊加載到js文件中,style-loader的作用是創(chuàng)建style標簽,將js中的樣式資源插入進去,添加到head中生效。

        3.3.3 打包圖片資源

        1.下載url-loader,file-loader

        2.配置loader

        3.3.4 打包其它資源

        1.下載file-loader

        2.配置loader,配置該loader作用于不為html/css/less/js的其他文件

        3.4 提取css成單獨文件/css兼容性處理/壓縮css

        3.4.1 提取css成單獨文件 樣式文件打包后會默認和js文件一起輸出,可以通過插件將打包后的css文件單獨輸出,流程如下所述。

        1.下載mini-css-extract-plugin插件

        2.引用該插件

        3.配置

        3.4.2 css兼容性處理

        1.下載postcss-loader和postcss-preset-env

        2.在package.json中browsetslist屬性中分別對開發(fā)環(huán)境和生產(chǎn)環(huán)境進行兼容性配置,設(shè)置支持樣式的瀏覽器版本

        3.通過postcss找到package.json中browserslist里面的配置,通過配置加載指定的css兼容性樣式。

        3.4.3 壓縮css

        1.下載optimize-css-assets-webpack-plugin插件

        2.引用該插件

        3.使用該插件

        4.js語法檢查eslint/js兼容性處理/js壓縮

        3.5.1 js語法檢查eslint

        1.下載eslint-loader和eslint

        2.在package.json中的eslintConfig中進行配置

        3.配置eslint-loader,其中只需檢測js文件并要排除第三方庫,只檢測自己寫的源代碼,同時可在options配置中設(shè)置fix:true,自動修復eslint的錯誤。

        3.5.2 js兼容性處理

        1.下載babel-loader、@babel/core、@babel/preset-env,通過@babel/preset-env做基本的js兼容性處理,然后通過corejs做前面無法實現(xiàn)的兼容性處理,并實現(xiàn)按需加載

        2. 配置loader

        js兼容性處理核心代碼如圖3-3所示

        3.5.3 js壓縮

        mode設(shè)置為production生產(chǎn)環(huán)境時會自動壓縮js代碼。

        4. webpack性能優(yōu)化

        可以從開發(fā)環(huán)境和生產(chǎn)環(huán)境分別對webpack進行性能優(yōu)化。其中開發(fā)環(huán)境主要考慮從打包構(gòu)建速度和代碼調(diào)試兩個方面進行優(yōu)化,生產(chǎn)環(huán)境主要考慮從打包構(gòu)建速度和代碼運行性能這兩個方面進行優(yōu)化。下面簡單介紹下開發(fā)環(huán)境上通過HMR提升構(gòu)建速度。

        4.1 HMR

        HMR(熱模塊替換),作用是一個模塊發(fā)生變化后,只會更新打包這一個模塊而不是所有模塊,通過在devServer中設(shè)置hot:true屬性啟動HMR功能。

        其中對于樣式文件,可以使用HMR功能,因為style-loader內(nèi)部實現(xiàn)了;

        對于js文件,默認不能使用HMR功能

        解決方法:

        修改入口文件js代碼,添加支持HMR功能的代碼,另外HMR只能處理非入口js文件的其他文件,對入口文件并不能生效,因為一旦入口文件更新,入口文件引入的其他文件一定會被重新加載;

        對于html文件,默認不能使用HMR功能,同時會導致html文件不能熱更新,解決方法:修改entry入口文件,將html文件引入,只能解決html文件不能熱更新的問題。

        js文件支持HMR功能的核心代碼如圖4-1所示。

        圖4-1 js文件支持HMR功能核心代碼

        4.2 HMR效果

        在入口index.js文件中引入print.js文件,運行npx webpack-devserver后,頁面如圖4-2所示。

        4-2 初始頁面

        修改print.js文件后,只會重新加載print.js文件,而不會重新加載index.js文件,HMR效果如圖4-3所示。


        原文:bbs.huaweicloud.com


        1.如果看到這里,說明你喜歡這篇文章,請?轉(zhuǎn)發(fā)、點贊、在看

        2.關(guān)注公眾號前端人,回復資料包領(lǐng)取我整理的前端進階資料包

        3.回復加群,加入前端進階群,和小伙伴一起學習討論!

        瀏覽 53
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        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>
            久久高清一区二区 | 大鸡吧操逼网 | 国产无遮挡裸体免费视频在线观看 | 激情影院一区二区三区 | 国产综合视频在线观看 | 天天操天天操天天操天天操 | 少妇玉梅抽搐呻吟 | 国内爆初菊对白视频 | 2022夜夜操 | 性爱网五月天 |