本文的目的
拒絕全域性匯入jQuery!!
拒絕script匯入jQuery!!
找到一種只在當前js元件中引入jQuery,並且使用webpack切割打包的方案!
測試環境
以下測試在webpack3.8.1,jQuery3.2.1,react16+中進行
思路分析
如果說要我在react中全域性引入jQuery,我是十分感動,然後拒絕的。
但是,有時候可能react的一些庫不夠牛逼,還需要用到jQuery的相關外掛來輔助完成,這些外掛又和jQuery形成了依賴,最終,和我一樣,你也可能需要在react中匯入jQuery。
這個時候webpack就派上用場了,你也別百度了,網上的方案我試過很多,說句不好聽的,大部分都是樂色!
舉個例子,很多部落格說用下面這種方案,還有其他一堆亂七八糟的輔助方案。
new webpack.ProvidePlugin({
$: `jquery`,
jQuery: `jquery`,
`window.jQuery`: `jquery`,
`window.$`: `jquery`,
});
一開始的嘗試,我以為是成功的,因為$可以列印出來了啊!但是,當我列印jQuery的時候,報錯了!!
jQuery is not defined
接著,就是一個漫長的探索過程,我以為是CMD的鍋、我以為是AMD的鍋、我還以為是ES6的鍋、甚至我堅定的認為是webpack的鍋!!
最終答案
最終我發現就是webpack的鍋,幸好webpack提供了另外一種支援方案。
1、安裝expose-loader
npm install --save expose-loader
2、在webpack.config中加入下面這段loader程式碼
{
test: require.resolve(`jquery`),
use: [{
loader: `expose-loader`,
options: `jQuery`
},{
loader: `expose-loader`,
options: `$`
}]
}
3、下面該幹嘛?放心,你什麼都不用幹了,接著很輕鬆的在你的react元件中匯入jQuery
import React from `react`
require(`jquery`)
require(`jQuery第三方外掛`)
class Components extends React.Component {
constructor(props) {
super(props)
}
componentDidMount() {
$(document).ready(function() {
//做愛做的事情
})
}
}
4、這裡可能還存在一個小坑,就是很多jQuery第三方外掛的作者寫的程式碼不規範,我就遇到了一些變數沒有宣告的情況,在那些老程式設計師眼裡,js變數不宣告表示全域性變數,但在webpack眼裡,你不宣告就未定義了!如果你遇到jQuery外掛未定義的報錯,通常給這個變數加上var就行了!
5、最後,我自己寫的元件本身已經融入了非同步打包功能,所以當前包含jQuery的react元件不會汙染其他react元件,不會導致其他元件的體積變大,也不會導致公共js的體積變化,前提是你也實現了react元件的非同步載入功能。
6、關於webpack非同步打包元件的方案,請看我的其他文章!