學webpack 3石抡,看這篇文就夠了

此文檔使用webpack版本為 3.4.1搅轿,在你自行測試中,可能輸出結果與文檔中所貼出內容不一致熬北,請以你自己的代碼為準

安裝

本地安裝

npm install --save-dev webpacknpm install --save-dev webpack@[version]

全局安裝

npm install -g webpack

不推薦使用全局方式安裝疙描,將會影響項目中所使用的webpack版本

起步

使用CLI(命令行)

創(chuàng)建一個目錄,并初始化package.json

mkdir webpack-test && cd webpack-test
npm init
npm install --save-dev webpack

構建基本目錄及文件( / 代表目錄)

webpack-test
    -- /dist
        -- index.html
    -- package.json
    -- /src
        -- index.js

編輯index.js文件

function fun(){
    document.write("Hello Webpack");
}
fun();

編輯index.html文件

<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta charset="UTF-8">
    </head>
    <body>
    
    </body>
    <script src='bundle.js' charset='utf-8'></script>
</html>

在終端(工作目錄為當前項目目錄)讶隐,輸入webpack src/index.js dist/bundle.js起胰,并回車。

在你的終端應該會出現(xiàn)以下類似內容:(內容也許會有差異)

λ webpack src/index.js dist/bundle.js
Hash: 0f97cc36123f295c9fd2
Version: webpack 3.4.1
Time: 260ms
    Asset     Size  Chunks             Chunk Names
bundle.js  36.9 kB       0  [emitted]  main
   [0] ./src/index.js 84 bytes {0} [built]
   [1] multi ./src/index.js ./src/index.js ./dist/bundle.js 52 bytes {0} [built]
   [2] ./src/index.css 1.08 kB {0} [built]
   [3] ./node_modules/_css-loader@0.28.4@css-loader!./src/index.css 237 bytes {0} [built]
   [7] ./dist/bundle.js 18.4 kB {0} [built]
    + 3 hidden modules

運行index.html巫延,可以看到頁面中的Hello Webpack待错。

使用配置文件

創(chuàng)建webpack.config.js文件

module.exports = {
    entry : "./src/index.js",
    output : {
        filename : "bundle.js",
        path : __dirname+"/dist"
    }
};

在終端輸入webpack --config webpack.config.js 或者直接輸入webpack,并回車

 webpack --config webpack.config.js
Hash: e2e4b7042538facd73f0
Version: webpack 3.4.1
Time: 216ms
    Asset     Size  Chunks             Chunk Names
bundle.js  18.4 kB       0  [emitted]  main
   [0] ./src/index.js 84 bytes {0} [built]
   [1] ./src/index.css 1.08 kB {0} [built]
   [2] ./node_modules/_css-loader@0.28.4@css-loader!./src/index.css 237 bytes {0} [built]
    + 3 hidden modules

使用npm

修改package.json文件中

{
...
"scripts": {
    "build": "webpack"
 },
...
}

在終端運行npm run build

使用source map

跟蹤代碼錯誤

修改webpack.config.js

//...省略
module.exports = {
    devtool : "inline-source-map",
    //...省略
}

修改index.js文件烈评,故意生成一個錯誤

import "./index.css";
import wicon from "./webpack.png";
function fun(){
    console.log(a);
   //...省略
}

重新構建火俄,刷新頁面,在控制臺可以看到如下錯誤

Uncaught ReferenceError: a is not defined
    at fun (index.js:4)
    at Object.<anonymous> (index.js:10)
    at __webpack_require__ (bootstrap 403852e…:19)
    at module.exports (bootstrap 403852e…:62)
    at bootstrap 403852e…:62

可以看到讲冠,錯誤信息及錯誤所在文件和行數(shù)

