Gulp 如何自动化函数式编程,并避免重复自己

qij5mzcb  于 2023-09-28  发布在  Gulp
关注(0)|答案(1)|浏览(231)

在我的gulpfile.js中,我有以下两个函数,它们使用两个不同的视图渲染gulp-nun-jucks...

function genNunJucks(cb) {
    return src(paths.views.src)
        .pipe(nunjucksRender({
            path: ['src/views/'], // String or Array
            ext: '.html',
            inheritExtension: false,
            envOptions: {
                watch: true
            },
            manageEnv: manageEnvironment,
            loaders: null
        }))
        .pipe(htmlbeautify({
            indentSize: 2,
            "eol": "\n",
            "indent_level": 0,
            "preserve_newlines": false
        }))
        .pipe(dest(paths.views.dest))
    cb();
}

function genNunJucks2(cb) {
    return src(paths.views.src2)
        .pipe(nunjucksRender({
            path: ['src/views/'], // String or Array
            ext: '.html',
            inheritExtension: false,
            envOptions: {
                watch: true
            },
            manageEnv: manageEnvironment,
            loaders: null
        }))
        .pipe(htmlbeautify({
            indentSize: 2,
            "eol": "\n",
            "indent_level": 0,
            "preserve_newlines": false
        }))
        .pipe(dest(paths.views.dest2))
    cb();
}

当涉及到在gulp进程的返回区域内工作时,我如何将这两个函数组合成一个函数来完成相同的工作?你会注意到我的path.views.src(x)是我复制这个过程的原因。
也许有某种类型的修剪过程,我可以应用它来查看完整的路径数组。
非常感谢任何提示

7tofc5zh

7tofc5zh1#

您可以使用closurescurrying的形式,并创建一个函数,将src作为参数并返回您想要使用的genNunJucks

function createGenNumChunksFunction(src) {
  return function genNunJucks(cb) {
    return src(src)
      .pipe(nunjucksRender({
        path: ['src/views/'], // String or Array
        ext: '.html',
        inheritExtension: false,
        envOptions: {
          watch: true
        },
        manageEnv: manageEnvironment,
        loaders: null
      }))
      .pipe(htmlbeautify({
        indentSize: 2,
        "eol": "\n",
        "indent_level": 0,
        "preserve_newlines": false
      }))
      .pipe(dest(paths.views.dest))
    cb();
  }
}

现在不用在使用它的地方传递genNunJucks,而是传递createGenNumChunksFunction(paths.views.src)createGenNumChunksFunction(paths.views.src2)
下面是一个可以在snipped中执行的简化版本,并说明了它是如何工作的:

function createGenNumChunksFunction(src) {
  return function genNunJucks() {
    console.log(src)
  }
}

function callPassedFunction(cb) {
  console.log('function will be called')
  cb();
}

callPassedFunction(createGenNumChunksFunction('src1'))
callPassedFunction(createGenNumChunksFunction('src2'))

另外一个注意事项--这可能与您的情况无关--如果您想直接使用genNunJucks而不需要先“创建”它,那么可以将它放在createGenNumChunksFunction之外。

function genNunJucks(src) {
  console.log(src)
}

function createGenNumChunksFunction(src) {
  return function() {
    return genNunJucks(src)
  }
}

function callPassedFunction(cb) {
  console.log('function will be called')
  cb();
}

callPassedFunction(createGenNumChunksFunction('src1'))
callPassedFunction(createGenNumChunksFunction('src2'))
genNunJucks('src3')

相关问题