国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【webpack】自定義loader

這篇具有很好參考價(jià)值的文章主要介紹了【webpack】自定義loader。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

??個(gè)人主頁(yè):愛吃炫邁
??系列專欄:前端工程化
?????座右銘:道阻且長(zhǎng),行則將至??


loader

一個(gè)loader就是一個(gè)Node.js模塊,這個(gè)模塊需要導(dǎo)出一個(gè)函數(shù),這個(gè)導(dǎo)出函數(shù)的工作就是獲得處理前的源內(nèi)容,對(duì)源內(nèi)容進(jìn)行處理后,返回處理后的內(nèi)容

實(shí)現(xiàn)一個(gè)替換文件中姓名的loader。例如將“小張”替換成“小李”

name.js

export const name = "小張"

index.js

import { name } from "./name.js"

function showInfo() {
    console.log("name")
}

showInfo()

運(yùn)行代碼輸出:

小張

現(xiàn)在我們希望將小張?zhí)鎿Q成小李:

  1. 創(chuàng)建replace-loader

myLoaders/replace-loader.js

module.exports = function(source) {
    // source為compiler傳遞給loader的一個(gè)文件的源內(nèi)容
    
    const cotent = source.replace("小張", "小李")
    // 該處理函數(shù)需要返回處理后的內(nèi)容
    return cotent
}
  1. 使用loader

webpack.config.js

const path = require("path")

module.export = {
    mode: "production",
    entry: "./src/index.js",
    output: {
        path: path.resolve(__dirname, "dist"),
        filename: "[name].js",
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                use:"./myLoaders/replace-loader.js"
                // 本地loader, 要填寫本地的路徑
            }
        ]
    },
}

打包后我們就會(huì)發(fā)現(xiàn)實(shí)現(xiàn)我們的想要的功能啦~~~

因?yàn)槲覀兪褂玫氖潜镜氐膌oader,因此需要填寫本地的路徑。loader的引入主要有以下幾種方式:

loader引入方式

  1. 如果是npm包安裝的loader,那么直接寫loader名稱即可
{
    test: /\.js$/,
    use:'babel-loader'
}
  1. 如果是本地自定義的loader,那么需要寫本地loader的地址
{
    test: /\.js$/,
    use: path.resolve(__dirname, "./myLoaders/replace-loader")
}

如上面的代碼,我們每使用一個(gè)自定義的loader,都必須使用 path 模塊來(lái)解析自定義loader的路徑問(wèn)題,這就會(huì)導(dǎo)致代碼變得難以維護(hù)。那可不可以像引用第三方的loader一樣,只寫loader 名呢?我們可以使用 resolveLoader 來(lái)解決這個(gè)問(wèn)題。

  1. 如果是本地定義的loader,然后也想直接使用loader名稱,那么可以取個(gè)別名
module.exports = {
    resolveLoader: {
    // 取個(gè)別名
     alias: {
        "replace-loader": path.resolve(__dirname,"myLoaders/replace-loader")
    }
  },
  module: {
        rules: [
            {
                test: /\.js$/,
                use: 'replace-loader',
            }
        ]
    }
}
  1. 如果你不想取別名,還想直接使用loader,那么就定義一下loader的查找位置,loader會(huì)默認(rèn)先從node_modules中查找。如果我們希望它也能夠到本地查找,那么就定義一下查找位置。

ResolveLoader 用于配置 webpack 如何尋找 loader,默認(rèn)情況下只會(huì)去 node_modules 目錄下尋找,為了讓 webpack 去加載自定義的 loader,我們需要修改 resolveLoader.modules

比如我們自定義的loader 放在 ./myLoaders 目錄下,則需要如下配置:

module.exports = {
    resolveLoader: {
    // 去哪些目錄下尋找 loader ,有先后順序之分
    // 如下配置中,查找順序是:先在 node_modules 目錄下尋找,若找不到,再到 ./myLoaders 目錄下尋找
    modules: ["node_modules", "./myLoaders"],
  },
  module: {
        rules: [
            {
                test: /\.js$/,
                use: 'replace-loader',
            }
        ]
    }
}

loader傳入/接收參數(shù)

傳入?yún)?shù)

我們上述代碼的功能是將“小張”替換成“小李”,假如我們希望將“小張”替換成“小王”,換成“小周”,那么我們難道每次都在loader中修改嗎?這肯定不會(huì),因此,我們需要支持配置參數(shù)。loader支持通過(guò)options進(jìn)行配置:

{
  test: /\.js$/,
  use: [
    "replace-loader",
    {
      loader: "replace-loader",
      options: {
        name: "小李",
      },
    },
  ],
}

接收參數(shù)

  1. this.query

