中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Webpack實現Loader的方法

發布時間:2020-08-26 11:14:36 來源:億速云 閱讀:131 作者:小新 欄目:web開發

小編給大家分享一下Webpack實現Loader的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

如何實現一個Loader?

我們在上幾節有講過loader,今天我們來深入了解它們,最暴力的方式莫過于動手實現它們

好了,回到正題, 先來回顧一下loader

loader定義: 用于對模塊的源代碼進行轉換。loader 可以使你在 import 或"加載"模塊時預處理文件

簡單使用

module.exports = {
  //...
  module: {
    rules: [
      {
        test: /\.js$/,
        use: [
          {
            // loader 是導出為一個a函數的 node 模塊。該函數在 loader 轉換資源的時候調用
            // 給定的函數將調用 loader API,并通過 this 上下文訪問
            loader: path.resolve('loader.js'),
            options: {/* ... */}
          }
        ]
      }
    ]
  }
};

回顧了loader的定義及簡單使用后,我們再來分析一下實現loader的思路

單一職責,一個loader只做一件事

鏈式組合,鏈中的每個 loader 會將轉換應用在已處理過的資源上

模塊化,是導出為一個函數的 node 模塊

參數合并,loader 可以通過 options 對象配置

基于上面分析的幾點,我們開始動手

// 這個就是一個最簡單loader,
// 如果我們的loader有依賴其它模塊,也得以module的寫法將在在頂部引入
import fs from 'fs';
export default function(source){
    return source
}

我們發現上面直接使用了return,是因為是同步類的loader且返回的內容唯一,如果你希望你的loader支持鏈式調用,將結果返給下一個loader繼續使用,這時候就需要用webpack提供的api

這里我們簡單看一下this.callback的定義,一個可以同步或者異步調用的可以返回多個結果的函數。預期的參數是

this.callback(
  err: Error | null,
  content: string | Buffer,
  sourceMap?: SourceMap,
  meta?: any
)
// loader-utils 它提供了很多有用的工具
// 最常用的一個就是獲取傳入 loader 的 options
import { getOptions } from 'loader-utils';
export default function(source, other) {
  const options = getOptions(this)    
  // do whatever you want
  // ...
  this.callback(null, source, other)
}

手寫一個loader對沒有研究過的聽上去好像有點難,事實上, 掌握上面所介紹的內容及思想,就可以開始寫一個簡單的 Loader 了, 我們再來用簡單的代碼綏一下loader到底是什么?

// 首先loader它是一個node模塊,這很好理解
export const lessToCss = function(source, other) {
    // source 就是你即將要轉換的文件源
    // TODO
    // 將轉換好的文件源流轉至一個管道
    this.callback(null, source, other)
}
讓你的loader更好用

loader api中有幾個好用的家伙這里就順便帶一下

this.cacheable() 從提高執行效率上,如何處理利用緩存是極其重要的, webpack 中this.cacheable就可以輕松將loader緩存了

this.async() 當一個loader無依賴時,我們應該異步的去返回結果

案例分析

下方貼上less-loader的源碼,代碼很簡潔,結合上方我們所分析的,也很容易理解

import processResult from './processResult';
const render = pify(less.render.bind(less));

function lessLoader(source) {
  const loaderContext = this;
  const options = getOptions(loaderContext);
  const done = loaderContext.async();
  const isSync = typeof done !== 'function';

  if (isSync) {
    throw new Error(
      'Synchronous compilation is not supported anymore. See https://github.com/webpack-contrib/less-loader/issues/84'
    );
  }
  processResult(loaderContext, render(source, options));
}

總結

loader是一個node模塊

編寫loader時要遵循單一原則,每個loader只做一種"轉義"工作

webpack為我們提供了豐富的loader api

webpack為我們還提供了工具函數集——loader-utils

看完了這篇文章,相信你對Webpack實現Loader的方法有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昆山市| 砀山县| 济南市| 乌鲁木齐市| 昌平区| 高清| 仪陇县| 茶陵县| 安远县| 台湾省| 佛山市| 姚安县| 朝阳区| 清流县| 大埔县| 新源县| 深水埗区| 石棉县| 车致| 密山市| 锡林浩特市| 将乐县| 静安区| 大洼县| 九龙城区| 大埔区| 米林县| 马山县| 灵璧县| 涿鹿县| 尼木县| 永顺县| 晋江市| 林芝县| 上饶市| 藁城市| 凌云县| 临漳县| 文登市| 曲靖市| 邯郸县|