現代化前端的全局引入是一個頗有趣的東西。
先來看下如下幾個場景:前端
resolve: { alias: { '@': path.join(__dirname, '..', 'src') }}
。Vue.prototype.$_ = lodash
,在應用了vue的應用上下文中,能夠經過this.$_得到對lodash的引用。來思考一個問題:vue
若是咱們再Vue.prototype上綁定了太多,太大的第三方庫,會不會致使root vue過大? 答案是確定的。 有沒有辦法解決這個問題? 你可能會說,我不用this.xxx。用到的vue單文件組件直接import或者require就行了。 若是數以百計,數以千計甚至是數以萬計的.vue文件中用到了呢?一直引入嗎? 能夠一直引入。可是會形成沒必要要的工做量。
有沒有更加優雅的解決辦法?webpack
再來思考一個問題:web
若是我要在一個webpack打包覆蓋的地方的xxx.js文件中用到lodash,該怎麼作? 一般來說,咱們會直接`import _ from' lodash'`或者`const _ = require('lodash')`。 若是和.vue同樣,有不少不少js文件須要引入呢?一直引入嗎? 能夠一直引入。一樣會形成沒必要要的工做量。
有沒有更加優雅的實現方式?vuex
看一張一直引入moment,引了99次的圖先來感覺一下:ide
雖然個人項目中是在優化moment的引入,可是爲了直觀明瞭,我將以引入lodash爲例。函數
思考優化
// 語法 new webpack.ProvidePlugin({ identifier: 'module1', // identifier: ['module1', 'property1'], });
module.exportsui
new webpack.ProvidePlugin({ $_: 'lodash', });
new webpack.ProvidePlugin({ $_uniqBy: ['lodash','uniqBy'] });
new webpack.ProvidePlugin({ Vue: ['vue/dist/vue.esm.js', 'default'] });
加入咱們有a~z,a.js到z.js總結26個js文件,每一個文件都須要引入lodash。this
// a.js import $_ from 'lodash'; // b.js import $_ from 'lodash'; // c.js import $_ from 'lodash'; // d.js import $_ from 'lodash'; // e.js import $_ from 'lodash'; // f.js import $_ from 'lodash'; ... // z.js import $_ from 'lodash';
這樣作有如下幾個弊端
好比說下面這種場景,對於代碼可讀性是很很差的。
// a.js import $_ from 'lodash'; // b.js import _ from 'lodash';
// webpack.base.config.js plugins: [ new webpack.ProvidePlugin({ $_: 'lodash', }), ],
// .eslintrc.js globals: { $_: 'readonly', // 或者true },
配置爲readonly是由於咱們不會改寫lodash,僅僅是調用其方法。
假設在a.js中。
刪除單獨的lodash引入 :import from 'lodash'
直接使用$_ :$_.uniqBy(...)
不會。
這是我本身對比使用ProvidePlugin前和使用ProvidePlugin後打包文件體積大小得出的結論。
至於具體緣由還有待探索。
這些注意事項其實主要是爲了加強代碼可讀性和可維護性。
看到這裏,文章開頭Vue.prototype.xxx
和import和require重複引入的問題」有沒有更加優雅的實現方式?「就迎刃而解啦。
快到你的項目中試試ProvidePlugin吧~