webpack 打包配置 從0到1

認識webpack

1111.png

webpack 是一個用于現(xiàn)代 JavaScript 應(yīng)用程序的 靜態(tài)模塊打包工具中文官方地址
1.可以幫助我們進行模塊化碰纬,并且處理模塊化間的各種復(fù)雜依賴關(guān)系逆瑞,所以可以使用任意前端模塊規(guī)范 AMD CMD CommonJs ,ES6
2.打包過程中可以對資源文件進行撤離损俭,壓縮圖片削葱,less轉(zhuǎn)換css 等
3.通過各種loade的使用料滥,可以吧css 圖片等當做模塊來使用
4.webpack為了能正常運行咆繁,必須依賴node環(huán)境下載node讳推,查看node版本號:node -v
node 環(huán)境為了可以正常的執(zhí)行代碼,必須包含各種依賴的包玩般,所以自帶npm工具 軟件包管理工具(node packages manager)

安裝webpack

全局安裝webpack
npm install webpack -g 

指定版本號全局安裝webpack
npm install webpack@版本號 -g 

局部安裝webpack(開發(fā)環(huán)境)
1.cd 對應(yīng)目錄
2.npm install webpack --save-dev

區(qū)分全局和局部银觅,主要是為了有些時候 版本號不同的情況下打包出來的文件也不同
1.在終端(cmd終端或者vscode的terminal等)直接執(zhí)行webpack命令,使用的是全局安裝的webpack
2.在package.json文件中scripts 腳本中坏为,如果使用了webpack命令究驴,首先會找局部webpack,找不到才會找全局匀伏。

配置webpack

1.npm init 洒忧,初始化生成 package.json文件
2.創(chuàng)建webpack.config.js文件
3.設(shè)置入口文件和出口文件
4.webpack 和package.json 的腳本(scripts)綁定使用-》npm run xx 打包運行

const path = require("path");
module.exports = {
  //入口文件
  entry: "./src/main.js",
  //出口文件
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bundle.js",
  },
};

package.json scripts腳本模塊
"scripts": {
    "build": "webpack"
  },

終端直接運行:npm run build
即可打包以main.js為入口的相互引用的各種js,css等文件,
合并生成dist目錄下的bundle.js
目錄結(jié)構(gòu)

2222.png

main.js文件


//使用commonJs的模塊化規(guī)范
const { add, mul } = require("./js/MathUtil");
console.log("hello");
console.log(add(1, 2));
console.log(mul(1, 2));

//使用es6的模塊化規(guī)范
import { name, age, address } from "./js/useInfo";
console.log(name);
console.log(age);
console.log(address);

//把css 文件當成 模塊導入
require("./style/main.css");

//依賴less文件
require("./style/normal.less");

webpack中l(wèi)oader的使用

loader 官方地址
webpack本身的能力來說够颠,可以處理我們寫的js代碼熙侍,并且會自動處理js之間相關(guān)的依賴,但是開發(fā)中不僅僅有基本的js代碼處理,還需要加載css蛉抓,圖片牢硅,包括將less scss等轉(zhuǎn)換為css,.vue文件轉(zhuǎn)成js文件等
對于webpack本身的能力來說芝雪,轉(zhuǎn)化這些是不支持的减余,所以就需要給webpack進行擴展,也就是loader
loader 主要是用于轉(zhuǎn)換某些類型的模塊惩系,是一個轉(zhuǎn)換器位岔。
使用過程
1.通過npm安裝需要使用的loader
2.在webpack.config.js 中module->rules關(guān)鍵字下進行配置

最常用的loader:

1. 樣式loader

less-loader
1.創(chuàng)建.less 文件

@width: 10px;

body {
 font-size: @width;
 color: yellow;
}

2.安裝 sass-loader:

npm install sass-loader sass webpack --save-dev

3.webpack.config.js 配置rulues

const path = require("path");
module.exports = {
  //入口文件
  entry: "./src/main.js",
  //出口文件
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bundle.js",
  },
  module: {
    rules: [
      {
        test: /\.css$/i,
        //css-loader 只負責講css文件進行加載
        //style-loader 負責將樣式添加到dom中
        //使用多個loader時,依次加載順序從右邊到左邊
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.less$/i,
        use: [
          // 將 JS 字符串生成為 style 節(jié)點
          "style-loader",
          // 將 CSS 轉(zhuǎn)化成 CommonJS 模塊
          "css-loader",
          // 將 Sass 編譯成 CSS
          "sass-loader",
        ],
      },
    ],
  },
};
2.圖片處理loader

