插件導(dǎo)致ECharts被全量引入的坑示例解析
正文
ECharts作為一個圖標(biāo)庫已經(jīng)被大家廣泛使用,它提供了各式各樣的圖表類型,但是在我們?nèi)粘J褂弥锌赡苤粫玫狡渲械哪硯讉€圖表類型,常用的基本就是柱狀圖,條線圖,及中國地圖插件用來表示全國各地的數(shù)據(jù)這些,所以在我們使用echarts的時候首先需要考慮的是按需引入,避免把整個庫都打包進(jìn)去,echarts的整個打包體積還是相當(dāng)可觀的??。
以下僅針對 echarts@v4 版本
按需引入的問題
以下是正常的按需引入echarts的一些圖標(biāo)組件,我們從echarts/lib
下面按需引入我們需要的圖標(biāo),對于lib下的組件沒有任何問題:
import echarts from 'echarts/lib/echarts' import 'echarts/lib/chart/line' import 'echarts/lib/chart/pie' import 'echarts/lib/chart/bar' import 'echarts/lib/chart/map' import 'echarts/lib/chart/scatter' import 'echarts/lib/component/tooltip' // ...
接下來我們再看下當(dāng)我們需要用中國地圖的時候:
import 'echarts/map/js/china.js'
問題分析
我們只需像上面一樣直接引入china.js
即可使用中國地圖,看起來似乎使用上也沒啥問題,那我們就用webpack-bundle-analyzer
來看下打包出來的實際情況:
從圖中我們可以看到,有2處地方都出現(xiàn)了echarts,這和我們的預(yù)期完全不符,我們希望的是echarts/lib
下通用的直接打到vendor.js
里去,然后在某個頁面里面我們用到了china map這個只跟著路由異步加載進(jìn)來(如上圖右側(cè)紫色區(qū)域),但是異步加載的js里也出現(xiàn)了完整的echarts庫,明顯跟vendor.js里重復(fù)了,這就??了,我們明明只引入了china.js,為啥會整個引入,還被重復(fù)引入到了2個文件里。
這個時候我們就從china.js
入手,看看這個文件里面到底干了什么事情:
我們進(jìn)入china.js里面,仔細(xì)觀察會發(fā)現(xiàn)上圖中第26行,直接require('echarts')
了整個庫,這就相當(dāng)于我們應(yīng)用代碼再怎么按需引入,只要你用了china插件,整個echarts還是被全量引入了進(jìn)來,然后上面webpack-bundle-analyzer
圖在多處出現(xiàn)的原因我們就可以推出是因為我們引用代碼跟china.js里引入的路徑不一樣從而導(dǎo)致了chunk那個js被重復(fù)引入了echarts完整庫:
// 應(yīng)用代碼只映入了核心庫 import echarts from 'echarts/lib/echarts' // china.js require了整個echarts require('echarts')
解決方案
OK,通過上面分析我們已經(jīng)發(fā)現(xiàn)問題所在,那么我們可以有哪些辦法來解決這樣的問題呢(讓echarts官方去改這個問題似乎不是很現(xiàn)實??),以下例舉了幾種常用的潛在解決方案,大家可根據(jù)自己項目的實際情況使用(有更好辦法的大佬們可在評論里指出??):
- webpack的
alias
,對于直接引入echarts
的地方,替換成echarts/lib/echarts
,但是這樣可能會對其他地方全量引入用到的圖表,但是你又沒有手動按需引入相應(yīng)的圖表就可能報錯了 - 通過
webpack.NormalModuleReplacementPlugin
插件或者alias
直接替換echarts/map/js/china.js
的引用,換成自己的一個文件,文件可以copychina.js
,然后把require('echarts')
換掉,見下面一點 - copy
registerMap
方法內(nèi)容,直接引用自己的這個文件??:
優(yōu)化后我們再用webpack-bundle-analyzer
看下打包情況,可以發(fā)現(xiàn)只剩下一個vendor里的echarts了,符合我們的預(yù)期:
以上就是使用echarts插件時發(fā)現(xiàn)的一些引入問題,大家在使用第三方庫的時候,特別是一些大的庫時還是多留意下打包出來的結(jié)果是不是跟預(yù)期是一樣的,很有可能一個小的引入寫法默默地導(dǎo)致了整個庫都被引入了??。
更多關(guān)于插件全量引入ECharts坑的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
微信小程序 數(shù)組中的push與concat的區(qū)別
這篇文章主要介紹了微信小程序 數(shù)組中的push與concat的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-01-01javascript實現(xiàn)字典Dictionary示例基礎(chǔ)
這篇文章主要為大家介紹了javascript實現(xiàn)字典Dictionary基礎(chǔ)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08微信小程序 出現(xiàn)錯誤:{"baseresponse":{"errcode":-80002,"errmsg":""}}解決
這篇文章主要介紹了微信小程序 出現(xiàn)錯誤:{"baseresponse":{"errcode":-80002,"errmsg":""}}解決辦法的相關(guān)資料,需要的朋友可以參考下2017-02-02微信小程序技巧之show內(nèi)容展示,上傳文件編碼問題
這篇文章主要介紹了微信小程序技巧之show內(nèi)容展示,上傳文件編碼問題,具有一定的參考價值,有興趣的可以了解一下。2017-01-01微信小程序 POST請求(網(wǎng)絡(luò)請求)詳解及實例代碼
這篇文章主要介紹了微信小程序 POST請求(網(wǎng)絡(luò)請求)詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11