一小時的時間,上手 Webpack

tuture發表於2020-04-11

本文由公眾號 位元組逆旅 的主筆 慢一拍 寫作而成,慢一拍 已認證成為圖雀社群專欄作者,後續將為大家帶來一系列 Webpack 的文章,敬請期待✌️。歡迎加入圖雀社群,一起創作精彩的免費技術實戰教程,加速技術的傳播!

如果您覺得我們寫得還不錯,記得 點贊 + 關注 + 評論 三連,鼓勵我們寫出更好的教程?

為什麼要用構建工具?如果你只會js+css+html,最多再加上jquery,那麼當你聽到構建工具這個說法是不是蒙的?這種情況下我不建議你學習webpack,建議你學下 vue 或者 react 框架,這兩個框架都有自己的腳手架,所謂腳手架就是別人用構建工具幫你搭好了原始專案,你可以在不懂構建工具的情況下進行前端開發。不過這就是初級前端的基本工作,給我一個環境,讓我安心的寫業務程式碼。

實際上,僅僅做上述工作也沒什麼不好,你可以鑽研 css,研究js深度語法,甚至去不斷精進演算法與資料結構都是高階進階之路。

我想說的是如果你有一天對webpack感興趣了,ok,歡迎你來到大前端世界!webpack是一個強大且可擴充套件的前端構建工具,還有包括grunt、gulp等同類工具都是基於node.js為底層驅動平臺實現的。

為什麼需要構建或者說編譯呢?因為像es6、less及sass、模板語法、vue指令及jsx在瀏覽器中是無法直接執行的,必須經過構建這一個操作才能保證專案執行,所以前端構建打包很重要。除了這些,前端構建還能解決一些web應用效能問題,比如:依賴打包、資源嵌入、檔案壓縮及hash指紋等。具體的我不再展開,總之前端構建工程化已經是趨勢。

至於為什麼選擇webpack,因為這個工具配置非常靈活,支援外掛化擴充套件,社群生態很豐富,官方迭代更新速度快,作為程式設計師,這是一個靠譜的選擇。

好了,廢話不多說,下面直接上乾貨,教你半小時上手,用webpack構建開發一個小專案。學東西要快,可以不用理解清楚每個概念,先動手,不然等你學會得要一個星期了。

一、node安裝

首先要保證你的電腦有node環境,node安裝比較簡單,直接在官網https://nodejs.org/en/下載node安裝包就可以了,注意這裡有兩個版本,左邊是穩定版本,右邊是最新版本,一般用穩定版本就可以了。具體的安裝過程不是本文的主要內容,網上有很多安裝教程。有了node環境,後面就可以通過npm進行webpack的安裝,npm是一個包管理工具,安裝node就會自動安裝npm。如果有必要我可以在我的公眾號裡也寫個教程。

二、webpack安裝及配置

1、webpack安裝

首先建立一個my_webpack資料夾作為專案資料夾,進入當前資料夾,通過命令列工具cmd執行以下命令:

npm init -y
npm install webpack webpack-cli --save-dev

安裝完了檢查版本,確認安裝成功

 ./node_modules/.bin/webpack -v

安裝成功後,資料夾下面會有這些內容

2、webpack配置

然後在根目錄建立一個空配置檔案webpack.config.js,建立以下內容:

'use strict'
const path = require('path');
module.exports = {
    entry: {
        index: './src/index.js',
    },
    output: {
        path: path.join(__dirname,'dist'),
        filename: 'index.js'
    },
    mode: 'production',
}

entry代表打包入口,output需要指定輸出地址及打包出來的檔名,mode指開發環境。然後在專案根目錄中建立src資料夾及dist資料夾,src資料夾裡建立index.js及hellowebpack.js兩個檔案,最後在dist目錄建立一個index.html檔案,完整目錄如下:

hellowebpack.js檔案裡輸入以下內容:

export function hellowebpack() {
    return 'hellowebpack'
}

接著在index.js中引用hellowebpack.js檔案中的這個函式

import {hellowebpack} from './hellowebpack'
document.write(hellowebpack())

這個時候到./node_modules/.bin/目錄下執行webpack打包命令,我們會看到dist目錄下多出一個index.js檔案,開啟會看到壓縮程式碼。

我們在dist目錄下的indext.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>
    <script src="./index.js" type="text/javascript"></script>
</body>
</html>

看到這應該明白了吧,在src目錄下面是開發內容,後面用 webpack 程式碼打包後,會在 dist 目錄下生成一個index.js 檔案,最後在index.html頁引用,這就是webpack打包專案的基本流程。

前面在執行打包要進入 ./node\_modules/.bin/ 目錄下執行 webpack打包命令,比較麻煩,這裡新增一個配置就可以更方便打包。在 package.json 檔案下的 script 節點新增一項配置 "build": "webpack",然後再刪掉 dist 目錄,再執行 npm run build 就可以方便地打包了。

三、webpack入門示例

1、webpack解析es6

到這一步需要掌握一個新的概念:loaders,所謂loaders就是說把原本webpack不支援載入的檔案或者檔案內容通過loaders進行載入解析,實現應用的目的。這裡講解es6解析,原生支援js解析,但是不能解析es6,需要babel-loader ,而babel-loader 又依賴babel。來看步驟:先安裝babel-loader,

npm i @babel/core @babel/preset-env babel-loader -D

再在根目錄建立 .babelrc 檔案,增加以下內容

