亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

webpack自定義loader全面詳解

 更新時(shí)間:2023年01月04日 10:57:19   作者:摸魚的湯姆  
這篇文章主要為大家介紹了webpack自定義loader全面詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是loader?

因?yàn)閣ebpack不識(shí)別非js結(jié)尾的文件,所以需要借助loader來告訴webpack如何對(duì)這些文件進(jìn)行處理和輸出的 loader都有哪些類型

loader類型

loader在webpack 中有四種loader:

  • pre(前置)
  • normal(普通)
  • inline(行內(nèi))
  • post(后置)

loader的執(zhí)行順序:pre>normal>inline>loader

如何指定loader類型

在webpack中通過Rule.enforce來指定loader的類型

{
test: /\.less$/,
use: 'less-loader',
enforce: 'pre'
}

如果沒有enforce就會(huì)指定為普通的loader

如何禁用一些loader?

比如說一個(gè)eslint-loader,有的的開發(fā)者可能使用不了,但是不能干擾到其他同事,可以選擇直接禁用它

require('!inline-loader!./a.js') 使用 ! 禁用配置文件中的普通loader

require('-!inline-loader!./a.js') 使用-!禁用所有的前置和普通loader

require('!!inline-loader!./a.js') 使用!! 禁用所有的后置和普通loader

下面開始直奔主題,開始說說url-loader和file-loader

為什么要用url-loader和file-loader?

url-loader和file-loader在webpack中是最常用的兩個(gè)loaderl了,首先這兩個(gè)loader存在一個(gè)相同點(diǎn),上面已經(jīng)提到webpack不能處理像css,scss,less,jpg,svg或者是其他文件格式的資源,這個(gè)時(shí)候就需要借助這兩個(gè)loader其中一個(gè)去處理。

下面說一下這兩個(gè)loader的區(qū)別

相同點(diǎn):這兩個(gè)loader都是用來處理在webpack編譯的時(shí)候不能識(shí)別的文件格式

不同點(diǎn):url-loader會(huì)在特定的條件下將資源輸出為base64編碼格式,為什么說在特定條件下,用過此loader的人都知道有一個(gè)limit的配置,通過這個(gè)配置來識(shí)別文件以哪種格式輸出,并且在他內(nèi)部也引用了file-loader,file-loader就是講webpack不能識(shí)別的文件進(jìn)行編譯,并輸出到指定的目錄,url-loader就相當(dāng)于對(duì)file-loader進(jìn)行了二次封裝,所以現(xiàn)在還是url-loader用的比較多一些。

開發(fā)自定義兩個(gè)loader,并分別實(shí)現(xiàn)url-loader和file-loader

在編寫源碼之前需要安裝三個(gè)依賴,分別是:

  • loader-utils loader的工具庫
  • mime 文件類型匹配
  • schema-utils 驗(yàn)證loader參數(shù)

file-loader

  • 創(chuàng)建文件loader/file-loader.js
const LoaderUtils = require('loader-utils')
module.exports = function(content,map,mate){
   //   1. 獲取參數(shù)
   var options = loaderUtils.getOptions(this) || {};    
   //   2. 是否使用ESM導(dǎo)出 
   const esModule = typeof options.esModule !== 'undefined' ? options.esModule : true; 
   //   3. 根據(jù)文件生成帶hash值文件名
   const publicPath = LoaderUtils.interpolateName(this,"[hash].[ext][query]",content);
   //   4. 將文件輸出出去
   this.emitFile(publicPath,content)
   //   5. export 文件名
   return `${esModule ? 'export default' : 'module.exports ='}${publicPath}`;  
}
// 需要處理 文件 ,圖片等文件格式都是 buffer格式的 需要使用rawloader才能處理
module.exports.raw = true;

url-loader

  • 創(chuàng)建文件loader/option.json
{
    "type":"object",
    "properties":{
         "limit":{
             "type":["string","number"]
         },
         "mimeType":{
              "type":"string"
         },
         "esModule":{
            "type":"boolean"
       } 
    }
}
  • 創(chuàng)建文件loader/url-loader.js
var loaderUtils = require("loader-utils");
var mime = require("mime");
var validate = require("schema-utils"); 
var schema = require('./option.json');
function shouldTransform(limit, size){
	if (typeof limit === 'boolean') {
	  return limit;
	}
	if (typeof limit === 'string') {
	  return size <= parseInt(limit, 10);
	}
	if (typeof limit === 'number') {
	  return size <= limit;
	}
	return true;
  }
