成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS每日一題:Webpack如何實(shí)現(xiàn)一個(gè)Loader?

HollisChuang / 1435人閱讀

摘要:期如何實(shí)現(xiàn)一個(gè)我們?cè)谏蠋坠?jié)有講過(guò)今天我們來(lái)深入了解它們最暴力的方式莫過(guò)于動(dòng)手實(shí)現(xiàn)它們好了,回到正題先來(lái)回顧一下定義用于對(duì)模塊的源代碼進(jìn)行轉(zhuǎn)換??梢允鼓阍诨蚣虞d模塊時(shí)預(yù)處理文件簡(jiǎn)單使用是導(dǎo)出為一個(gè)函數(shù)的模塊。

20190329期

如何實(shí)現(xiàn)一個(gè)Loader?

我們?cè)谏蠋坠?jié)有講過(guò)loader,今天我們來(lái)深入了解它們,最暴力的方式莫過(guò)于動(dòng)手實(shí)現(xiàn)它們

好了,回到正題, 先來(lái)回顧一下loader

loader定義: 用于對(duì)模塊的源代碼進(jìn)行轉(zhuǎn)換。loader 可以使你在 import 或"加載"模塊時(shí)預(yù)處理文件

簡(jiǎn)單使用

module.exports = {
  //...
  module: {
    rules: [
      {
        test: /.js$/,
        use: [
          {
            // loader 是導(dǎo)出為一個(gè)a函數(shù)的 node 模塊。該函數(shù)在 loader 轉(zhuǎn)換資源的時(shí)候調(diào)用
            // 給定的函數(shù)將調(diào)用 loader API,并通過(guò) this 上下文訪問(wèn)
            loader: path.resolve("loader.js"),
            options: {/* ... */}
          }
        ]
      }
    ]
  }
};

回顧了loader的定義及簡(jiǎn)單使用后,我們?cè)賮?lái)分析一下實(shí)現(xiàn)loader的思路

單一職責(zé),一個(gè)loader只做一件事

鏈?zhǔn)浇M合,鏈中的每個(gè) loader 會(huì)將轉(zhuǎn)換應(yīng)用在已處理過(guò)的資源上

模塊化,是導(dǎo)出為一個(gè)函數(shù)的 node 模塊

參數(shù)合并,loader 可以通過(guò) options 對(duì)象配置

基于上面分析的幾點(diǎn),我們開(kāi)始動(dòng)手

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

我們發(fā)現(xiàn)上面直接使用了return,是因?yàn)槭峭筋惖膌oader且返回的內(nèi)容唯一,如果你希望你的loader支持鏈?zhǔn)秸{(diào)用,將結(jié)果返給下一個(gè)loader繼續(xù)使用,這時(shí)候就需要用webpack提供的api

這里我們簡(jiǎn)單看一下this.callback的定義,一個(gè)可以同步或者異步調(diào)用的可以返回多個(gè)結(jié)果的函數(shù)。預(yù)期的參數(shù)是

this.callback(
  err: Error | null,
  content: string | Buffer,
  sourceMap?: SourceMap,
  meta?: any
)
// loader-utils 它提供了很多有用的工具
// 最常用的一個(gè)就是獲取傳入 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)
}

手寫(xiě)一個(gè)loader對(duì)沒(méi)有研究過(guò)的聽(tīng)上去好像有點(diǎn)難,事實(shí)上, 掌握上面所介紹的內(nèi)容及思想,就可以開(kāi)始寫(xiě)一個(gè)簡(jiǎn)單的 Loader 了, 我們?cè)賮?lái)用簡(jiǎn)單的代碼綏一下loader到底是什么?

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

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

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

this.async() 當(dāng)一個(gè)loader無(wú)依賴時(shí),我們應(yīng)該異步的去返回結(jié)果

案例分析

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

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));
}
總結(jié)

loader是一個(gè)node模塊

編寫(xiě)loader時(shí)要遵循單一原則,每個(gè)loader只做一種"轉(zhuǎn)義"工作

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

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

關(guān)于JS每日一題

JS每日一題可以看成是一個(gè)語(yǔ)音答題社區(qū)
每天利用碎片時(shí)間采用60秒內(nèi)的語(yǔ)音形式來(lái)完成當(dāng)天的考題
群主在次日0點(diǎn)推送當(dāng)天的參考答案