1.安裝url-loader和file-loader

npm install url-loader  file-loader --save-dev

2.配置webpack.config.js rules

{
        test: /\.(png|jpg|gif)$/i,
        use: [
          {
            loader: "url-loader",
            options: {
              //當加載的圖片 小于limit時8k 會將圖片編譯Base64字符串形式
              //當加載的圖片 大于limit時8k 需要使用file-loader模塊進行加載
              limit: 8192, //限制大小可以修改
            },
          },
        ],
      },

3.在css中設(shè)置背景url圖片

body {
    /* background: green; */
    background: url('../img/test.png');
  }

webpack自動幫助我們生成一個圖片放在dist目錄下堡牡,這個圖片的名字很長抒抬,是一個32位的hash值,目的是防止名字重復(fù)晤柄。
實際項目中擦剑,可能對打包的圖片名字有一定要求,并且要將所有的圖片放在一個文件夾中芥颈,所有需要在webpack中rules 添加一定的配置--name

 options: {
              //當加載的圖片 小于limit時8k 會將圖片編譯Base64字符串形式
              //當加載的圖片 大于limit時8k 需要使用file-loader模塊進行加載
              limit: 8192, //限制大小可以修改
              name:'img/[name].[hash:8].[ext]'
            },

img-->圖片要打包的文件夾
[name]-->獲取圖片原來的名字
[hash:8]-->防止圖片命名沖突惠勒,依然使用hash,但是只保留8位
ext-->使用圖片原來的擴展名


3333.png

file-loader 可以指定要復(fù)制和放置資源文件的位置爬坑,以及如何使用版本哈希命名以獲得更好的緩存纠屋。此外,這意味著 你可以就近管理圖片文件盾计,可以使用相對路徑而不用擔心部署時 URL 的問題售担。使用正確的配置,webpack 將會在打包輸出中自動重寫文件路徑為正確的 URL署辉。

url-loader 允許你有條件地將文件轉(zhuǎn)換為內(nèi)聯(lián)的 base-64 URL (當文件小于給定的閾值)族铆,這會減少小文件的 HTTP 請求數(shù)。如果文件大于該閾值哭尝,會自動的交給 file-loader 處理哥攘。

Vue Loader

vue-loader是一個 webpack 的 loader,它允許你以一種名為單文件組件 (SFCs)的格式撰寫 Vue 組件
如果你不想手動設(shè)置 webpack刚夺,我們推薦使用 Vue CLI 直接創(chuàng)建一個項目的腳手架献丑。通過 Vue CLI 創(chuàng)建的項目會針對多數(shù)常見的開發(fā)需求進行預(yù)先配置末捣,做到開箱即用侠姑。

1.起步配置,安裝loader

npm install -D vue-loader vue-template-compiler

2.配置webpack
Vue Loader 的配置和其它的 loader 不太一樣箩做。除了通過一條規(guī)則將 vue-loader 應(yīng)用到所有擴展名為 .vue 的文件上之外莽红,請確保在你的 webpack 配置中添加 Vue Loader 的插件:


5555.png

3.創(chuàng)建vue文件,通過template 顯示view

webpack plugin的使用

plugin官方文檔
plugin 插件列表
loader 用于轉(zhuǎn)換某些類型的模塊,而插件則可以用于執(zhí)行范圍更廣的任務(wù)安吁,對現(xiàn)有的框架進行擴展醉蚁。包括:打包優(yōu)化,資源管理鬼店,注入環(huán)境變量网棍。
使用一個插件,你只需要 require() 它妇智,然后把它添加到 plugins 數(shù)組中滥玷。
多數(shù)插件可以通過選項(option)自定義。
你也可以在一個配置文件中因為不同目的而多次使用同一個插件巍棱,這時需要通過使用 new 操作符來創(chuàng)建它的一個實例惑畴。
plugin使用過程
1.通過npm安裝需要使用的plugins(某些webpack已經(jīng)內(nèi)置的插件不需要安裝)
2.在webpack.config.js中的plugins中配置插件
常用的幾個webpack插件