開發(fā)模式

  • 觀察模式

    在終端輸入 webpack -wwebpack --watch

    會發(fā)現(xiàn)執(zhí)行構建后瓜客,并沒有退出命令,此時正處理觀察模式

    可以在package.json的scripts配置項中增加如下內容

    "scripts": {
        "watch" : "webpack --watch"
      },
    

    終端運行npm run watch 也能得到相同的效果

    ?

  • webpack-dev-server 即時刷新

    安裝

    npm install --save-dev webpack-dev-server

    修改webpack.config.js

    devServer : {
      contentBase : "./dist"
    }
    

    在終端輸入 webpack-dev-server 或 在package.json的scripts配置項中增加如下內容并使用npm run dev:

    "scripts": {
        "watch": "webpack --watch",
        "dev": "webpack-dev-server --open"
      },
    

    會發(fā)現(xiàn)會自動打開瀏覽器竿开,當有任意一個源文件被修改時谱仪,會自動重新刷新頁面

    ?

    **熱加載模式 **

    修改webpack.config.js

    const webpack = require("webpack");
    //...省略
    plugins : [
      new webpack.HotModuleReplacementPlugin()
    ],
      //...省略
    

    ?

    修改package.json的scripts配置項

    "scripts": {
        "watch": "webpack --watch",
        "dev": "webpack-dev-server --open --hot"
      }
    

    即可開啟hmr模式。即允許在運行時更新各模塊否彩,而無需進行完全刷新

loader

CSS

style-loader css-loader

css-loader用于將css文件做為模塊處理疯攒,可以使用import 導入

style-loader 將所有處理完成的樣式插入到頁面的head中

安裝

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"]
        }]
    }
};

在src目錄下建立index.css文件

body{
    font-size : 50px;
    color : red;
}

修改index.js文件

import "./index.css";
//...省略

在終端執(zhí)行npm run build,刷新頁面

less | sass

less-loader sass-loader

npm install --save-dev less less-loader

圖片

file-loader

安裝

npm install --save-dev file-loader

修改webpack.config.js文件

//...省略
module : {
  rules : [{
    test : /\.css$/,
    use : ["style-loader","css-loader"]
  },{
    test : /\.(png|jpg|gif|jpeg)$/,
    use : ["file-loader"]
  }]
}
//...省略

修改index.css文件

.box{
    width: 497px;
    height:270px;
    background: url(./webpack.png)
}

修改index.html文件

<body>
   <div class="box"></div>
</body>

找一張你喜愛的照片拷貝至src目錄下列荔,終端運行npm run build敬尺, 刷新頁面

繼續(xù)

修改index.js文件

import "./index.css";
import wicon from "./webpack.png";
function fun(){
    document.write("Hello Webpack");
    let img = new Image();
    img.src = wicon;
    document.body.appendChild(img);
}
fun();

重新執(zhí)行構建,刷新頁面贴浙,你可以看到兩張圖片

JSON數(shù)據(jù)

JSON數(shù)據(jù)的加載是內置的砂吞,可以通過 import mdata from './data.json', 即可正常使用

ES6 | JSX

babel-loader

安裝 由于babel是幾個模塊包,對于解析不同的語言需要安裝不同的包

常用的有如下:

cnpm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react

  • babel-core babel的核心包
  • babel-loader bable的Loader
  • babel-preset-es2015 轉換ES代碼
  • babel-preset-react 轉換JSX代碼

在src目錄新增other.js

export default function say(){
    console.log("hello!!!");
}

修改index.js

import say from "./other.js";
function fun(){
    say();
   //...省略
}

修改webpack.config.js

modules : {
  //...省略
  rules : [
    //...省略
    {
    test : /\.js$/,
      use : [{
        loader : "babel-loader",
        options : {
          presets : ["es2015"]
        }
      }]
  }]
}
//...省略

重新構建崎溃,觀察控制臺

多文件入口

在src目錄增加home.js

function fun(){
    console.log("home is output");
}
fun();

修改index.html文件

<!DOCTYPE html>
<html lang="en">
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
        <div class="box"></div>
    </body>
    <script src='./app.bundle.js' charset='utf-8'></script>
    <script src='./home.bundle.js' charset='utf-8'></script>
</html>

修改webpack.config.js

//...省略
entry: {
  app : "./src/index.js",
  home : "./src/home.js"
},
  output: {
    filename: "[name].bundle.js",
      path: __dirname + "/dist"
  },
