教程所示圖片使用的是 github 倉庫圖片,網速過慢的朋友請移步 《webpack4 系列教程(十二):處理第三方 JavaScript 庫》原文地址。或者來個人小站看更多內容: godbmw.com
本節課的代碼目錄以下:javascript
本節課的package.json
內容以下:html
{ "dependencies": { "jquery": "^3.3.1" }, "devDependencies": { "webpack": "^4.16.1" } }
JS
庫?項目作大以後,開發者會更多專一在業務邏輯上,其餘方面則盡力使用第三方JS
庫來實現。java
因爲js
變化實在太快,因此出現了多種引入和管理第三方庫的方法,經常使用的有 3 中:jquery
<script></script>
標籤引入便可js
文件:一些庫因爲歷史緣由,沒有提供es6
版本,須要手動下載,放入項目目錄中,再手動引入。針對第一種和第二種方法,各有優劣,有興趣能夠看這篇:《CDN 使用心得:加速雙刃劍》webpack
針對第三種方法,若是沒有webpack
,則須要手動引入import
或者require
來加載文件;可是,webpack
提供了alias
的配置,配合webpack.ProvidePlugin
這款插件,能夠跳過手動入,直接使用!git
如項目目錄圖片所展現的,咱們下載了jquery.min.js
,放到了項目中。同時,咱們也經過npm
安裝了jquery
。es6
爲了儘量模仿生產環境,app.js
中使用了$
來調用 jq,還使用了jQuery
來調用 jq。github
由於正式項目中,因爲須要的依賴過多,掛載到window
對象的庫,很容易發生命名衝突問題。此時,就須要重命名庫。例如:$
就被換成了jQuery
。web
// app.js $("div").addClass("new"); jQuery("div").addClass("old"); // 運行webpack後 // 瀏覽器打開 index.html, 查看 div 標籤的 class
webpack.ProvidePlugin
參數是鍵值對形式,鍵就是咱們項目中使用的變量名,值就是鍵所指向的庫。npm
webpack.ProvidePlugin
會先從npm
安裝的包中查找是否有符合的庫。
若是webpack
配置了resolve.alias
選項(理解成「別名」),那麼webpack.ProvidePlugin
就會順着這條鏈一直找下去。
// webpack.config.js const path = require("path"); const webpack = require("webpack"); module.exports = { entry: { app: "./src/app.js" }, output: { publicPath: __dirname + "/dist/", path: path.resolve(__dirname, "dist"), filename: "[name].bundle.js", chunkFilename: "[name].chunk.js" }, resolve: { alias: { jQuery$: path.resolve(__dirname, "src/vendor/jquery.min.js") } }, plugins: [ new webpack.ProvidePlugin({ $: "jquery", // npm jQuery: "jQuery" // 本地Js文件 }) ] };
老規矩,根絕上面配置,先編寫一下index.html
:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <div></div> <script src="./dist/app.bundle.js"></script> </body> </html>
命令行運行webpack
進行項目打包:
在 Chrome 中打開index.html
。以下圖所示,<div>
標籤已經被添加上了old
和new
兩個樣式類。證實在app.js
中使用的$
和jQuery
都成功指向了jquery
庫。