魔改了一下Butterfly的源代码之后 hexo g 出现如下报错:

TypeError: coverVal.indexOf is not a function
at Hexo.<anonymous> (E:\Blog\themes\butterfly\scripts\filters\random_cover.js:15:30)
at Hexo.tryCatcher (E:\Blog\node_modules\bluebird\js\release\util.js:16:23)
at Hexo.<anonymous> (E:\Blog\node_modules\bluebird\js\release\method.js:15:34)
at E:\Blog\node_modules\hexo\dist\extend\filter.js:58:67
at tryCatcher (E:\Blog\node_modules\bluebird\js\release\util.js:16:23)
at Object.gotValue (E:\Blog\node_modules\bluebird\js\release\reduce.js:166:18)
at Object.gotAccum (E:\Blog\node_modules\bluebird\js\release\reduce.js:155:25)
at Object.tryCatcher (E:\Blog\node_modules\bluebird\js\release\util.js:16:23)
at Promise._settlePromiseFromHandler (E:\Blog\node_modules\bluebird\js\release\promise.js:547:31)
at Promise._settlePromise (E:\Blog\node_modules\bluebird\js\release\promise.js:604:18)
at Promise._settlePromise0 (E:\Blog\node_modules\bluebird\js\release\promise.js:649:10)
at Promise._settlePromises (E:\Blog\node_modules\bluebird\js\release\promise.js:729:18)
at _drainQueueStep (E:\Blog\node_modules\bluebird\js\release\async.js:93:12)
at _drainQueue (E:\Blog\node_modules\bluebird\js\release\async.js:86:9)
at Async._drainQueues (E:\Blog\node_modules\bluebird\js\release\async.js:102:5)
at Immediate.Async.drainQueues [as _onImmediate] (E:\Blog\node_modules\bluebird\js\release\async.js:15:14)
at processImmediate (internal/timers.js:464:21)

打开 .\themes\butterfly\scripts\filters\random_cover.js 文件如下:

/**
* Butterfly
* ramdom cover
*/

'use strict'

hexo.extend.filter.register('before_post_render', data => {
const imgTestReg = /\.(png|jpe?g|gif|svg|webp)(\?.*)?$/i
let { cover: coverVal, top_img: topImg } = data

// Add path to top_img and cover if post_asset_folder is enabled
if (hexo.config.post_asset_folder) {
if (topImg && topImg.indexOf('/') === -1 && imgTestReg.test(topImg)) data.top_img = `${data.path}${topImg}`
if (coverVal && coverVal.indexOf('/') === -1 && imgTestReg.test(coverVal)) data.cover = `${data.path}${coverVal}`
}

const randomCoverFn = () => {
const { cover: { default_cover: defaultCover } } = hexo.theme.config
if (!defaultCover) return false
if (!Array.isArray(defaultCover)) return defaultCover
const num = Math.floor(Math.random() * defaultCover.length)
return defaultCover[num]
}

if (coverVal === false) return data

// If cover is not set, use random cover
if (!coverVal) {
const randomCover = randomCoverFn()
data.cover = randomCover
coverVal = randomCover // update coverVal
}

if (coverVal && (coverVal.indexOf('//') !== -1 || imgTestReg.test(coverVal))) {
data.cover_type = 'img'
}

return data
})

将文件内容修改为:

/**
* Butterfly
* random cover
*/

'use strict'

hexo.extend.filter.register('before_post_render', data => {
const imgTestReg = /\.(png|jpe?g|gif|svg|webp)(\?.*)?$/i
let { cover: coverVal, top_img: topImg } = data
const postAssetFolder = hexo.config.post_asset_folder
const defaultCover = hexo.theme.config.cover.default_cover

// Cache random cover if needed
let randomCover;
const randomCoverFn = () => {
if (!defaultCover) return false
if (!Array.isArray(defaultCover)) return defaultCover
if (!randomCover) {
const num = Math.floor(Math.random() * defaultCover.length)
randomCover = defaultCover[num]
}
return randomCover
}

// Add path to top_img and cover if post_asset_folder is enabled
if (postAssetFolder) {
if (typeof topImg === 'string' && topImg.indexOf('/') === -1 && imgTestReg.test(topImg)) {
data.top_img = `${data.path}${topImg}`
}
if (typeof coverVal === 'string' && coverVal.indexOf('/') === -1 && imgTestReg.test(coverVal)) {
data.cover = `${data.path}${coverVal}`
}
}

if (coverVal === false) return data

// If cover is not set, use random cover
if (!coverVal) {
const randomCover = randomCoverFn()
data.cover = randomCover
coverVal = randomCover // update coverVal
}

if (typeof coverVal === 'string' && (coverVal.indexOf('//') !== -1 || imgTestReg.test(coverVal))) {
data.cover_type = 'img'
}

return data
})

做的改动有:

  1. 变量声明优化:将 postAssetFolder 和 defaultCover 单独提取出来,避免多次访问配置。
  2. 缓存随机封面:添加了 randomCover 变量,用于缓存随机封面,避免重复计算。
  3. 类型检查:在使用 indexOf 之前,增加了对 topImg 和 coverVal 的类型检查,确保它们是字符串。
  4. 逻辑优化:在 randomCoverFn 中,增加了对 randomCover 的缓存检查,避免多次随机选择。