webpack官方文檔如何讓編寫一個(gè)loader中說(shuō)明了loader只接收一個(gè)參數(shù),這個(gè)參數(shù)是讀取的文件內(nèi)容(一個(gè)包含資源文件內(nèi)容的字符串)。webpack會(huì)把所有的信息都放到上下文this中,我們可以通過(guò)this.queryAPI來(lái)獲取webpack.config.js中配置的options對(duì)象:

module.exports = function (source) {
  // this.query 獲取到的就是在webpack.config.js配置中配置的 options 對(duì)象
  // 通過(guò) this.query API 獲取在配置中配置的 name 
  return source.replace("小張", this.query.name);
};
  1. loader-utils

雖然我們可以通過(guò)this.query來(lái)進(jìn)行獲取,但是webpack更加推薦使用loader-utils來(lái)進(jìn)行操作,它提供了許多有用的工具,最常用的一種工具是獲取傳遞給loader的選項(xiàng)。

  • 安裝
npm i loader-utils -D
  • 使用
const { getOptions } = require('loader-utils')
module.exports = function(source)  {
    // const options = this.getOptions();
    let { name } = getOptions(this);
    const content = source.replace("小張",name);
    return content;
}

loader返回值

loader 的原理就是將輸入的源內(nèi)容進(jìn)行處理后返回,loader的返回值涉及到一個(gè)還是多個(gè)返回值。有些情況下比如我們需要返回sourceMap,那么就需要多個(gè)返回值。 如果需要返回一個(gè)返回值,可以直接使用return。

return source

如果只有一個(gè)返回值,可以使用return返回,這種方式返回的是源內(nèi)容轉(zhuǎn)換后的內(nèi)容

const { getOptions } = require('loader-utils')
module.exports = function (source) {
    // 處理source
    let { name } = getOptions(this)
    const content = source.replace("小張", name)
    return content // 返回一個(gè)值
}

this.callback()

如果有多個(gè)值需要返回,需要使用loader本身提供的回調(diào)函數(shù)callback。這種方式可以返回除了處理內(nèi)容之外的其他信息。

const { getOptions } = require('loader-utils')
const { SourceMap } = require('module')

module.exports = function (source) {
  // 處理 source
  let { name } = getOptions(this)
  const content = source.replace("小張", name);
  // 使用 this.callback 返回內(nèi)容
  this.callback(null, content,SourceMap);
};

callback支持的參數(shù)如下:

callback({
    // 報(bào)錯(cuò)
    error: Error | Null,
    // 轉(zhuǎn)換后的內(nèi)容
    content: String | Buffer,
    // 轉(zhuǎn)換后的內(nèi)容得出的sourceMap
    sourceMap?: SourceMap,
    // ast
    abstractSyntaxTree?: AST 
})

注意:

在Webpack中,每個(gè)loader都可以返回一個(gè)包含多個(gè)屬性的對(duì)象。

  • content是該對(duì)象的一個(gè)屬性,用于指定經(jīng)過(guò)loader處理后生成的代碼。
  • sourceMap是另一個(gè)屬性,用于指定生成的代碼的源映射表。

因此,content和sourceMap的區(qū)別在于,content是經(jīng)過(guò)loader處理后生成的代碼本身,而sourceMap則是一個(gè)包含了生成的代碼和原始代碼的映射關(guān)系的JSON對(duì)象。

事實(shí)上,如果只有一個(gè)返回值,我們也可以直接使用this.callback。

this.callback(null,content)

同步/異步loader

loader有同步異步之分,上面介紹的loader都是同步loader,因?yàn)樗鼈兊霓D(zhuǎn)換流程都是同步的,即轉(zhuǎn)換完成后再返回結(jié)果。但在某些場(chǎng)景下轉(zhuǎn)換內(nèi)容需要異步才能完成,例如需要通過(guò)網(wǎng)絡(luò)請(qǐng)求才能得到結(jié)果,如果使用同步的方式,網(wǎng)絡(luò)請(qǐng)求就會(huì)阻塞整個(gè)構(gòu)建過(guò)程,導(dǎo)致構(gòu)建變得十分緩慢。

使用async和await進(jìn)行處理

module.exports = async function(source)  {
    let {name,age} = getOptions(this);
    // 這里其實(shí)不是異步的,只是作為示例,可以這樣處理
    const content =  await source.replace("小張",name);
    return content;
}

使用loader提供的this.async進(jìn)行處理

當(dāng)轉(zhuǎn)換內(nèi)容需要異步才能完成時(shí),我們可以使用webpack為loader提供的this.async將這個(gè)loader變成是一個(gè)異步loader:

const { getOptions } = require('loader-utils')
const { SourceMap } = require('module')

