成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官問懵了?Webpack 的 Loader + Plugin開發竟比配置還簡單?

開發 前端
入口、出口、模式 的概念其實都比較好理解。但是一旦涉及到?loader?和?plugin,特別是實現?loader?和?plugin?很多小伙伴就比較懵了。所以,今天咱們就拿出 10 分鐘的時間,一起來看那看那?loader?和?plugin?是如何實現的!

在前兩天同學的面試中,有一位同學被問到 如何開發 webpack 的 loader 和 plugin?有沒有實際 loader 或者 plugin 的開發經驗。果然,面試只會越來越卷啊。

webpack 是大家所熟知的打包工具,里面包含了 5 個核心概念:

  1. 入口:entry
  2. 出口:output
  3. 加載器:loader
  4. 插件:plugin
  5. 模式:mode

圖片圖片

入口、出口、模式 的概念其實都比較好理解。但是一旦涉及到 loader 和 plugin,特別是實現 loader 和 plugin 很多小伙伴就比較懵了。

所以,今天咱們就拿出 10 分鐘的時間,一起來看那看那 loader 和 plugin 是如何實現的!

module、chunk、bundle

如果要講解 plugin 和 loader 那么會涉及到三個術語:module、chunk、bundle

所以咱們就先說明下 module、chunk、bundle 然后再來看下 plugin 和 loader


在打包工具中,有三個 “術語”:module、chunk、bundle

  1. module:模塊:通常一個模塊代表了一個文件。一般指的是 js 文件,當然也可以是 css 文件 或者 圖像文件。
  2. chunk:塊:塊通常是在構建過程中由打包工具(如: Webpack)根據配置生成的,它們由一組相關的模塊放在一起打包組成。
  3. bundle:打包文件:打包文件是指構建工具在打包過程中生成的最終輸出文件,可以在瀏覽器中加載并運行。

總的來說:模塊是組成項目的一個個文件,塊是由一組相關模塊組成的單元,而打包文件是構建工具最終生成的包含模塊和資源的輸出文件。

實現 loader 和 plguin

那么明確好了這三個基本的概念之后,接下來咱們來看下 loader 和 plugin

loader 一般被稱為 加載器, webpack 默認只能處理 .js 的文件。如果項目中遇到其他類型的文件,那么就需要通過 loader 進行處理。

