tft每日頭條

 > 生活

 > webpack學習方法

webpack學習方法

生活 更新时间:2024-08-23 15:16:44

webpack學習方法?大家好,我是喜歡寫 hello world 的前端西瓜哥這次我們開發一個自己的 webpack 插件,接下來我們就來聊聊關于webpack學習方法?以下内容大家不妨參考一二希望能幫到您!

webpack學習方法(教你開發一款屬于你自己的)1

webpack學習方法

大家好,我是喜歡寫 hello world 的前端西瓜哥。這次我們開發一個自己的 webpack 插件。

插件使用的 webpack 版本為 4.46.0。

webpack 插件有什麼用?

webpack plugins 是 webpack 非常重要的一環,用于增強 webpack 的功能。

插件會在 webpack 構建時的生命周期鈎子上做一些處理。比如,最常用的 HtmlWebpackplugin 是在打包文件構建好之後,該插件會額外生成一個 HTML,并将将打包文件通過引用的方式加入到 HTML 文件裡。

下面正式開始開發一款名為 HelloWorldPlugin 的插件,作用是打包時額外生成一個 hello.js 文件。

plugin 的結構

首先插件需要有一個 apply 方法。webpack 構建時,會執行這個 apply 方法,并将 webpack 的 compiler 對象傳入進去。

通過這個對象,我們可以訪問 webpack 的生命周期鈎子,改動一些構造過程中産生的對象,影響最終構建結果。

理論上插件是個有 apply 方法的對象即可,但最好還是寫成類的形式。

我們看下 webpack 常見的配置寫法:

const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { // ... new HtmlWebpackPlugin({ template: 'index.html', }), // ... }

可以看到,類的寫法可以更方便地傳入配置項,以及被複用(這裡的 new HtmlWebpackPlugin 其實可以被使用多次,構造多個 HTML)。

我們的 HelloWorldPlugin 類的基本框架為:

class HelloWorldPlugin { options; constructor(options) { this.options = options; } apply(compiler) { console.log('hello'); } } module.exports = HelloWorldPlugin;

然後将該插件加入到 webpack 配置中:

const HelloWorldPlugin = require('./HelloWorldPlugin'); module.exports = { entry: './src/index.js', output: { filename: 'app.js', }, plugins: [ // 插件在這裡 new HelloWorldPlugin(), ], }

此時如果執行 webpack 構建,你會在控制台中看到 hello 被打印出來。

此外構造函數也會将傳入的配置對象保存起來,當然這裡我還沒傳任何東西。

使用 webpack 的生命周期鈎子

下面我們讓 HelloWorldPlugin 去通過鈎子去額外生成一個文件。

先看 plugin 代碼實現:

const { RawSource } = require('webpack-sources'); const pluginName = 'hello-world-Plugin'; class HelloWorldPlugin { options; constructor(options) { this.options = options; } apply(compiler) { // 生成一個文件 compiler.hooks.emit.tap(pluginName, (compilation) => { compilation.assets['hello.js'] = new RawSource('console.log(\'Hello world!\')'); }) } } module.exports = HelloWorldPlugin;

apply 方法中,通過 compiler.hooks 可以拿到所有的鈎子。

我們要用到是 emit hook。emit hook 的觸發時機是 webpack 打包好資源,準備将資源生成到構建目錄之前,此時正是我們往裡面塞一個文件的好時機。

我們需要執行這個 emit hook 的 tap 方法來注冊事件響應函數,這裡需要傳入當前插件名和一個回調函數。傳入插件名,我也不清楚是要幹嘛,大概是做一個标記,方便 debug。回調函數則會拿到一個 compilation 對象,這個對象下的 assets 其實就是即将生成的文件。我們可以直接修改這個對象,補上一個 hello.js 文件。

這裡需要用到 webpack 官方提供的 webpack-sources 庫,這個庫專門用來生成符合 assets 格式的對象。

const { RawSource } = require('webpack-sources'); compilation.assets['hello.js'] = new RawSource('console.log(\'Hello world!\')');

如果你使用 webpack5,該庫其實已經内置到 webpack 中,通過 require('webpack').sources 即可獲取到。

使用 webpack 構建後,你會發現 dist 目錄下,除了有一個 app.js 文件,還有一個内容為 console.log('Hello world!') 的 hello.js 文件。

使用插件配置

這裡我們沒有用到插件傳入的配置,我們對 HelloWorldPlugin 做個加強,用到配置。

插件改為:

const { RawSource } = require('webpack-sources'); const pluginName = 'hello-world-plugin' class HelloWorldPlugin { options; constructor(options) { this.options = options; } apply(compiler) { const { filename, content} = this.options; compiler.hooks.emit.tap(pluginName, (compilation) => { compilation.assets[filename] = new RawSource(content); }) } } module.exports = HelloWorldPlugin;

配置改為:

plugins: [ new HelloWorldPlugin({ filename: 'a.js', content: 'b', }), ]

于是你額外拿到了一個内容為 b 的 a.js 文件。

結尾

總結一下,開發一個 Plugin 的幾個要點:

  1. 确定 webpack 版本,使用對應的 API。否則插件可能用了更高版本的 webpack 語法且沒有兼容而無法工作,比如 webpack4 中, CopyWebpackPlugin 的版本不能高于 6。
  2. 插件需要通過類的方式保存好傳入的配置項,并提供一個 apply 方法。
  3. 插件本質是利用 webpack 構建時的各種生命周期鈎子,在其中對數據做一些改動,最終導緻構建的資源發生變化。
  4. webpack 官方文檔寫得很垃圾

我是啥都寫寫的前端西瓜哥,歡迎關注我。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved