在所需文件

时间:2018-02-24 04:02:58

标签: javascript node.js function module scope

我正在寻找一种方法来保持在模块范围内声明的函数,导出它们,并允许它们包装在一个完全不同的文件中,并导出所有模块的包装副本。问题:包装工作,但它只包装被调用的函数,该函数仍然调用未包装的反零件。在不改变原始编写模块的范围的情况下,有没有办法告诉日志版本,只使用其他记录版本?

  

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方法创建模块,这是可能的,但是我必须使用额外的类名调用每个方法,这是我想要的避免。

1 个答案:

答案 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)