webpack摸爬滾打(一)

整理自官網(wǎng)指南

版本:webpack 4.*

安裝

npm install --save-dev webpack
npm install --save-dev webpack-cli

起步(基本構(gòu)建過程)

新建工程
npm install webpack webpack-cli --save-dev
npm init -y
webpack前

  • index.html
<!doctype html>
<html>
  <head>
    <title>起步</title>
    <script src="https://unpkg.com/lodash@4.16.6"></script>
  </head>
  <body>
    <script src="./src/index.js"></script>
  </body>
</html>
  • src/index.js
function component() {
  var element = document.createElement('div');

  // Lodash(目前通過一個 script 腳本引入)對于執(zhí)行這一行是必需的
  element.innerHTML = _.join(['Hello', 'webpack'], ' ');

  return element;
}

document.body.appendChild(component());
  • 缺點
    • 無法立即體現(xiàn),腳本的執(zhí)行依賴于外部擴(kuò)展庫(external library)垫蛆。
    • 如果依賴不存在承冰,或者引入順序錯誤亭引,應(yīng)用程序?qū)o法正常運(yùn)行断箫。
    • 如果依賴被引入但是并沒有使用,瀏覽器將被迫下載無用代碼藕畔。

使用webpack構(gòu)建

  • npm install --save lodash
  • webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  }
};
  • src/index.js
 import _ from 'lodash';
...

index.js 顯式要求引入的 lodash 必須存在,然后將它綁定為 _(沒有全局作用域污染)莫其。通過聲明模塊所需的依賴,webpack 能夠利用這些信息去構(gòu)建依賴圖耸三,然后使用圖生成一個優(yōu)化過的乱陡,會以正確順序執(zhí)行的 bundle。

  • 目錄結(jié)構(gòu)
webpack-demo
  |- package.json
+ |- webpack.config.js
  |- /dist
    |- index.html
  |- /src
    |- index.js

將“源”代碼(/src)從我們的“分發(fā)”代碼(/dist)中分離出來仪壮『┑撸“源”代碼是用于書寫和編輯的代碼』“分發(fā)”代碼是構(gòu)建過程產(chǎn)生的代碼最小化和優(yōu)化后的“輸出”目錄爽彤,最終將在瀏覽器中加載

管理資源

webpack ,將動態(tài)打包(dynamically bundle)所有依賴項(創(chuàng)建所謂的依賴圖(dependency graph))乏沸。這是極好的創(chuàng)舉淫茵,因為現(xiàn)在每個模塊都可以_明確表述它自身的依賴爪瓜,我們將避免打包未使用的模塊蹬跃。

除了 JavaScript,還可以通過 loader 引入任何其他類型的文件

加載CSS

npm install --save-dev style-loader css-loader
webpack.config.js

  const path = require('path');

  module.exports = {
    entry: './src/index.js',
    output: {
      filename: 'bundle.js',
      path: path.resolve(__dirname, 'dist')
    },
+   module: {
+     rules: [
+       {
+         test: /\.css$/,
+         use: [
+           'style-loader',
+           'css-loader'
+         ]
+       }
+     ]
+   }
  };

在項目中添加一個新的 style.css 文件,并將其導(dǎo)入到我們的 index.js
src/index.js

  import _ from 'lodash';
+ import './style.css';

  function component() {
    var element = document.createElement('div');

    // lodash 是由當(dāng)前 script 腳本 import 導(dǎo)入進(jìn)來的
    element.innerHTML = _.join(['Hello', 'webpack'], ' ');
+   element.classList.add('hello');

    return element;
  }

  document.body.appendChild(component());

npm run build

以這種方式加載資源蝶缀,可以以更直觀的方式將模塊和資源組合丹喻。無需依賴于含有全部資源的 /assets 目錄,而是將資源與代碼組合在一起翁都。例如碍论,類似這樣的結(jié)構(gòu)會非常有用:

- |- /assets
+ |– /components
+ |  |– /my-component
+ |  |  |– index.jsx
+ |  |  |– index.css
+ |  |  |– icon.svg
+ |  |  |– img.png

這種配置方式會使你的代碼更具備可移植性

管理輸出

增加一個js文件print.js

  • 目錄結(jié)構(gòu)
webpack-demo
  |- package.json
  |- webpack.config.js
  |- /dist
  |- /src
    |- index.js
+   |- print.js
  |- /node_modules
  • src/print.js
export default function printMe() {
  console.log('I get called from print.js!');
}
  • src/index.js
  import _ from 'lodash';
+ import printMe from './print.js';

  function component() {
    var element = document.createElement('div');
+   var btn = document.createElement('button');

    element.innerHTML = _.join(['Hello', 'webpack'], ' ');

+   btn.innerHTML = 'Click me and check the console!';
+   btn.onclick = printMe;
+
+   element.appendChild(btn);

    return element;
  }

  document.body.appendChild(component());
  • dist/index.html
<!doctype html>
  <html>
    <head>
-     <title>Asset Management</title>
+     <title>Output Management</title>
+     <script src="./print.bundle.js"></script>
    </head>
    <body>