module.exports = function(content) {  
	// 1. 獲取參數(shù)
	var query = loaderUtils.getOptions(this) || {};
	// 2. 驗(yàn)證參數(shù) - 當(dāng)出現(xiàn)錯(cuò)誤的時(shí)候會(huì)自動(dòng)拋出錯(cuò)誤 
	validate(schema, query,{name:'url-loader'});
	// 3. 文件大小限制
	var limit = (this.options && this.options.url && this.options.url.dataUrlLimit) || 0;
	// 2.0+版本以后新增的esModuleApi
	let esModule = query.esModule 
	// 類型
	var mimetype = query.mimetype || query.minetype || mime.lookup(this.resourcePath);
	// 通過文件大小
	if(shouldTransform(query.limit,content.length)){
	// 如果比較文件小于limit 以base64的形式去展示 
		return `${esModule ? 'export default' : 'module.exports ='}` + JSON.stringify("data:" + (mimetype ? mimetype + ";" : "") + "base64," + content.toString("base64"));
	} else {
    // 這里引入我們自己的file-loader 
	// 如果比較文件大于limit,以u(píng)rl的形式展示
		var fileLoader = require("./file-loader.js");
		return fileLoader.call(this, content);
	}
}
module.exports.raw = true;

如何測(cè)試使用

在loader統(tǒng)計(jì)目錄下創(chuàng)建webpack.config.js,只需要驗(yàn)證url-loader就可以了,因?yàn)閮?nèi)部已經(jīng)有file-loader的導(dǎo)入

// webpack.config.js 中
{
oneOf:[
    {
        test:/\.js$/,
        use:[
        {
            test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
            loader: './loader/url-loader.js', 
            exclude: [resolve('src/icons')],
            options: {
            limit: 10000,
            // 名稱
            name: utils.assetsPath('img/[name].[hash:7].[ext]')
            }
        },
        ]
    }
]
},

本篇文章主要介紹loader的基礎(chǔ)知識(shí)和如何去開發(fā)自定義loader,并介紹了兩個(gè)常用的loaderurl-loaderfile-loader,也進(jìn)行了基本的實(shí)現(xiàn),通過本片文章希望你能對(duì)webpack的loader的使用以及開發(fā)有一個(gè)基本的認(rèn)識(shí),更多關(guān)于webpack自定義loader的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript比較兩個(gè)數(shù)組的內(nèi)容是否相同(推薦)

    JavaScript比較兩個(gè)數(shù)組的內(nèi)容是否相同(推薦)

    這篇文章主要介紹了JavaScript如何比較兩個(gè)數(shù)組的內(nèi)容是否相同的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 詳解JavaScript的內(nèi)置對(duì)象

    詳解JavaScript的內(nèi)置對(duì)象

    本文對(duì)JavaScript對(duì)象的屬性、對(duì)象的方法、對(duì)象的屬性、訪問對(duì)象屬性的語法進(jìn)行了實(shí)例分析介紹,有需要的朋友可以看下
    2016-12-12
  • 談一談js中的執(zhí)行環(huán)境及作用域

    談一談js中的執(zhí)行環(huán)境及作用域

    這篇文章主要和大家一起談一談js中的執(zhí)行環(huán)境及作用域,本文依據(jù)面試過程中遇到的問題進(jìn)行探討,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Js冒泡事件詳解及阻止示例

    Js冒泡事件詳解及阻止示例

    如果某元素定義了事件A,如click事件,如果觸發(fā)了事件之后,沒有阻止冒泡事件,那么事件將向父級(jí)元素傳播
    2014-03-03
  • JS實(shí)現(xiàn)時(shí)間選擇器

    JS實(shí)現(xiàn)時(shí)間選擇器

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)時(shí)間選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • js刪除對(duì)象中的某一個(gè)字段的方法實(shí)現(xiàn)

    js刪除對(duì)象中的某一個(gè)字段的方法實(shí)現(xiàn)

    這篇文章主要介紹了js刪除對(duì)象中的某一個(gè)字段的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • javascript垃圾收集機(jī)制與內(nèi)存泄漏詳細(xì)解析

    javascript垃圾收集機(jī)制與內(nèi)存泄漏詳細(xì)解析

    本文是對(duì)javascript中的垃圾收集機(jī)制與內(nèi)存泄漏進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-11-11
  • 原生JS實(shí)現(xiàn)循環(huán)Nodelist Dom列表的4種方式示例

    原生JS實(shí)現(xiàn)循環(huán)Nodelist Dom列表的4種方式示例

    這篇文章主要介紹了原生JS實(shí)現(xiàn)循環(huán)Nodelist Dom列表的4種方式,結(jié)合具體實(shí)例形式分析了javascript循環(huán)遍歷Nodelist Dom列表的常用操作技巧,需要的朋友可以參考下
    2018-02-02
  • ES7之Async/await的使用詳解

    ES7之Async/await的使用詳解

    這篇文章主要介紹了ES7之Async/await的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • uniapp中scroll-view基礎(chǔ)用法示例代碼

    uniapp中scroll-view基礎(chǔ)用法示例代碼

    我們?cè)陧?xiàng)目中往往都能遇到實(shí)現(xiàn)左右滑動(dòng)跟上下滑動(dòng)的需求,下面這篇文章主要給大家介紹了關(guān)于uniapp中scroll-view基礎(chǔ)用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評(píng)論