dayjs 源碼解析(五)(dayjs 插件詳解)

前言

上一篇 dayjs 源碼解析(四)(Dayjs 類)介紹了 dayjs 的源碼目錄結構。接下來,本篇將分析一下 dayjs 中插件功能的用法、源碼以及如何編寫本身的 dayjs 插件。javascript

dayjs 插件用法

dayjs 的插件,經過掛載到 dayjs 函數下的 extend 函數加載,而後使用:java

import plugin // 導入插件
dayjs.extend(plugin) // 加載插件
dayjs.extend(plugin, options) // 或者加載插件的同時,加入插件所須要的參數

例子:使用官方的 IsLeapYear 插件segmentfault

import isLeapYear from 'dayjs/plugin/isLeapYear'

dayjs.extend(isLeapYear)

dayjs('2000-01-01').isLeapYear() // true

這就是 dayjs 插件的使用方法。api

dayjs 插件源碼(即 dayjs.extend() 方法)

// 擴展插件的方法
// plugin:插件函數
// option:插件的選項
dayjs.extend = (plugin, option) => {
  // 插件函數接受三個參數
  // 1.插件選項 2.Dayjs 類 3.dayjs 函數
  // 插件的方法都是掛載在 Dayjs 類的原型對象上的(Dayjs.prototype)。
  plugin(option, Dayjs, dayjs)
  return dayjs
}

dayjs.extend() 方法,接受兩個參數,即插件(函數)和插件的選項。函數

在 dayjs.extend() 方法中,直接調用傳入的插件(函數),且傳入三個參數:傳入 dayjs.extend() 方法的 option、Dayjs 類以及 dayjs 函數。this

最後,返回 dayjs 函數。prototype

而後,咱們來看一個官方的 isLeapYear 插件的源碼,看看它是怎麼寫的:插件

export default (o, c) => {
  const proto = c.prototype
  proto.isLeapYear = function () {
    return ((this.$y % 4 === 0) && (this.$y % 100 !== 0)) || (this.$y % 400 === 0)
  }
}

在 isLeapYear 插件源碼中,導出一個函數,該函數接受兩個參數(即在 dayjs.extend() 方法中的 option 和 Dayjs 類),而後將 isLeapYear 函數掛載到 Dayjs 類的原型對象上。所以,每一個 Dayjs 實例均可以使用 isLeapYear 方法。code

編寫本身的 dayjs 插件

經過閱讀插件的源碼,咱們知道了插件的方法,能夠掛載到 Dayjs 類上、Dayjs 類原型上以及 dayjs 函數對象上。而且,能夠經過插件選項(option),來對插件進行配置。
官方文檔也提供了插件開發的模板:orm

export default (option, dayjsClass, dayjsFactory) => {
  // 擴展 dayjs() 實例
  // 例:添加 dayjs().isSameOrBefore() 實例方法
  dayjsClass.prototype.isSameOrBefore = function (arguments) {}

  // 擴展 dayjs 類
  // 例:添加 dayjs.utc() 類方法
  dayjsFactory.utc = (arguments) => {}

  // 覆蓋已存在的 API
  // 例:擴展 dayjs().format() 方法
  const oldFormat = dayjsClass.prototype.format
  dayjsClass.prototype.format = function (arguments) {
    // 原始format結果
    const result = oldFormat(arguments)
    // 返回修改後結果
  }
}

經過插件,能夠很方便的進行 dayjs 庫的方法的擴展,來更好的服務咱們的具體的業務需求。

dayjs 源碼解析完。這五篇文章,也只是大概的解析了一下 dayjs 源碼的主要函數、方法和類,其餘 api 方法還須要本身一個一個去看。☺

總結

如何閱讀源碼?

  • 先從庫的 api 入手,看其如何使用
  • 而後再看源碼的入口函數或類,瞭解源碼的總體結構
  • 最後再具體看 api 的源碼
相關文章
相關標籤/搜索