我正在寻找一种方法来保持在模块范围内声明的函数,导出它们,并允许它们包装在一个完全不同的文件中,并导出所有模块的包装副本。问题:包装工作,但它只包装被调用的函数,该函数仍然调用未包装的反零件。在不改变原始编写模块的范围的情况下,有没有办法告诉日志版本,只使用其他记录版本?
colors.js
let green = () => 'green'
let red = () => 'red'
let purple = () => 'purple'
let colors = () => green() + red() + purple()
module.exports = {
red,
green,
purple,
colors
}
colors.log.js
const {logWrapFns} = require('./index')
let {
red,
green,
purple,
colors
} = require('./colors')
;[red, green, purple, colors] = logWrapFns('color')([
red,
green,
purple,
colors
])
module.exports = {
red,
green,
purple,
colors
}
debugFns.js
const {map, mapValues, get} = require('lodash')
const debug = require('debug')
const logWrapFn = (scope) => (fn, key) => (...input) => {
const d = debug(`${scope}:${fn.name || key}`)
d(JSON.stringify({input}))
const possiblePromise = fn.apply(null, input)
if (get(possiblePromise, 'then')) {
return possiblePromise.then(output => {
d(JSON.stringify({output}))
return output
})
} else {
d(JSON.stringify({output: possiblePromise}))
return possiblePromise
}
}
const logWrapFnsReturnObj = (scope) => (fns) => mapValues(fns, logWrapFn(scope))
const logWrapFnsReturnArr = (scope) => (fns) => map(fns, logWrapFn(scope))
module.exports = {
logWrapFn,
logWrapFns
}
usage.js
const colors = require('./colors.log')
console.log(colors)
console.log(colors.green())
仅记录green
的调试语句,而不是其余的。
我知道如果我使用class
并使用static
方法创建模块,这是可能的,但是我必须使用额外的类名调用每个方法,这是我想要的避免。
答案 0 :(得分:0)
不,在不修改原始模块代码的情况下,无法使原始colors
函数调用除原始green
/ red
/ purple
函数之外的其他函数
您不需要使用class
静态方法(you shouldn't do that anyway)。我建议将模块重写为
// notice this === exports
this.green = () => 'green'
this.red = () => 'red'
this.purple = () => 'purple'
this.colors = () => this.green() + this.red() + this.purple()
其中colors
将其他函数作为module.exports
对象的方法调用,您可以在其中用包装版本替换它们:
// colors.log.js
const logWrap = require('./debugFns').logWrapFn('color')
const c = module.exports = require('./colors')
c.red = logWrap(c.red)
c.green = logWrap(c.green)
c.purple = logWrap(c.purple)
c.colors = logWrap(c.colors)