module.exports = function (source) {
  let { name } = getOptions(this);
  // 使用 setTimeout 模擬異步過(guò)程
  setTimeout(() => {
    const content = source.replace("小張", name);
    // 通過(guò) callback 返回執(zhí)行異步后的結(jié)果
    this.async(null, content,SourceMap);
  }, 3000);
};

loader單一功能原則

在webpack官網(wǎng)的如何編寫一個(gè)loader中提到,webpack的loader編寫最尋單一功能原則,也就是loader只能實(shí)現(xiàn)一個(gè)功能。比如less-loader用來(lái)處理less文件,css-loader用來(lái)處理css文件,style-loader用來(lái)將樣式插入到style標(biāo)簽中,這些功能雖然可以放到一個(gè)loader中實(shí)現(xiàn),但是為了確保loader的功能純粹,能夠讓不同的loader各司其職,同時(shí)進(jìn)行功能組合,最好每個(gè)loader只負(fù)責(zé)一個(gè)功能。

loader實(shí)戰(zhàn)

style-loader

style-loader做的事情其實(shí)很簡(jiǎn)單,就是把序列化后的css內(nèi)容放到style標(biāo)簽中,然后將style標(biāo)簽插入到HTML頁(yè)面的head標(biāo)簽中

module.exports = function(source) {
    return `const styleTag = document.createElement('style');
        styleTag.innerHTML = ${source};
        document.head.appendChild(styleTag);
    `
}

css-loader

css-loader 做的事情也十分的簡(jiǎn)單,將 less-loader 轉(zhuǎn)換后的 css 內(nèi)容進(jìn)行序列化

module.exports = function(source) {
    return JSON.stringify(source);
}

less-loader

less-loader 做的事情就是使用 less 模塊,將 less 轉(zhuǎn)換成 css

// 使用 less 模塊處理 less 語(yǔ)法
const less = require('less');
module.exports = function(source) {
    less.render(source, (error, output) => {
    let { css } = output;
    this.callback(error, css)
  })
}

參考文章:
由淺及深實(shí)現(xiàn)一個(gè)自定義loader文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-648728.html