-     <script src="./bundle.js"></script>
+     <script src="./app.bundle.js"></script>
    </body>
  </html>
  • webpack.config.js
 const path = require('path');

  module.exports = {
-   entry: './src/index.js',
+   entry: {
+     app: './src/index.js',
+     print: './src/print.js'
+   },
    output: {
-     filename: 'bundle.js',
+     filename: '[name].bundle.js',
      path: path.resolve(__dirname, 'dist')
    }
  };

到目前為止,我們在 index.html 文件中手動引入所有資源柄慰,然而隨著應(yīng)用程序增長鳍悠,并且一旦開始對文件名使用哈希(hash)]并輸出多個 bundle,手動地對 index.html 文件進(jìn)行管理坐搔,一切就會變得困難起來藏研。然而,可以通過一些插件概行,會使這個過程更容易操控蠢挡。

HtmlWebpackPlugin
  • npm install --save-dev html-webpack-plugin
  • webpack.config.js
const path = require('path');
+ const HtmlWebpackPlugin = require('html-webpack-plugin');

  module.exports = {
    entry: {
      app: './src/index.js',
      print: './src/print.js'
    },
+   plugins: [
+     new HtmlWebpackPlugin({
+       title: 'Output Management'
+     })
+   ],
    output: {
      filename: '[name].bundle.js',
      path: path.resolve(__dirname, 'dist')
    }
  };

HtmlWebpackPlugin 還是會默認(rèn)生成 index.html 文件。這就是說凳忙,它會用新生成的 index.html 文件业踏,把我們的原來的替換, 所有的 bundle 會自動添加到 html 中。

clean-webpack-plugin:清理 /dist 文件夾

通常涧卵,在每次構(gòu)建前清理 /dist 文件夾勤家,是比較推薦的做法,因此只會生成用到的文件

  • npm install clean-webpack-plugin --save-dev
  • webpack.config.js
  const path = require('path');
  const HtmlWebpackPlugin = require('html-webpack-plugin');
+ const CleanWebpackPlugin = require('clean-webpack-plugin');

  module.exports = {
    entry: {
      app: './src/index.js',
      print: './src/print.js'
    },
    plugins: [
+     new CleanWebpackPlugin(['dist']),
      new HtmlWebpackPlugin({
        title: 'Output Management'
      })
    ],
    output: {
      filename: '[name].bundle.js',
      path: path.resolve(__dirname, 'dist')
    }
  };
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柳恐,一起剝皮案震驚了整個濱河市却紧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胎撤,老刑警劉巖晓殊,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伤提,居然都是意外死亡巫俺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門肿男,熙熙樓的掌柜王于貴愁眉苦臉地迎上來介汹,“玉大人,你說我怎么就攤上這事舶沛∴诔校” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵如庭,是天一觀的道長叹卷。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么骤竹? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任帝牡,我火速辦了婚禮,結(jié)果婚禮上蒙揣,老公的妹妹穿的比我還像新娘靶溜。我一直安慰自己,他們只是感情好懒震,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布罩息。 她就那樣靜靜地躺著,像睡著了一般个扰。 火紅的嫁衣襯著肌膚如雪扣汪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天锨匆,我揣著相機(jī)與錄音崭别,去河邊找鬼。 笑死恐锣,一個胖子當(dāng)著我的面吹牛茅主,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播土榴,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼诀姚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了玷禽?” 一聲冷哼從身側(cè)響起赫段,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矢赁,沒想到半個月后糯笙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡撩银,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年给涕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片额获。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡够庙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抄邀,到底是詐尸還是另有隱情耘眨,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布境肾,位于F島的核電站剔难,受9級特大地震影響胆屿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钥飞,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衫嵌。 院中可真熱鬧读宙,春花似錦、人聲如沸楔绞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酒朵。三九已至桦锄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔫耽,已是汗流浹背结耀。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留匙铡,地道東北人图甜。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像鳖眼,于是被迫代替她去往敵國和親黑毅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1 Webpack 1.1 概念簡介 1.1.1 WebPack是什么 1钦讳、一個打包工具 2矿瘦、一個模塊加載工具 3...
    Kevin_Junbaozi閱讀 6,673評論 0 16
  • 版權(quán)聲明:本文為博主原創(chuàng)文章琼开,未經(jīng)博主允許不得轉(zhuǎn)載病游。 webpack介紹和使用 一、webpack介紹 1稠通、由來 ...
    it筱竹閱讀 11,139評論 0 21
  • 目錄第1章 webpack簡介 11.1 webpack是什么衬衬? 11.2 官網(wǎng)地址 21.3 為什么使用 web...
    lemonzoey閱讀 1,737評論 0 1
  • webpack 介紹 webpack 是什么 為什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert閱讀 6,470評論 2 71
  • 愛一個人滋尉,我們往往容易營造幻覺,用各種理由情景去匹配他【她】的行為飞主,好讓自己一廂情愿地認(rèn)定這個人一定是愛自己...
    簍南閱讀 1,555評論 2 3