gulp-ejs 如何通过外部 json 文件传值

最近一个 node 项目里有这样的场景,为了前后端统一,前端开发的时候使用 ejs 模板开发,使用 gulp 进行打包,使用 gulp-ejs 传值一些预览数据再进行 gulp 打包,这样前端打包后就能看到相应的预览 html 文件,后端就可以直接将 ejs 文件作为 view 模版直接进行使用。但是 ejs 传值的时候有个限制,如下

var ejs = require('gulp-ejs')
var gutil = require('gulp-util')

gulp.src('./templates/*.ejs')
    .pipe(ejs({
        msg: 'Hello Gulp!'
    }).on('error', gutil.log))
    .pipe(gulp.dest('./dist'))

但是这样存在一个限制,要么传入所有的 ejs 文件,所有的的值都传入,要么一个个 ejs 都导入,可以传入单个文件的值,但是哪种方法都无可避免带来很不优雅的代码,文件冗余,经过查看源码给出一种解决方案。可以遍历 views 下所有的 ejs 文件,根据 ejs 文件的文件名作为索引,在外部建立一个 json 文件,根据 ejs 文件名查找对应的 value,赋值给 gulp-ejs 去渲染。以下是实现方法。

gulp.task('ejsCompile', function () {

    fs.readdirSync(__dirname + "/src/app")//遍历文件
        .filter(function (file) {
            return (file.indexOf("_") !== 0) && (file.endsWith('.ejs'));//过滤以_开头和不是ejs文件
        })
        .forEach(function (file) {
            console.log(file)
            let name = file.substring(0, file.length - 4)
            let value;
            if(cfg.hasOwnProperty(name)){//cfg 为 存放数据的配置文件
                value = cfg[name];
            } else {
                value = {}
            }
            console.log(name)
            console.log(value)
            gulp.src('src/app/' + file)
                .pipe(ejs(value))//传入值进行渲染
                .pipe(rename(function(path){
                    path.extname = ".html";
                }))
                .on('error',gutil.log)
                .pipe(gulp.dest('dist/app'));
        })
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,512评论 1 32
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,638评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,009评论 19 139
  • gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学...
    依依玖玥阅读 3,196评论 7 55
  • 1. zap Just before I was going to zap the monster, I awok...
    Mr_Oldman阅读 274评论 0 0