一:背景
因為項目功能越加越多,打包后的體積越來越大,導致首頁展示的時候速度比較慢,因為要等壓縮的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是不是按需加載的,這里就不貼結果了,我自己測試都是准確的。