到了這里,關(guān)于【webpack】自定義loader的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 前端面試:【前端工程化】構(gòu)建工具Webpack、Parcel和Rollup

    嗨,親愛的前端開發(fā)者!在現(xiàn)代Web開發(fā)中,前端工程化變得愈發(fā)重要。構(gòu)建工具如Webpack、Parcel和Rollup幫助我們自動(dòng)化任務(wù)、管理依賴、優(yōu)化性能等。本文將深入探討這三個(gè)前端構(gòu)建工具,幫助你了解它們的優(yōu)點(diǎn)和用途。 1. Webpack: 用途: Webpack是一個(gè)強(qiáng)大的模塊打包工具。它

    2024年02月11日
    瀏覽(121)
  • 【前端工程化面試題】說(shuō)一下 webpack 的構(gòu)建流程

    類似問(wèn)題是,說(shuō)一下 vite 的構(gòu)建流程,參考這篇文章。 初始化流程 從配置文件和shell 語(yǔ)句中讀取合并參數(shù),初始化需要使用的插件和執(zhí)行環(huán)境所需要的參數(shù) 配置文件默認(rèn)是 webpack.config.js 編譯構(gòu)建流程 解析入口模塊,從入口模塊開始串行調(diào)用對(duì)應(yīng)的loader 去翻譯文件內(nèi)容,依

    2024年02月20日
    瀏覽(97)
  • 前端工程化第三章:webpack5基礎(chǔ)(下)

    前端工程化第三章:webpack5基礎(chǔ)(下)

    TypeScript 是一種靜態(tài)類型的編程語(yǔ)言,是 JavaScript 的一個(gè)超集。它由 微軟開發(fā),提供了許多 JavaScript 不支持的功能,比如 類型檢查 、 接口和類 。 ts-loader 是 Webpack 中的一個(gè)加載器,用于將 TypeScript 代碼轉(zhuǎn)換成 JavaScript 代碼。它是基于 typescript 編譯器實(shí)現(xiàn)的,支持所有 TypeS

    2024年02月16日
    瀏覽(22)
  • 前端工程化第一章:webpack5基礎(chǔ)(上)

    前端工程化第一章:webpack5基礎(chǔ)(上)

    Webpack 是一個(gè)現(xiàn)代 JavaScript 應(yīng)用程序的靜態(tài)模塊 打包器 。它是一個(gè)用于 將代碼編譯成瀏覽器可識(shí)別的格式 的工具。 webpack 可以實(shí)現(xiàn)以下的功能: 代碼轉(zhuǎn)換 : TypeScript 編譯成 JavaScript 、 SCSS 、 less 編譯成 CSS 等。 文件優(yōu)化 :壓縮 JavaScript 、 CSS 、 HTML 代碼, 壓縮合并圖片

    2024年02月16日
    瀏覽(32)
  • Vue3學(xué)習(xí)-01_前端工程化與webpack

    最近在學(xué)習(xí)Vue知識(shí),參照的教程是黑馬程序員官網(wǎng)提供的免費(fèi)前端教程,這里記錄一下自己的學(xué)習(xí)筆記以及遇到的相關(guān)問(wèn)題。 前端工程化指的是:在企業(yè)級(jí)的前端項(xiàng)目開發(fā)中,把前端開發(fā)所需的工具、技術(shù)、流程、經(jīng)驗(yàn)等進(jìn)行規(guī)范化、標(biāo)準(zhǔn)化。最終落實(shí)到細(xì)節(jié)上,就是實(shí)現(xiàn)前

    2024年02月13日
    瀏覽(30)
  • 【前端工程化面試題】如何優(yōu)化提高 webpack 的構(gòu)建速度

    【前端工程化面試題】如何優(yōu)化提高 webpack 的構(gòu)建速度

    使用最新版本的 Webpack 和相關(guān)插件 : 每個(gè)新版本的 Webpack 都會(huì)帶來(lái)性能方面的改進(jìn)和優(yōu)化,因此始終確保你在使用最新版本。同時(shí),更新你的相關(guān)插件也是同樣重要的。 使用DllPlugin動(dòng)態(tài)鏈接庫(kù): 使用DllPlugin和DllReferencePlugin來(lái)將第三方庫(kù)的代碼進(jìn)行預(yù)打包,減少構(gòu)建時(shí)間。這個(gè)

    2024年02月19日
    瀏覽(96)
  • 前端工程化之:webpack4-1(babel的安裝和使用)

    前端工程化之:webpack4-1(babel的安裝和使用)

    官網(wǎng):https://babeljs.io/ 民間中文網(wǎng):https://www.babeljs.cn/ ?babel一詞來(lái)自于希伯來(lái)語(yǔ),直譯為巴別塔。 巴別塔象征的統(tǒng)一的國(guó)度、統(tǒng)一的語(yǔ)言 而今天的 JS 世界缺少一座巴別塔,不同版本的瀏覽器能識(shí)別的 ES 標(biāo)準(zhǔn)并不相同,就導(dǎo)致了開發(fā)者面對(duì)不同版本的瀏覽器要使用不同的語(yǔ)言

    2024年02月21日
    瀏覽(68)
  • 【前端工程化面試題】webpack的module、bundle、chunk分別指的是什么?

    首先從語(yǔ)法方面 在配置文件中有 module 這個(gè)配置項(xiàng),里面有 rules 選項(xiàng)用來(lái)配置各種 loader,還有其他各種選項(xiàng),參考官網(wǎng)。 bundle 和?chunk 在配置文件中是沒有這個(gè)選項(xiàng)的,但是會(huì)出現(xiàn)在配置的值中。 module 模塊 指單個(gè)文件,可以是 js、css、圖片等, 每個(gè)文件都是一個(gè)獨(dú)立的模

    2024年02月19日
    瀏覽(89)
  • 【前端工程化面試題】webpack proxy的工作原理,為什么能解決跨域問(wèn)題

    【前端工程化面試題】webpack proxy的工作原理,為什么能解決跨域問(wèn)題

    在 webpack 的配置文件 webpack.config.js 中有一個(gè)配置項(xiàng) devServer 里面有一個(gè)屬性是 proxy,這里面可以配置代理服務(wù)器,解決跨域問(wèn)題,請(qǐng)參考官網(wǎng)。 一般來(lái)說(shuō) webpack 的代理就是說(shuō)的開發(fā)服務(wù)器 webpack-dev-server。 其實(shí)不光是 webpack 其他的打包工具比如是 vite,也有代理的功能,也是

    2024年02月21日
    瀏覽(96)
  • 前端工程化詳解——理解與實(shí)踐前端工程化

    前端工程化詳解——理解與實(shí)踐前端工程化

    前言: 前端工程化一直是一個(gè)老生常談的問(wèn)題,不管是面試還是我們?cè)诠咀龌ǘ紩?huì)經(jīng)常提到前端工程化,那么為什么經(jīng)常會(huì)說(shuō)到前端工程化,并沒有聽過(guò)后端工程化、Java工程化或者Python工程化呢?我們理解的前端工程化是不是一直都是Webpack的性能調(diào)優(yōu),或者是一個(gè)cli工

    2024年02月02日
    瀏覽(102)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包