注 絕不僅限于完成當(dāng)天任務(wù),更多是查漏補(bǔ)缺,學(xué)習(xí)群內(nèi)其它同學(xué)優(yōu)秀的答題思路

點(diǎn)擊加入答題

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109356.html

相關(guān)文章

  • JS每日一題Webpack有哪些常見(jiàn)的Loader?他們是解決什么問(wèn)題的?

    摘要:期有哪些常見(jiàn)的他們是解決什么問(wèn)題的在回答之前我們先來(lái)了解一下我們?cè)谏弦还?jié)講過(guò),是屬于模塊化方案,他能讓任意類型的文件都能運(yùn)行在瀏覽器中,怎么做到呢這時(shí)就有了定義用于對(duì)模塊的源代碼進(jìn)行轉(zhuǎn)換。 20190326期 Webpack有哪些常見(jiàn)的Loader?他們是解決什么問(wèn)題的? 在回答之前我們先來(lái)了解一下Loader 我們?cè)谏弦还?jié)講過(guò),webpack是屬于模塊化方案,他能讓任意類型的文件都能...

    Hanks10100 評(píng)論0 收藏0
  • JS每日一題:Webpack有哪些常見(jiàn)的Plugin?他們是解決什么問(wèn)題的

    摘要:期有哪些常見(jiàn)的他們是解決什么問(wèn)題的定義音譯過(guò)來(lái)就是插件在中插件目的在于解決無(wú)法實(shí)現(xiàn)的其他事插件是一個(gè)具有屬性的對(duì)象。 20190327期 Webpack有哪些常見(jiàn)的Plugin?他們是解決什么問(wèn)題的 定義: 音譯過(guò)來(lái)就是插件, 在webpack中, 插件目的在于解決 loader 無(wú)法實(shí)現(xiàn)的其他事 webpack 插件是一個(gè)具有 apply 屬性的 JavaScript 對(duì)象。appl...

    songze 評(píng)論0 收藏0
  • 我的前端面試

    摘要:前言這次找工作也面了好幾家公司,也通過(guò)了好幾家公司的面試,畢竟之前也準(zhǔn)備了一段時(shí)間,所以面試的時(shí)候心里也不是很虛。的代碼分割怎么實(shí)現(xiàn)的說(shuō)說(shuō)剛才提到的和的區(qū)別前端緩存怎么實(shí)現(xiàn)扯扯強(qiáng)緩存和協(xié)商緩存,重點(diǎn)問(wèn)了如何實(shí)現(xiàn)緩存二面就聊了項(xiàng)目。。。 前言 這次找工作也面了好幾家公司,也通過(guò)了好幾家公司的面試,畢竟之前也準(zhǔn)備了一段時(shí)間,所以面試的時(shí)候心里也不是很虛。 這里記錄一下面試過(guò)程中被問(wèn)到的問(wèn)題...

    meteor199 評(píng)論0 收藏0
  • JS每日一題如何理解es6中的Proxy?

    20190124問(wèn): 如何理解es6中的Proxy? 試題解析:對(duì)proxy的理解,可能會(huì)延伸到vue的雙向綁定 Proxy(代理) 定義 可以理解為為目標(biāo)對(duì)象架設(shè)一層攔截,外界對(duì)該對(duì)象的訪問(wèn),都必須通過(guò)這層攔截 簡(jiǎn)單示例: const obj = new Proxy({}, { get: (target, key, receiver) => { return JS ...

    tinysun1234 評(píng)論0 收藏0
  • JS每日一題如何理解es6中的Proxy?

    20190124問(wèn): 如何理解es6中的Proxy? 試題解析:對(duì)proxy的理解,可能會(huì)延伸到vue的雙向綁定 Proxy(代理) 定義 可以理解為為目標(biāo)對(duì)象架設(shè)一層攔截,外界對(duì)該對(duì)象的訪問(wèn),都必須通過(guò)這層攔截 簡(jiǎn)單示例: const obj = new Proxy({}, { get: (target, key, receiver) => { return JS ...

    PumpkinDylan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<