1.添加版權(quán)信息的plugin BannerPlugin 屬于webpack自帶的插件
1.const webpack = require("webpack");
2. new webpack.BannerPlugin("最終版權(quán)歸付小影子所有"),

webpack 自帶的 版權(quán)說明插件,會在dist目錄中生成bundle.js.LICENSE.txt 文本文件


7777.png
2.HtmlWebpackPlugin

HtmlWebpackPlugin 簡化了 HTML 文件的創(chuàng)建航徙,以便為你的 webpack 包提供服務(wù)如贷。這對于那些文件名中包含哈希值,并且哈希值會隨著每次編譯而改變的 webpack 包特別有用到踏。你可以讓該插件為你生成一個 HTML 文件杠袱,使用 lodash 模板提供模板,或者使用你自己的 loader
該插件將為你生成一個 HTML5 文件窝稿, 在 body 中使用 script 標簽引入你所有 webpack 生成的 bundle
1.npm 安裝plugin

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

2.webpack.config.js 配置

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {

  其他配置...

  plugins: [new HtmlWebpackPlugin()],
};

3. js壓縮的插件 uglifyjs-webpack-plugin

1.npm 安裝插件

npm install uglifyjs-webpack-plugin --save-dev

2.webpack.config.js 配置插件


6666.png

webpack 搭建本地服務(wù)器 webpack-dev-server

webpack 提供了一個可選的本地開發(fā)服務(wù)器霞掺,這個本地服務(wù)器基于node.js搭建,內(nèi)部使用express框架讹躯,可以實現(xiàn)讓瀏覽器自動刷新修改后的效果菩彬,不用每一次都執(zhí)行打包命令。
1.安裝webpack-dev-server

npm install -D webpack-dev-server,
npm install webpack-cli@3 -D

2.配置webpack.config.js 中devserver選項

devServer: {
    contentBase: "./dist", // 服務(wù)器訪問的文件目錄
    open: true, //是否是立即打開
    port: 8080, //端口號
    host: "localhost", //鏈接地址
  },
3.在package.json 的scripts腳本配置中添加 webpack-dev-server的配置

"scripts": {
"build": "webpack",
"dev": "webpack-dev-server"
},
4.終端執(zhí)行命令 npm run dev 潮梯,打開項目骗灶,修改項目內(nèi)容的時候,也不需要重新打包編譯
ctrl+c退出本地服務(wù)器

webpack中配置vue

1.npm 安裝 vue

npm install vue --save

2.入口js文件中秉馏,創(chuàng)建vue對象耙旦,綁定到index.html 中
index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="app">
    </div>
</body>
</html>

main.js

import Vue from "vue";
import App from "./APP";

//使用commonJs的模塊化規(guī)范
const { add, mul } = require("./js/MathUtil");
console.log("hello");
console.log(add(1, 2));
console.log(mul(1, 2));

//使用es6的模塊化規(guī)范
import { name, age, address } from "./js/useInfo";
console.log(name);
console.log(age);
console.log(address);

//把css 文件當成 模塊導入
require("./style/main.css");

//依賴less文件
require("./style/normal.less");

//方式1
new Vue({
  el: "#app", //在index.html,創(chuàng)建div 設(shè)置id為app
  components: { App },
  template: "<App/>",
});

//方式2
// new Vue({
//   render: (h) => h(App),
// }).$mount("#app");

webpack 配置文件拆分 開發(fā)環(huán)境配置和生產(chǎn)環(huán)境配置

1.安裝webpack-merge

npm install webpack-merge --save-dev

2.拆分config ->baseCongig devConfig,proConfig,通過webpackMerge合并萝究,動態(tài)配置

8888.png

base-webpack-config.js

const path = require("path");
//vue加載插件
const { VueLoaderPlugin } = require("vue-loader");
//生成HTML文件插件
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");