{
    "presets": [
        "@babel/preset-env",
    ]
}

接著在webpack.config.js檔案下新增module屬性,屬性內容是一個rules集合,內容如下

// ...
module: {
        rules: [
            {
                test: /.js$/,
                use: 'babel-loader'
            },
         ]
      }
// ...

rules集合的每個元素都是一個檔案型別的配置資訊,這裡只有一個js檔案,後面會講到css、less及各種格式的圖片等;test是一個正則,用來匹配檔案字尾名;use表示此loader名稱。

前面例子裡建立了hellowebapck.js檔案,然後在index.js檔案中被引用。裡面用到的import是es6方法,有的瀏覽器並不支援es6,如果直接用webpack打包在這瀏覽器上是會出錯的,但是剛才已經安裝並配置了babel-loader,可以實現解析es6方法,babel還可以解析jsx語法。現在執行npm run build進行構建,就可以看到效果是成功的。(這個其實用一個ie瀏覽器就可以驗證es6解析前後的效果)

2、webpack載入css、less等樣式檔案

css-loader用於載入css檔案並生成commonjs物件,style-loader用於將樣式通過style標籤插入到head中

安裝loader

npm i style-loader css-loader -D
// ...
module: {
        rules: [
            {
                test: /.js$/,
                use: 'babel-loader'
            },
            {
                test: /.css$/,
                use: [
                    'style-loader',
                    'css-loader'
                ]
            },
         ]
        }
// ...

注意,這裡的解析css用到了兩個loader,所以use物件裡是個陣列,需要格外注意到loader順序,是先寫style-loader,再寫css-loader,但是執行的時候是先載入css-loader,將css解析好後再將css傳遞給style-loader;

接下來在專案中加一個public.css檔案,在裡面寫入一個樣式:

.color-text {
    font-size: 20px;
    color: red
}

將此檔案在src/index.js檔案中引用,如下所示。

我們知道此檔案做為打包入口檔案,最後打包後在dist目錄下,我們可以直接到dist目錄下的index.html檔案內,新增一個div標籤,加上樣式名color-text,以驗證樣式打包及引用效果

<body>
    <script src="./index.js" type="text/javascript"></script>
    <div class="color-text">text-color</div>
</body>

然後執行npm run build命令,執行成功後,在瀏覽器開啟dist目錄下index.html檔案,會看到以下內容,樣式檔案被成功打包併發揮了作用:

解析less檔案也是一樣的,直接把public.css檔案改成less字尾,此時是不能解析的,需要安裝less依賴,新增配置。

安裝less相關依賴

npm i less less-loader -D

新增less檔案解析配置

// ...
module: {
        rules: [
            {
                test: /.js$/,
                use: 'babel-loader'
            },
            {
                test: /.css$/,
                use: [
                    'style-loader',
                    'css-loader'
                ]
            },
            {
                test: /.less$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'less-loader'
                ]
            },
           ]
        }
// ...

這些步驟完成後,再執行 npm run build 命令進行打包,最後在瀏覽器檢視 dist\index.html ,會發現效果是一樣的。

3、webpack載入圖片

圖片在webpack中的打包步驟跟上面類似,只不過loader不同。

安裝file-loader

執行以下命令,安裝file-loader依賴

npm i file-loader -D

然後在webpack.config.js配置檔案 module 節點下新增解析配置內容:

{
    test: /.(jpg|png|gif|jpeg)$/,
    use: 'file-loader'
}

隨便找一張圖片放在src目錄下,在同級目錄的public.css檔案中加上背景圖片樣式,輸入內容如下:

.color-text {
    font-size: 20px;
    color: red;
    height: 500px;
    background: url(beautiful.jpg) no-repeat;
}

然後執行npm run build命令進行構建,最後執行時並沒有圖片展示,但是我們在dist目錄下發現了剛才打包過來的圖片,如圖所示。這就尷尬了,雖然圖片是打包過來了,問題是我每次還在拷貝複製一下名稱再引用,這很不科學。

有沒有更好的辦法載入圖片呢?答案是肯定的!看步驟:

安裝url-loader

npm i url-loader -D

url-loader直接內建了file-loader,是對它的再封裝,在配置檔案裡可以直接去掉file,用url替換。

在webpack.config.js檔案新增配置內容,注意limit是指圖片大小上限,單位是位元組,如果圖片大小小於這個值,就會被打包為base64格式,否則就仍是圖片。由於這個圖片有120K,我這裡設定為160000,差不多是150多K了。

{
    test: /.(jpg|png|gif|jpeg)$/,
    use: [{
        loader:'url-loader',
        options: {
            limit:160000,
            name: 'imgs/[name].[hash].[ext]'
        }
    }]
}

執行npm run build檢視效果,發現成功了,再看dist目錄下的index.js檔案,發現內容多了很多,其實就是多了這張圖片的base64資料。

好了,這篇文章就寫到這裡,如果你按我的步驟來,一定可以輕鬆體驗入門。當然,要真正達到應用水平,還要繼續深入學習,webpack的內容還有很多,比如如何載入vue指令或者jsx語法,如何打包元件等,後面我會繼續帶來入門教程。

想要學習更多精彩的實戰技術教程?來圖雀社群逛逛吧。

如果您覺得我們寫得還不錯,希望您能給❤️這篇文章點贊❤️哦

本作品採用《CC 協議》,轉載必須註明作者和本文連結

圖雀社群

相關文章