webpack4 系列教程(十二):處理第三方JavaScript庫(kù)

專注前端與算法的系列干貨分享,歡迎關(guān)注(???):
「微信公眾號(hào):心譚博客」| xin-tan.com | GitHub

0. 課程介紹和資料

本節(jié)課的代碼目錄如下:

image

本節(jié)課的package.json內(nèi)容如下:

{
  "dependencies": {
    "jquery": "^3.3.1"
  },
  "devDependencies": {
    "webpack": "^4.16.1"
  }
}

1. 如何使用和管理第三方JS庫(kù)?

項(xiàng)目做大之后,開(kāi)發(fā)者會(huì)更多專注在業(yè)務(wù)邏輯上,其他方面則盡力使用第三方JS庫(kù)來(lái)實(shí)現(xiàn)。

由于js變化實(shí)在太快,所以出現(xiàn)了多種引入和管理第三方庫(kù)的方法,常用的有 3 中:

  1. CDN:<script></script>標(biāo)簽引入即可
  2. npm 包管理: 目前最常用和最推薦的方法
  3. 本地js文件:一些庫(kù)由于歷史原因,沒(méi)有提供es6版本,需要手動(dòng)下載,放入項(xiàng)目目錄中,再手動(dòng)引入。

針對(duì)第一種和第二種方法,各有優(yōu)劣,有興趣可以看這篇:《CDN 使用心得:加速雙刃劍》

針對(duì)第三種方法,如果沒(méi)有webpack,則需要手動(dòng)引入import或者require來(lái)加載文件;但是,webpack提供了alias的配置,配合webpack.ProvidePlugin這款插件,可以跳過(guò)手動(dòng)入,直接使用!

2. 編寫入口文件

如項(xiàng)目目錄圖片所展示的,我們下載了jquery.min.js,放到了項(xiàng)目中。同時(shí),我們也通過(guò)npm安裝了jquery

為了盡可能模仿生產(chǎn)環(huán)境,app.js中使用了$來(lái)調(diào)用 jq,還使用了jQuery來(lái)調(diào)用 jq。

因?yàn)檎巾?xiàng)目中,由于需要的依賴過(guò)多,掛載到window對(duì)象的庫(kù),很容易發(fā)生命名沖突問(wèn)題。此時(shí),就需要重命名庫(kù)。例如:$就被換成了jQuery。

// app.js
$("div").addClass("new");

jQuery("div").addClass("old");

// 運(yùn)行webpack后
// 瀏覽器打開(kāi) index.html, 查看 div 標(biāo)簽的 class

3. 編寫配置文件

webpack.ProvidePlugin參數(shù)是鍵值對(duì)形式,鍵就是我們項(xiàng)目中使用的變量名,值就是鍵所指向的庫(kù)。

webpack.ProvidePlugin會(huì)先從npm安裝的包中查找是否有符合的庫(kù)。

如果webpack配置了resolve.alias選項(xiàng)(理解成“別名”),那么webpack.ProvidePlugin就會(huì)順著這條鏈一直找下去。

// 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文件
    })
  ]
};

4. 結(jié)果分析和驗(yàn)證

老規(guī)矩,根絕上面配置,先編寫一下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>

命令行運(yùn)行webpack進(jìn)行項(xiàng)目打包:

image

在 Chrome 中打開(kāi)index.html。如下圖所示,<div>標(biāo)簽已經(jīng)被添加上了oldnew兩個(gè)樣式類。證明在app.js中使用的$jQuery都成功指向了jquery庫(kù)。

image

專注前端與算法的系列干貨分享,歡迎關(guān)注(???)


image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 Webpack 1.1 概念簡(jiǎn)介 1.1.1 WebPack是什么 1、一個(gè)打包工具 2、一個(gè)模塊加載工具 3...
    Kevin_Junbaozi閱讀 7,046評(píng)論 0 16
  • 目錄第1章 webpack簡(jiǎn)介 11.1 webpack是什么? 11.2 官網(wǎng)地址 21.3 為什么使用 web...
    lemonzoey閱讀 1,841評(píng)論 0 1
  • GitChat技術(shù)雜談 前言 本文較長(zhǎng),為了節(jié)省你的閱讀時(shí)間,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,918評(píng)論 7 110
  • 文/月明紅紅 我在深深地懷念,懷念記憶中給了我無(wú)私幫助的朋友,我要祝福那些愛(ài)過(guò)我的人。 在20歲之前,秋云的世界是...
    月明紅紅閱讀 1,163評(píng)論 13 42
  • 今天晚上我和媽媽回家的時(shí)候看見(jiàn)了一棟很大很大的樓,他不是樓是一個(gè)小隧道,上面有一個(gè)小房子,小房子里面有一...
    段林濤0942閱讀 337評(píng)論 1 0

友情鏈接更多精彩內(nèi)容