//...省略

重新執(zhí)行構建蜻直,并刷新頁面,觀察控制臺

問題:如果修改webpack.config.js中第7行filename一行所輸出的文件名稱,重新構建概而,會發(fā)現(xiàn)在dist目錄會新增新名稱的文件呼巷,但index.html文件中依然引用的是舊的名字,如何解決赎瑰?(參見 插件 htmlwebpackplugin)

插件

HtmlWebpackPlugin

自動生成頁面

安裝

npm install --save-dev html-webpack-plugin

修改webpack.config.js

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
    entry: {
        //...省略
    },
    output: {
        //...省略
    },
    plugins : [
        new HtmlWebpackPlugin()
    ],
    module: {
        //...省略
    }
};

重新執(zhí)行構建王悍,并刷新頁面。

觀察dist目錄下的index.html乡范,發(fā)現(xiàn)在測試file-loader時,創(chuàng)建div不見了啤咽,上述插件為我們創(chuàng)建一個新的html文件晋辆,并自動將output項所指定的filename引入到了頁面中

clean-webpack-plugin

清理dist目錄

安裝

npm install --save-dev clean-webpack-plugin --save-dev

修改webpack.config.js

const CleanWebpackPlugin = require("clean-webpack-plugin");
//...省略
plugins : [
  new HtmlWebpackPlugin(),
  new CleanWebpackPlugin(["dist"])
],
//...省略

重新執(zhí)行構建,dist目錄清靜了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末宇整,一起剝皮案震驚了整個濱河市瓶佳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳞青,老刑警劉巖霸饲,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異臂拓,居然都是意外死亡厚脉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門胶惰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傻工,“玉大人,你說我怎么就攤上這事孵滞≈欣Γ” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵坊饶,是天一觀的道長泄伪。 經常有香客問我,道長匿级,這世上最難降的妖魔是什么蟋滴? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮痘绎,結果婚禮上脓杉,老公的妹妹穿的比我還像新娘。我一直安慰自己简逮,他們只是感情好球散,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著散庶,像睡著了一般蕉堰。 火紅的嫁衣襯著肌膚如雪凌净。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天屋讶,我揣著相機與錄音冰寻,去河邊找鬼。 笑死皿渗,一個胖子當著我的面吹牛斩芭,可吹牛的內容都是我干的。 我是一名探鬼主播乐疆,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼划乖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挤土?” 一聲冷哼從身側響起琴庵,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仰美,沒想到半個月后迷殿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡咖杂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年庆寺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诉字。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡止邮,死狀恐怖,靈堂內的尸體忽然破棺而出奏窑,到底是詐尸還是另有隱情导披,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布埃唯,位于F島的核電站撩匕,受9級特大地震影響,放射性物質發(fā)生泄漏墨叛。R本人自食惡果不足惜止毕,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漠趁。 院中可真熱鬧扁凛,春花似錦、人聲如沸闯传。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至字币,卻和暖如春则披,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洗出。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工士复, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翩活。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓阱洪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親菠镇。 傳聞我的和親對象是個殘疾皇子冗荸,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容

  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺,特此分享以備自己日后查看辟犀,也希望更多的人看到...
    小小字符閱讀 8,147評論 7 35
  • 作者:小 boy (滬江前端開發(fā)工程師)本文原創(chuàng)堂竟,轉載請注明作者及出處。原文地址:https://www.smas...
    iKcamp閱讀 2,747評論 0 18
  • webpack 介紹 webpack 是什么 為什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert閱讀 6,458評論 2 71
  • 小的時候都長個頭去了所以沒煩惱長大之后都長心眼去了所以看不透
    木卯丁閱讀 169評論 0 2
  • 年少氣盛時像鳥玻佩,無所牽絆飛向遠方出嘹,探索心中夢想; 稍為年長時像樹咬崔,不斷在一處扎根税稼,三尺講臺就是直播舞臺; 慢慢老去...
    慕青映雪閱讀 887評論 0 4