現代化前端的全局引入是一個頗有趣的東西。 先來看下如下幾個場景:前端
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次的圖先來感覺一下:bash
// 語法
new webpack.ProvidePlugin({
identifier: 'module1',
// identifier: ['module1', 'property1'],
});
複製代碼
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。ide
// 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,僅僅是調用其方法。ui
假設在a.js中。 刪除單獨的lodash引入 _ :import _ from 'lodash' 直接使用$_
:$_.uniqBy(...)
不會。 這是我本身對比使用ProvidePlugin前和使用ProvidePlugin後打包文件體積大小得出的結論。 至於具體緣由還有待探索。
這些注意事項其實主要是爲了加強代碼可讀性和可維護性。
看到這裏,文章開頭Vue.prototype.xxx
和import和require重複引入的問題」有沒有更加優雅的實現方式?「就迎刃而解啦。
快到你的項目中試試ProvidePlugin吧~