webpack--初試webpack( 核心、體驗、資源打包)

丶Serendipity丶發表於2021-11-19

前言

   webpack是當前前端專案中最常用的資源構建工具,從本文開始,來總結記錄一下關於webpack的學習。

正文

  1、webpack簡介

  webpack官網(https://webpack.docschina.org/

  我們程式碼中使用less,ES6的impot以及一些高階的語法,瀏覽器無法識別,因此webpack解決了這個問題,它是一種前端的資源構建工具,同時也是一個靜態的模組打包器。在webpack看來,前端的所有資原始檔(js/img/css/less)都會作為模組處理,他會根據模組的依賴關係進行靜態分析,打包生成對應的靜態資源。我的理解就是,要完成這些首先要告訴weback的一個入口起點,然後根據這些依賴關係,形成一個程式碼塊,這個程式碼塊就叫chunk,然後根據這個chunk進行不同的處理,這一過程叫打包,打包之後,輸出出來的檔案叫 bundles。

  2、webpack的五個核心概念

  (1)Entry

  入口,指示webpack以哪個檔案為入口起點開始打包,但是打包之前需要分析清模組之間的依賴關係圖。

  (2)Output

  輸出,指示webpack 打包後的資源 bundles 輸出到哪裡,以及如何命名。

  (3)Loader

  Loader,指示webpack能夠處理那些非 js 檔案,可以理解 webpack 本身只能處理一些 js 檔案,一旦處理樣式檔案,圖片檔案這些就會報錯或處理不了。它就類似一個翻譯官的角色。

  (4)Plugins

  外掛,用於執行一些範圍更廣的任務,比如打包優化和壓縮,一直到重新定義環境變數等。

  (5)Mode

  模式(process.env.NODE_ENV),development開發模式,能讓程式碼在本地除錯執行的環境。

                  production 生產模式,能讓程式碼優化上線的執行環境。

  3、webpack 安裝及初體驗

  前提:node環境 npm安裝成功

  全域性安裝:npm install -g webpack npm i -g webpack-cli

  本地安裝:npm install webpack -D npm i webpack-cli -D

  注意:在安裝webpack的時候,如果報錯如下,是自己的專案名package.json中的name值設定成了webpack

  初體驗,建立專案,通過 cmd 中輸入 npm init 指令初始化專案,這裡要注意 package.json 的 name 值問題,然後在本地安裝依賴 npm i webpack-cli -D 和 npm install webpack -D ,建立src目錄,在下面建立(index.js,index.css,data.json),index.js檔案為專案入口檔案,並分別測試css檔案,json資原始檔,程式碼如下:

 

  index.js

    // 普通js程式碼
    function add(x,y){
        return x + y
    }
    console.log(add(1,2));

    // json資源
    import data from "./data.json"
    console.log(data);

    // 引入css資源
    // import  "./index.css"

  index.css

    body{
        padding: 0;
        background-color: pink;
    }

  data.json

    {
       "name":"name",
       "age":18
    }

  分別測試下面的指令:

  開發環境指令:webpack ./src/index.js -o ./build --mode=development。以 ./src/index.js 為入口 ,./build 為輸出,整體打包環境是開發環境。

  生產環境指令:webpack ./src/index.js -o ./build --mode=production。以 ./src/index.js 為入口 ,./build 為輸出,整體打包環境是生產環境。

  經測試得出結論如下:

  (1)webpack能處理 js 資源,json 資源,不能處理 css 、html、和 img 資源,打包過程會報錯:Module parse failed: Unexpected token (1:4)

  You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders

  (2)生產環境比開發環境多了壓縮js程式碼,生產環境和開發環境將es6 模組編譯成瀏覽器能識別的模組

  4.webpack打包樣式資源

  (1)引入css樣式資源-----css-loader 和 style-loader

  首先將index.js中的css引入程式碼註釋放開

  命令列執行npm i style-loader css-loader -D 命令安裝開發依賴

  在專案最外層建立webpack.config.js 檔案,該檔案為webpack配置檔案,插入如下程式碼

// resolve用來拼接絕對路徑的方法
const { resolve } = require("path");

module.exports = {
  //入口檔案
  entry: "./src/index.js",
  // 輸出
  output: {
    // 輸出檔名
    filename: "build.js",
    // 輸出路徑
    // __dirname 是node.js的變數,代表當前檔案的目錄的絕對路徑
    path: resolve(__dirname, "build"), // 代表輸出到當前目錄下建立的build資料夾下
  },
  // loader的配置
  module: {
    rules: [
      // 詳細的loader配置
      {
        test: /\.css$/, //匹配.css結尾的檔案
        use: [
          // 使用哪些loader進行處理,use陣列中的執行順序是從後往前
          //建立一個style標籤,將js中的樣式資源插入進去,新增到head中生效
          "style-loader",
          // 將css檔案程式設計commonjs模組載入在js中,裡面內容是樣式字串
          "css-loader",
        ],
      },
    ],
  },
  //plugin的配置
  //plugins: [],// 這裡要注意,裡面沒有配置的時候要註釋掉,否則會報錯
  // 模式
  mode: "development", // 開發模式
  // mode:"production"// 生產模式
};

  然後執行命令 webpack即可,然後會發現控制檯

   接下來需要,測試引入樣式是否成功,需要在build檔案下建立index.html檔案,並在其中引入打包之後生成的build.js,然後再瀏覽器開啟該html檔案。

  (2)引入less樣式資源-----less-loader

 

  按照css資源的方式,建立index.less檔案,寫入樣式,然後在index.js中引入,再次執行wbepack命令,發現報錯如下:

  上面的報錯,是因為我們只配置了css樣式的處理方式,沒有在loader配置less的,注意:針對不同檔案,需要配置不同的loader處理規則。因此需要配置less對應的解析的loader。webpack.config.js的loader.rules中新增如下程式碼:

    {
        test: /\.less$/, //匹配.less結尾的檔案
        use: [
          "style-loader",
          "css-loader",
          "less-loader"// 將less檔案變異成css檔案
        ],
      },

  同樣執行 webpack 命令

   測試less打包成功方法同css。

  5、webpack打包html檔案----html-webpack-plugin

  前面解決了樣式資源的打包,都用到了 loader 來處理,都需要下載依賴,然後在loader中配置,而處理htm資源,就需要用到 plugins,需要首先下載依賴,然後 webpack 引入,最後在 plugins 中配置,如下:

  同樣建立 index.html 檔案。

  首先,下載 html-webpack-plugin : npm i html-webpak-plugin -D

  然後webpack.config.js 中引入

const HtmlWebpackPlugin = require("html-webpack-plugin")

  最後在plugins中配置:

  //plugin的配置
  plugins: [
    new HtmlWebpackPlugin()
  ],

  我並沒有在index.js中引入index.html檔案,同樣執行 webpack 命令,會發現,打包初了生成 build.js 的輸出檔案外,還生成了一個空的 html 檔案,並且該 html 檔案引入了生成的 build.js 檔案,結論:new HtmlWebpackPlugin() 預設打包生成一個空的html 檔案,該檔案引入打包生成的所有資原始檔。但是如果我們需要設定一個html 模板檔案,就需要在new HtmlWebackPlugin() 方法中傳入一個引數,引數為具體的模板檔案路徑,如下:

  plugins: [
    new HtmlWebpackPlugin({
      template: "./src/index.html",
    }),
  ],

  這就相當於複製了index.html檔案,並自動引入打包生成的所有資原始檔。

  6、webpack打包圖片資源----url-loader 和 file-loader

  由於在webpack對html檔案進行打包的時候會使用我們設定的html模板,因此我們在html檔案中引入img檔案無法測試對圖片資源的打包,所以這裡需要通過樣式資源引入的方法來測試打包圖片資源。

  這裡新建一個img資料夾,然後新增一張圖片,在index.css檔案中修改如下程式碼,並把css檔案引入在index.js中

body{
    padding: 0;
    background-image: url(./img/webpack.jpg);
    background-repeat: repeat;
}

  然後安裝依賴:npm i url-loader file-loader -D

  最後在webpack.config.js 中配置loader:

      // 這種方式無法處理html檔案中的圖片
      {
        test:/\.(jpg|png|gif)$/,
        loader:"url-loader",
        options:{
          // 圖片大小小於8kb,會被解析為base64處理,優點減少請求數量減輕伺服器壓力,缺點是圖片體積更大,檔案請求速度更慢
          limit:8*1024
        }
      }

  執行webpack打包命令,發現打包成功。

   打包生成檔案如下:發現圖片的名字發生了變化(將圖片修改成了對應的hash值)。

  上面的操作只解決了css檔案中引入的img檔案,但是實際開發我們想在html中引入圖片怎麼辦,由於html模板中會原封不動的打包輸出,而圖片的打包會經過壓縮修改名稱處理,所以上面的方法就不適用。需要引入 html-loader 來負責引入img圖片資源,從而交給 url-loader 處理。

  首先在html檔案中寫入

    <img src="./img/webpack1.jpg" alt="" />

  然後下載依賴: npm i html-loader -D

  然後在webpack.config.js 中的loader配置,如下:

      {
        test: /\.(jpg|png|gif)$/,
        loader: "url-loader",
        options: {
          // 圖片大小小於8kb,會被解析為base64處理,優點減少請求數量減輕伺服器壓力,缺點是圖片體積更大,檔案請求速度更慢
          limit: 8 * 1024,
          esModule: false,
          // 這樣可以修改圖片名稱,[hash:10]表示取hash值的前十位,[ext]表示原副檔名
          // name: "img/[hash:8].[name].[ext]",
        },
      },
      {
        // 因為url-loader預設適用了es6模組解析,而html-loader 引入圖片適用commonJS處理,解析時會出現[object Module],需要關閉url-loader的es6模組化解析
        test: /\.html$/,
        // 處理html 檔案的img檔案
        loader: "html-loader",
      },

  然後執行webpack命令,打包成功

   對應的html檔案中的img路徑也發生了變化

  7、打包其他資源---- file-loader

  這裡主要指其他不需要做任何優化之類的資源,這裡以字型圖示為例(https://www.iconfont.cn/),這裡選擇一個購物車圖示,選擇下載程式碼.,

  下載檔案並解壓,開啟index.html檔案,會有使用圖示的方法介紹,這裡使用Unicode 引用

  第一步:拷貝專案下面生成的 @font-face,程式碼中引入了(iconfont.ttf?t=1637326208397)

@font-face {
  font-family: 'iconfont';
  src: url('iconfont.ttf?t=1637326208397') format('truetype');
}

  第二步:定義使用 iconfont 的樣式

.iconfont {
  font-family: "iconfont" !important;
  font-size: 16px;
  font-style: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

   第三步:挑選相應圖示並獲取字型編碼,應用於頁面

<span class="iconfont">&#x33;</span>

  操作:首先在src檔案下建立一個icont的資料夾,把下載的 iconfont.ttf 檔案複製到資料夾下,然後把第一二步的程式碼複製到index.css檔案,把第三步的程式碼複製到index.html 中,最後配置loader

    {// 打包其他資源(除了css,js,html資源以外的資源)
        exclude:/\.(css|js|html)$/,
        loader:"file-loader"
      }

  執行webpack命令打包結果如下:

寫在最後

  以上就是本文的全部內容,希望給讀者帶來些許的幫助和進步,方便的話點個關注,小白的成長之路會持續更新一些工作中常見的問題和技術點。

 

相關文章