Webpack學習筆記

什麼是webpack?

  • webpack是一個現代JavaScript應用程序的靜態模塊打包器,在webpack裏一切文件皆模塊,通過loader轉換文件,通過plugin注入鉤子,最後輸出由多個文件組合成的文件,webpack專注構建模塊化項目。
  • webpack可以看做是模塊打包機:他做的事情是,分析項目,找到JavaScript模塊以及其他的一些瀏覽器不能直接運行的拓展語言(scss, TypeScript等),並將其打包爲合適的格式以供瀏覽器使用。


WebPack常見概念

WebPack優點

  • 模塊化開發,能做到開箱即用,一步到位。
  • 使用TypeScript
  • Scss,less,sass等css預處理器
  • 可通過plugin擴展,完整好用又不失靈活

WebPack四個核心概念

  1. entry:一個可執行文件或庫的入口文件。
  2. chunk:多個文件組成的一個代碼塊。例如把一個可執行文件和他所有依賴的模塊組合爲一個chunk,這體現了webpack的打包機制。
  3. loader:文件轉換器。例如把es6轉換爲es5,scss轉換爲css。
  4. plugin:插件,用於擴展webpack的功能,在webpack構建生命週期的節點上加入擴展hook爲webpack加入功能。

Webpack構建流程

  1. 解析webpack配置參數,合併從shell傳入和webpack.config.js文件裏配置的參數,生產最後的配置結果。
  2. 註冊所有配置的插件,好讓插件監聽webpack構建生命週期的事件節點,以做出對應的反應。
  3. 從配置的entry入口文件開始解析文件構建AST語法樹,找出每個文件所依賴的文件,遞歸下去。
  4. 在解析文件遞歸的過程中根據局文件類型和loader配置找出合適的loader用來對文件進行轉換。
  5. 遞歸完後得到每個文件的最終結果,根據entry配置生成代碼塊chunk。
  6. 輸出所有chunk到文件系統。

Webpack幾種常見的loader

  • file-loader:把文件數出到一個文件夾中,在代碼中通過相對URL去引用輸出的文件。
  • url-loader:和file-loader類似,但是能在文件很小的情況下以base64的方式把文件內容注入到代碼中去。
  • source-map-loader:加載額外的source map文件,以方便斷點調試。
  • image-loader:加載並且壓縮圖片文件。
  • babel-loader:把es6轉換成es5。
  • css-loader:加載CSS,支持模塊化、壓縮、文件導入等特性。
  • style-loader:把CSS代碼注入到JavaScript中,通過DOM操作去加載CSS。
  • eslint-loader:通過ESLint檢查JavaScript代碼。

什麼是模塊的熱更新?

  • 模塊熱更新是webpack的一個功能,他可以使得代碼修改過後不用刷新瀏覽器就可以更新,是高級版的自動刷新瀏覽器。
  • DevServer中通過hot屬性可以控制模塊的熱替換。
  1. 通過配置文件
const webpack = require('webpack');
const path = require('path');
let env = process.env.NODE_ENV == "development" ? "development" : "production";
const config = {
  mode: env,
 devServer: {
     hot:true
 }
}
  plugins: [
     new webpack.HotModuleReplacementPlugin(), //熱加載插件
  ],
module.exports = config;

   2. 通過命令行

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "NODE_ENV=development  webpack-dev-server --config  webpack.develop.config.js --hot",
  },

懶加載(按需加載路由) 

webpack中提供了require.ensure()來實現按需加載。以前引入路由是通過import這樣的方式引入,改爲const定義的方式進行引入。

不進行頁面按需加載的引入方式:

import home from '../../common/home.vue'

進行頁面按需加載的引入方式:

const home = r =>require.ensure([ ],() =>(require('../../common/home.vue')))

 


Webpack和grunt、gulp的不同

1. 概念區別:

(1)gulp/grunt是一種能夠優化前端的開發流程的工具。
(2)webpack是一種模塊化的解決方案。

2. 工作方式的區別:

(1)Grunt和Gulp的工作方式是:在一個配置文件中,指明對某些文件進行類似編譯、組合、壓縮等任務的具體步驟。工具之後可以自動替你完成這些任務。


(2)Webpack的工作方式:把你的項目當做一個整體,通過給定的主文件(如:index.js),webpack將從這個文件開始找到你的項目的所有依賴文件,使用loader處理他們,最後打包爲一個(或多個)瀏覽器可識別的JavaScript文件

3. 基於類型的區別

(1)grunt和gulp是基於任務和流(task、stream)的。類似jQury,找到一個(或一類)文件,對其做一系列鏈式操作,更新流上的數據,整條鏈式操作構成了一個任務,多個任務就構成了整個web的構建流程。
(2)webpack是基於入口的。webpack會自動地遞歸解析入口所需要加載的所有資源文件,然後用不同的loader來處理不同的文件,用plugin來擴展webpack功能。


Webpack實踐

安裝 Webpack

npm install webpack -g

創建項目

創建項目目錄

mkdir app

添加runoob1.js

app/runoob1.js 文件

document.write("It works.");

在app目錄下添加index.html文件

<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <script type="text/javascript" src="bundle.js" charset="utf-8"></script>
    </body>
</html>

接下來我們使用 webpack 命令來打包:

webpack runoob1.js -o bundle.js

 

接下來我們創建另外一個 js 文件 runoob2.js

module.exports = "It works from runoob2.js.";

更新 runoob1.js 文件,代碼如下:

document.write(require("./runoob2.js"));

 接下來我們使用 webpack 命令來打包:

webpack runoob1.js -o bundle.js

 

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