Webpack 4.X 從入門到精通 - entry與output(一)

回顧歷史

Web應用日益複雜,前端開發也發生了翻天覆地的變化變得盤根錯節,到今天已經非常複雜和龐大了!用htmlcssjavascript老老實實的寫個頁面的時代早已過去。而現在要完成工作需要藉助很多額外的東西,比如工程化、自動化等等。這樣才顯得有逼格,纔像一個真正的程序猿。如果說還停留在切個圖,下載個js效果懟上去的階段,顯然你會脫節的。由此也帶動了很多前端工具的發展,以GulpGruntwebpack等爲代表的構建工具猶如雨後春筍般的生長,而webpack更爲流行,使用更爲廣泛,可以說它現在已經是前端開發的的標配了。所以這次我會用一個系列的文章詳細去介紹webpack,由淺入深解析webpack,再通過實戰例子配合,掌握以後足以解決你工作中的問題。同時這套系列文章是針對最新的4.X的版本。

Webpack是什麼

webpack是一款工具?什麼工具?有人管他叫打包工具,這樣太low了。可以看看webpack官網,頁面底部的一個個小頭像代表的是給webpack贊助過的人,鼠標放上去還可以看到他贊助了多少錢。就憑這麼多人的贊助,也不能叫這麼low逼的名,聽得好像是個壓縮軟件。得起個高大上的名,叫構建工具(當然打包的功能是它的一大特色)

前端裏的什麼工程化呀自動化呀,這些東西有個特點,就是源代碼無法在瀏覽器裏直接運行,必需通過編譯才行。那構建工具其實就能做這些事情。如:

  • 代碼編譯,把ES6轉成ES5
  • 模塊合併,把多個文件合併成一個文件,減少http請求
  • 代碼壓縮優化,抽取公共代碼,減少代碼量

這些都是構建工具要做的事情,但是這些東西都是用代碼去實現,讓他們通過代碼自動完成這些事情,解放我們的生產力。webpack最大的一個特色就是打包,官網的那張大圖所體現的就是打包的功能,並能解決模塊間相互依賴的問題,它能把亂成一鍋粥的文件打包成清晰的文件,快刀斬亂麻!其次webapck是以模塊爲基石,對於模塊化的支持體現的淋漓盡致,在webpack中所有的內容都是模塊,一個圖片、一個css文件、一個js文件都是一個模塊。

安裝

  1. npm init -y
  2. npm install --save-dev webpack
  3. npm install --save-dev webpack-cli

注意:
1、安裝前確認一件事件,nodejs的版本在5.0以上
2、npm init -y爲生成package.json文件
3、兩條命令可以簡寫爲:npm i webpack webpack-cli -D
4、建議安裝到項目中而並非全局環境下。安裝到全局環境下可能導致有的插件無法使用以及避免不同的項目依賴的版本不同而出現問題
5、4.x的版本把cli分離出來了,所以必需安裝webpack-cli
6、驗證是否安裝成功:webpack -v
Webpack 4.X 從入門到精通 - entry與output(一)
Webpack 4.X 從入門到精通 - entry與output(一)

配置文件

配置文件猶如webpack的大腦,webpack的工作都是通過配置文件完成的。編譯哪個文件、怎麼編譯、編譯成什麼樣、輸出爲什麼等等,所有的操作都是按配置文件裏的內容來完成的,所以配置文件一個重量級的嘉賓,webapck想要運行的話配置文件是必不可少的東西。

配置文件有6個核心的東西組成,就像JavaScriptECMAScriptDOMBOM三部分組成一樣。

  1. entry:入口文件(你要打包,就告訴我打包哪些)
  2. output:出口文件(我打包完了,給你放到哪裏)
  3. module:模塊(放lorder,編譯瀏覽器不認識的東西)
  4. plugins:插件(輔助開發,提高開發效率)
  5. devServer:服務器(webpack提供的本地服務器)
  6. mode:模式,分爲開發模式、生產模式。此爲4.X裏新增的

注意:
1、配置文件的名字建議叫webpack.config.js,需要放在項目文件夾的根目錄下。當然你可以換成其它的名字,但是運行的時候就要增加額外的步驟了
2、webpack採用CommonJS的規範,上面的所有參數都需要放在對象裏,用moudle.exports導出

小試牛刀