module.exports = {
  //入口文件
  entry: "./src/main.js",
  //出口文件
  output: {
    path: path.resolve(__dirname, "../dist"),
    filename: "bundle.js",
    // publicPath: "dist/",
  },
  module: {
    rules: [
      {
        test: /\.css$/i,
        //css-loader 只負責講css文件進行加載
        //style-loader 負責將樣式添加到dom中
        //使用多個loader時免都,依次加載順序從右邊到左邊
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.less$/i,
        use: [
          // 將 JS 字符串生成為 style 節(jié)點
          "style-loader",
          // 將 CSS 轉(zhuǎn)化成 CommonJS 模塊
          "css-loader",
          // 將 Sass 編譯成 CSS
          "less-loader",
        ],
      },
      {
        test: /\.(png|jpg|gif)$/i,
        use: [
          {
            loader: "url-loader",
            options: {
              //當加載的圖片 小于limit時8k 會將圖片編譯Base64字符串形式
              //當加載的圖片 大于limit時8k 需要使用file-loader模塊進行加載
              limit: 8192, //限制大小可以修改
              name: "img/[name].[hash:8].[ext]",
            },
          },
        ],
      },
      {
        test: /\.vue$/,
        loader: "vue-loader",
      },
    ],
  },
  resolve: {
    //導入文件 省略擴展后綴名
    extensions: [".js", ".css", ".vue"],
    alias: {
      vue$: "vue/dist/vue.esm.js",
      "@pages": path.resolve(__dirname, "../src/pages"),
      "@style": path.resolve(__dirname, "../src/style"),
      "@img": path.resolve(__dirname, "../src/img"),
      "@component": path.resolve(__dirname, "../src/component"),
    },
  },

  plugins: [
    new HtmlWebpackPlugin({
      filename: "index.html", // 打包后的文件名,默認是index.html
      template: path.resolve(__dirname, "../src/index.html"), // 導入被打包的文件模板
    }),
    new VueLoaderPlugin(),
    new CleanWebpackPlugin(),
  ],
};

pro-webpack-config.js

const webpack = require("webpack");
//js文件壓縮插件
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
const WebpackMerge = require("webpack-merge");
const baseConfig = require("./base.webpack.config");

module.exports = WebpackMerge.merge(baseConfig, {
  plugins: [
    //webpack 自帶的 版權(quán)說明插件帆竹,會在dist目錄中生成bundle.js.LICENSE.txt 文本文件
    new webpack.BannerPlugin("最終版權(quán)歸付小影子所有"),
    new UglifyJsPlugin(),
  ],
});

dev-webpack-config.js

const WebpackMerge = require("webpack-merge");
const baseConfig = require("./base.webpack.config");

module.exports = WebpackMerge.merge(baseConfig, {
  devServer: {
    contentBase: "./dist", // 服務(wù)器訪問的文件目錄
    open: true, //是否是立即打開
    port: 8080, //端口號
    host: "localhost", //鏈接地址
  },
});

package.json --config 指定配置文件

  "scripts": {
    "build": "webpack --config ./build/pro.webpack.js",
    "dev": "webpack-dev-server --config ./build/dev.webpack.config.js"
  },

[測試demo地址](https://github.com/fuxiaoyingzi/MeetWebpack

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绕娘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子栽连,更是在濱河造成了極大的恐慌险领,老刑警劉巖侨舆,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绢陌,居然都是意外死亡挨下,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門脐湾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臭笆,“玉大人,你說我怎么就攤上這事秤掌『睦玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵机杜,是天一觀的道長帜讲。 經(jīng)常有香客問我,道長椒拗,這世上最難降的妖魔是什么似将? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮蚀苛,結(jié)果婚禮上在验,老公的妹妹穿的比我還像新娘。我一直安慰自己堵未,他們只是感情好腋舌,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渗蟹,像睡著了一般块饺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雌芽,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天授艰,我揣著相機與錄音,去河邊找鬼世落。 笑死淮腾,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的屉佳。 我是一名探鬼主播谷朝,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼武花!你這毒婦竟也來了圆凰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤髓堪,失蹤者是張志新(化名)和其女友劉穎送朱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體干旁,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡驶沼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了争群。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片回怜。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖换薄,靈堂內(nèi)的尸體忽然破棺而出玉雾,到底是詐尸還是另有隱情,我是刑警寧澤轻要,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布复旬,位于F島的核電站,受9級特大地震影響冲泥,放射性物質(zhì)發(fā)生泄漏驹碍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一凡恍、第九天 我趴在偏房一處隱蔽的房頂上張望志秃。 院中可真熱鬧,春花似錦嚼酝、人聲如沸浮还。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钧舌。三九已至,卻和暖如春涎跨,著一層夾襖步出監(jiān)牢的瞬間延刘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工六敬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碘赖,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓外构,卻偏偏與公主長得像普泡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子审编,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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