plugin 一般被叫做 插件,它可以為 構建工具(不只是 webpack,還包含 vite 或者 rollup 提供一些附加的功能。比如說,咱們上一小節用到了 HtmlWebpackPlugin 它就是一個典型的插件,它可以在 webpack 構建的過程中生成一個新的 HTML 文件。并且自動生成新的 bundle 文件。

明確好了它們的基本概念之后,接下來咱們來看下它們 運行時機 的區別,咱們來看下面這張圖:

圖片圖片

從圖中咱們可以看到:

  1. loader 是在打包之前執行的,執行的時機比較固定。其實也很好理解嘛。loader 它實質就是一個轉換器,將 A 文件進行編譯形成 B 文件,操作的是文件,比如:將A.scss 轉變為B.css,單純的文件轉換過程。
  2. 而 plugin 是在整個編譯的周期中都會起作用。webpack 在整個運行的生命周期中,會廣播出很多的事件,plugin 就可以監聽這些事件,然后在某一個時機下,改變輸出結果就可以了。

那么明確好了它們的一個運行機制之后,接下來咱們來實現一個簡單的 loader 和 plugin

loader 的簡單實現

需求:

實現一個 loader 處理 txt 文件,把 hello world 轉化為 配置對象下 content 屬性的值

  • 在 webpack-project/vue.config.js 中利用 chainWebpack 添加新的 loader
// 添加一個處理 txt 文件的loader
config.module
// 創建一個新的規則,命名為 'custom-loader'
.rule('txt-loader')
// 適用于哪些文件
.test(/\.txt$/)
// 指定要使用的 loader 的名稱
.use('txt-loader')
// loader 的路徑
.loader('./src/loaders/textLoader')
// 配置對象
.options({
    content: '你好,世界'
})
.end()
  • 然后創建 test.txt 文件:
hello world
  • 實現 textLoader :
const loaderUtils = require('loader-utils')
// 接收options配置
module.exports = function (source) {
// 獲取配置文件
const options = loaderUtils.getOptions(this)
// 把 hello world 替換成 content 屬性配置
source = source.replace(/hello world/, options.content)
// 最后需要返回一個可執行的代碼,所以需要 module.exports = '內容'
return `module.exports = '${source}'`
}
  • 最后在 main.js 中導入該文件,并打印:
const text = require('./test.txt')
console.log(text)

plugin 的簡單實現

看完 loader 之后,接下來咱們來看一個 plugin 的構建。

需求:

在 webpack 打印完成之后,在終端輸出指定內容

  • 創建 webpack-project/src/plugins/logPlugin.js 文件:
class LogPlugin {
// 通過構造函數,獲取到傳入的內容 content
constructor(options) {
    this.content = options.content
}

// Webpack 會調用 logPlugin 實例的 apply 方法給插件實例傳入 compiler 對象。compiler 表示編譯器的實例,它代表了完整的 webpack 環境配置
apply(compiler) {
    // 指定一個掛載到 webpack 自身的事件鉤子。done 會在 webpack 構建完成后回調
    compiler.hooks.done.tap('logPlugin', (compilation) => {
        // compilation: 當前打包構建流程的上下文
        console.log(this.content)
    })
}
}

module.exports = LogPlugin
  • 在 vue.config.js 中,添加 plugin
// 添加一個新的 plugin
// 添加一個新的插件
config
.plugin('LogPlugin')
.use(LogPlugin, [{ content: 'hello sunday' }])
.end()

此時,運行項目可在終端打印指定內容。

webpack 在官網中提供了 如何構建 loader 和 如何構建 plugin 的文檔,大家如果想要深入了解它們的構建方式的話,那么可以查詢下對應的文檔內容。

責任編輯:武曉燕 來源: 程序員Sunday
相關推薦

2021-04-30 08:28:15

WebpackLoaderPlugin

2022-10-12 14:39:27

Streammappeek

2020-06-22 08:50:27

Spring AOP代理

2022-04-10 18:10:24

CURD鏈表

2021-05-28 07:12:58

Mybatis面試官Java

2021-11-08 09:18:01

CAS面試場景

2021-12-25 22:31:10

MarkWord面試synchronize

2021-11-05 06:57:50

HTTPHTTPS端口

2021-12-16 18:38:13

面試Synchronize

2023-12-18 08:03:56

并發編程Java

2021-12-02 18:20:25

算法垃圾回收

2025-06-03 07:05:00

Linux操作系統Windows

2020-07-28 00:58:20

IP地址子網TCP

2022-10-17 00:04:30

索引SQL訂單

2010-08-23 15:06:52

發問

2021-01-06 05:36:25

拉鏈表數倉數據

2022-01-05 09:55:26

asynawait前端

2018-01-19 10:43:06

Java面試官volatile關鍵字

2021-04-21 09:28:17

字節面試官SetTimeout

2024-09-20 12:25:16

Webpackchunkbundle
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 黄网站免费在线看 | 国产精品久久久久久 | 精品久久视频 | 久久不卡 | 天天综合网91 | 中文字幕精品一区 | 亚洲伊人久久综合 | 在线观看亚洲精品 | 欧美日韩美女 | 91av免费版| 99国产精品99久久久久久 | 国产精品美女久久久 | 欧美日韩网站 | 少妇一区在线观看 | 日韩欧美日韩在线 | 精品日韩在线观看 | 午夜伦理影院 | 久久久精品视频免费 | 美女一区二区在线观看 | 剑来高清在线观看 | 亚洲精品大全 | 免费黄色的视频 | 久久精品视频一区二区 | 亚洲91精品 | 三级在线视频 | 久久久久久久久久影视 | 91欧美精品成人综合在线观看 | 欧美精品1区2区 | 国产精品波多野结衣 | 亚洲视频免费播放 | 国产精品污www一区二区三区 | 天天影视网天天综合色在线播放 | 国产一二三区精品视频 | 99久久婷婷国产综合精品电影 | 亚洲欧洲成人 | 精品免费视频一区二区 | 精品国产综合 | 91欧美 | 久久综合国产精品 | 欧美成人精品欧美一级 | 久久在线 |