在項目文件夾(我的爲webpack-demo)的根目錄下創建必要的文件夾及文件,結構如下:

  • [ ] webpack-demo
    • [ ] node_modules
    • [ ] src
      • main.js
      • show.js
    • [ ] index.html
    • [ ] package.json
    • [ ] webpack.config.js

如下圖
Webpack 4.X 從入門到精通 - entry與output(一)

show.js代碼如下

//聲明一個函數,最終做爲一個模塊被導出
const show=content=>{
    const box=document.getElementById("box");
    box.innerHTML=`你好!${content}`;
}

export {show};  //ES6導出模塊的語法

main.js代碼如下

import {show} from './show';    //ES6導入模塊的語法,‘./’爲main.js的根目錄src,ES6裏導入的模塊爲js話不需要加後綴名
show('kaivon');

index.html代碼如下

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="box"></div>
    </body>
</html>

package.json代碼如下

const path=require('path'); //nodejs的語法,引入路徑模塊,爲了輸出的時候找絕對路徑

module.exports={
    entry:'./src/main.js',  //入口文件爲main.js  
    output:{    //輸出
        path:path.resolve(__dirname,'dist'),    //path.resolve爲nodejs的固定語法,用於找到當前文件的絕對路徑
        filename:'bundle.js'    //輸出的文件名
    },
};

在終端裏執行命令webpack後,不出意外的話終端裏顯示如下就表示成功了
Webpack 4.X 從入門到精通 - entry與output(一)
同時看一下文件結構目錄,多了一個dist文件夾,以及bundle.js文件。這兩個就是webpack打包生成的文件,如下
Webpack 4.X 從入門到精通 - entry與output(一)
index.html文件裏引入bundle.js文件後,用瀏覽器打開index.html,可以看到頁面裏有內容了。這就代表我們已經使用webpack打包了一個文件,它的基本用法已經跑了。

<body>
    <div id="box"></div>
    <script src="dist/bundle.js"></script>
</body>

語法及步驟

語法

  1. entry 入口文件
    • 只打包一個文件(單入口),寫個字符串
    • 把多個文件打包成一個文件,寫個數組
    • 把多個文件分別打包成多個文件,寫成對象
    • webpack把打包後的文件叫Chunck
  2. output 出口文件
    • filename 輸出文件的名稱
      1、輸出一個文件,寫個字符串
      2、輸出多個文件,文件名前面加個標識符(id/name/hash)
    • path 輸出文件的路徑
      1、路徑必需爲絕對路徑
      2、__dirnamenodejs裏的一個模塊,表示當前文件的絕對路徑
      3、pathnodejs的系統模塊,直接引入後調用path.resolve(__dirname,'輸出文件的路徑');

步驟

當我們在終端裏輸入webpack命令的時候webpack會按以下的步驟開始工作

  1. 先打開根目錄下的webpack.config.js
  2. entry(入口)屬性的值
  3. 進入到main.js裏,看到它又依賴show.js,再找到show.js
  4. main.jsshow.js合併成一個js文件
  5. webpack.config.js裏找到output(出口)屬性
  6. 解析output裏的pathfilename屬性的值
  7. 把第4步合併成的js文件放到dist文件夾裏,並起個名字叫bundle.js

趁熱打鐵

下面演示多入口,在src目錄裏新建兩個js文件,1.js2.js,代碼如下:
1.js

console.log('這是第一個入口文件!');

2.js

console.log('這是第二個入口文件!');

修改webpack.config.js文件

const path=require('path');

//兩個entry分別一一對應兩個filename
module.exports={
    //entry:['./src/1.js','./src/2.js'],
    entry:{
        one:'./src/1.js',
        two:'./src/2.js'
    },
    output:{
        //filename:'bundle.js',
        filename:'[name].bundle.js' //可以以name/id/hash放在中括號裏區分文件名
        path:path.resolve(__dirname,'dist'),
    }
}

分別註釋對應的entryfilename,在終端裏執行命令:webpack後,查看dist文件夾及運行index.html後查看效果
1、當entry爲數組的時候,webpack會把數組裏所有文件打包成一個js文件
2、當entry爲對象的時候,webpack會把對象裏的文件分別打包成多個文件

文章裏所說到的只是entry與output的常用配置,它的配置不止這些,可以參考以下鏈接
entry的所有配置https://webpack.js.org/concepts/entry-points/
output的所有配置https://webpack.js.org/concepts/output/

資料下載

下一篇:Webpack 4.X 從入門到精通 - plugin(二)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章