webpack4下import()模塊按需加載,打包按需切割模塊,減少包體積,加快首頁請求速度


一:背景

因為項目功能越加越多,打包后的體積越來越大,導致首頁展示的時候速度比較慢,因為要等壓縮的js的包加載完畢。

首頁展示的時候只需要對應的js,並不需要全部的js模塊,所以這里就可以用按需加載,這里webpack4官方文檔提供了模塊按需切割加載,配合es6的按需加載import()方法,可以做到減少首頁包體積,加快首頁的請求速度,只有其他模塊,只有當需要的時候才會加載對應js。

這里參考一些資料:

webpack4官方文檔:https://webpack.docschina.org/api/module-methods/#import-

在這里插入圖片描述
VUE的懶加載:https://alexjover.com/blog/lazy-load-in-vue-using-webpack-s-code-splitting/
在這里插入圖片描述

二:開始demo

首頁先啟動一個普通的webpack4項目,可以用腳手架,不過需要自己配置一些webpack4特性,這里可以參考:webpack3 項目升級 webpack4

項目起來后,就可以用import實驗一番:
在這里插入圖片描述
這里我定義了三個界面(HelloWorld1,HelloWorld2,HelloWorld3),其中HelloWorld1用的impot()按需的方式,其他兩個都是直接import。

注意:這里的/* webpackChunkName: "h-w1" */
是webpack4中提供的注解,給切割模塊命名,如果不要這個注解的話切割出來的模塊js不能分辨是那個業務模塊的,所以一般都是一個業務模塊共用一個名稱。

代碼這樣加了之后,控制台可能會一些錯:
在這里插入圖片描述
這個錯的意思就是不能識別import()的這種寫法,因為還需要Babel的支持,網上查了下,需要babel-plugin-dynamic-import-node插件和配置.babelrc文件,那我們就配上:
在這里插入圖片描述
在這里插入圖片描述
配上這些過后,代碼確實沒有語法錯誤了,可以正常啟動訪問。

但是打包並沒有切割開代碼:
在這里插入圖片描述
這是打的包,並沒有看到我們定義的h-w1的包。

這里前前后試了幾個插件和配置都不行,語法還是抱錯,最后終於試出來了:
1,要么在升級eslint的版本,用5.14以后的;
在這里插入圖片描述

2,要么eslint可以用4.19的,但要加上acorn插件;
在這里插入圖片描述
這里上面兩種方法都可以解決問題,至於前面說的配置.babelrc文件可以還原了,那個加上反而打包沒效果了,小白我也不懂。。。。
在這里插入圖片描述
最好我們就可以運行:npm run build 看效果了,結果又抱錯了:
在這里插入圖片描述
從出錯信息來看,是UglifyJS不支持ES6的語法。理論上不應該啊…
於是Google之,發現uglifyjs-webpack-plugin 2.0版本的Release日志中,明確提示重新切換回到uglify-js,因為uglify-es被廢棄了,如果需要ES6代碼壓縮,請使用terser-webpack-plugin

解決

方法一:安裝並使用[terser-webpack-plugin]:
(參考:http://makeup1122.github.io/2018/10/12/webpack-UglifyJS-issue/)

方法二:降低UglifyJS版本

這里我選第二個,最方便,把uglifyjs-webpack-plugin 降到1.1.1版本:在這里插入圖片描述
再打包,終於成了,把HelloWorld1分離出來獨立包h-w1
在這里插入圖片描述
大家可以搜索下,h-w1包里面的代碼和app包里面的代碼是不是隔離的,也可以瀏覽器訪問這包,看看h-w1包的js是不是按需加載的,這里就不貼結果了,我自己測試都是准確的。

項目完整demo:https://github.com/BothEyes1993/webpack4_demo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM