最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

webpack源碼之loader機制詳解

 更新時間:2018年04月06日 10:36:33   作者:jsdt  
本篇文章主要介紹了webpack源碼之loader機制詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

loader概念

loader是用來加載處理各種形式的資源,本質(zhì)上是一個函數(shù), 接受文件作為參數(shù),返回轉(zhuǎn)化后的結(jié)構(gòu)。

loader 用于對模塊的源代碼進行轉(zhuǎn)換。loader 可以使你在 import 或"加載"模塊時預(yù)處理文件。因此,loader 類似于其他構(gòu)建工具中“任務(wù)(task)”,并提供了處理前端構(gòu)建步驟的強大方法。loader 可以將文件從不同的語言(如 TypeScript)轉(zhuǎn)換為 JavaScript,或?qū)?nèi)聯(lián)圖像轉(zhuǎn)換為 data URL。loader 甚至允許你直接在 JavaScript 模塊中 import CSS文件!

loader和plugin區(qū)別

之前一篇文章中介紹了plugin機制,和今天研究的對象loader,他們兩者在一起極大的拓展了webpack的功能。它們的區(qū)別就是loader是用來對模塊的源代碼進行轉(zhuǎn)換,而插件目的在于解決 loader 無法實現(xiàn)的其他事。為什么這么多說呢?因為plugin可以在任何階段調(diào)用,能夠跨Loader進一步加工Loader的輸出,在構(gòu)建運行期間,觸發(fā)事件,執(zhí)行預(yù)先注冊的回調(diào),使用compilation對象做一些更底層的事情。

loader用法

配置

module: {
  rules: [
   {
    test: /\.css$/,
    use: [
     { loader: 'style-loader' },
     {
      loader: 'css-loader'
     }
    ]
   }
  ]
 }

內(nèi)聯(lián)

import Styles from 'style-loader!css-loader?modules!./styles.css';

CLI

webpack --module-bind 'css=style-loader!css-loader'

說明 上面三種使用方法作用都是將一組鏈式的 loader, 按照從右往左的順序執(zhí)行,loader 鏈中的第一個 loader 返回值給下一個 loader。先使用css-loader解析 @import 和 url()路徑中指定的css內(nèi)容,然后用style-loader 會把原來的 CSS 代碼插入頁面中的一個 style 標簽中。

loader實現(xiàn)

//將css插入到head標簽內(nèi)部
module.exports = function (source) {
  let script = (`
   let style = document.createElement("style");
   style.innerText = ${JSON.stringify(source)};
   document.head.appendChild(style);
  `);
  return script;
}
//使用方式1
resolveLoader: {
  modules: [path.resolve('node_modules'), path.resolve(__dirname, 'src', 'loaders')]
},
{
  test: /\.css$/,
  use: ['style-loader']
},
//使用方式2
//將自己寫的loaders發(fā)布到npm倉庫,然后添加到依賴,按照方式1中的配置方式使用即可

說明 上面是一個簡單的loader實現(xiàn),同步的方式執(zhí)行,相當(dāng)于實現(xiàn)了style-loader的功能。

loader原理

function iteratePitchingLoaders(options, loaderContext, callback) {
  var currentLoaderObject = loaderContext.loaders[loaderContext.loaderIndex];
  // load loader module
  loadLoader(currentLoaderObject, function(err) {
    var fn = currentLoaderObject.pitch;
    runSyncOrAsync(
      fn,
      loaderContext, [loaderContext.remainingRequest, loaderContext.previousRequest, currentLoaderObject.data = {}],
      function(err) {
        if(err) return callback(err);
        var args = Array.prototype.slice.call(arguments, 1);
        if(args.length > 0) {
          loaderContext.loaderIndex--;
          iterateNormalLoaders(options, loaderContext, args, callback);
        } else {
          iteratePitchingLoaders(options, loaderContext, callback);
        }
      }
    );
  });
}

說明 上面是webpack源碼中l(wèi)oader執(zhí)行關(guān)鍵步驟,遞歸的方式執(zhí)行l(wèi)oader,執(zhí)行機流程似于express中間件機制

參考源碼

  1. webpack: "4.4.1"
  2. webpack-cli: "2.0.13"

參考文檔
https://webpack.js.org/concepts/loaders/

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • webpack 動態(tài)批量加載文件的實現(xiàn)方法

    webpack 動態(tài)批量加載文件的實現(xiàn)方法

    這篇文章主要介紹了webpack 動態(tài)批量加載文件的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • js判斷主流瀏覽器類型和版本號的簡單實現(xiàn)代碼

    js判斷主流瀏覽器類型和版本號的簡單實現(xiàn)代碼

    下面小編就為大家?guī)硪黄猨s判斷主流瀏覽器類型和版本號的簡單實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • 使用JavaScript?將數(shù)據(jù)網(wǎng)格綁定到?GraphQL?服務(wù)的操作方法

    使用JavaScript?將數(shù)據(jù)網(wǎng)格綁定到?GraphQL?服務(wù)的操作方法

    GraphQL是管理JavaScript應(yīng)用程序中數(shù)據(jù)的優(yōu)秀工具,本教程展示了GraphQL和SpreadJS如何簡單地構(gòu)建應(yīng)用程序,?GraphQL?和?SpreadJS都有更多功能可供探索,因此您可以做的事情遠遠超出了這個示例,感興趣的朋友一起看看吧
    2023-11-11
  • uni-app調(diào)取接口的3種方式以及封裝uni.request()詳解

    uni-app調(diào)取接口的3種方式以及封裝uni.request()詳解

    我們在實際工作中要將數(shù)據(jù)傳輸?shù)椒?wù)器端,從服務(wù)器端獲取信息,都是通過接口的形式,下面這篇文章主要給大家介紹了關(guān)于uni-app調(diào)取接口的3種方式以及封裝uni.request()的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • JS使用遮罩實現(xiàn)點擊某區(qū)域以外時彈窗的彈出與關(guān)閉功能示例

    JS使用遮罩實現(xiàn)點擊某區(qū)域以外時彈窗的彈出與關(guān)閉功能示例

    這篇文章主要介紹了JS使用遮罩實現(xiàn)點擊某區(qū)域以外時彈窗的彈出與關(guān)閉功能,結(jié)合實例形式分析了javascript事件響應(yīng)及頁面元素屬性動態(tài)操作彈出與關(guān)閉遮罩層相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-07-07
  • js canvas實現(xiàn)簡單的圖像擴散效果

    js canvas實現(xiàn)簡單的圖像擴散效果

    這篇文章主要為大家詳細介紹了js canvas實現(xiàn)簡單的圖像擴散效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • jQuery 實現(xiàn)倒計時天,時,分,秒功能

    jQuery 實現(xiàn)倒計時天,時,分,秒功能

    本文通過html代碼和js代碼給大家介紹了實現(xiàn)倒計時天,時,分,秒功能,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-07-07
  • JavaScript使用WebSocket實現(xiàn)實時通信的技術(shù)詳解

    JavaScript使用WebSocket實現(xiàn)實時通信的技術(shù)詳解

    WebSocket作為一種高效的通信協(xié)議,為開發(fā)者提供了一種在客戶端和服務(wù)器之間進行全雙工通信的方法,本文將深入探討WebSocket技術(shù),并提供實戰(zhàn)代碼示例
    2024-04-04
  • Echart結(jié)合圓形實現(xiàn)儀表盤的繪制詳解

    Echart結(jié)合圓形實現(xiàn)儀表盤的繪制詳解

    EChart開源來自百度商業(yè)前端數(shù)據(jù)可視化團隊,基于html5?Canvas,是一個純Javascript圖表庫,提供直觀,生動,可交互,可個性化定制的數(shù)據(jù)可視化圖表。本文將利用EChart實現(xiàn)儀表盤的繪制,感興趣的可以學(xué)習(xí)一下
    2022-03-03
  • laydate 顯示結(jié)束時間不小于開始時間的實例

    laydate 顯示結(jié)束時間不小于開始時間的實例

    下面小編就為大家?guī)硪黄猯aydate 顯示結(jié)束時間不小于開始時間的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08

最新評論

章丘市| 富宁县| 新野县| 睢宁县| 孝昌县| 新龙县| 精河县| 渝中区| 博兴县| 上林县| 顺昌县| 灌南县| 界首市| 长乐市| 武夷山市| 鄄城县| 尚志市| 大余县| 繁昌县| 阿城市| 安徽省| 台北市| 河西区| 平昌县| 黎城县| 蒙自县| 定襄县| 罗定市| 南皮县| 宁波市| 麟游县| 应用必备| 融水| 余干县| 邻水| 英吉沙县| 吉安市| 肥城市| 谢通门县| 临高县| 邹城市|