首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS & Gulp & NPM封装器,产生不正确的输出

NodeJS & Gulp & NPM封装器,产生不正确的输出
EN

Stack Overflow用户
提问于 2016-02-22 22:12:38
回答 1查看 720关注 0票数 6

目标

我目前正在尝试为NPM平台编写一个可以很容易地在Gulp任务中使用的Gulp包装器。我觉得这对Node社区很有用,也能实现我的目标。存储库在这里,每个人都可以查看、贡献、处理和拉请求。我正在尝试制作多个JSON文件的扁平副本(使用点符号)。然后,我想将它们复制到同一个文件夹中,只需修改文件扩展名就可以从*.json转到*.flat.json。

我的问题

我在JSON文件中得到的结果看起来像乙烯基文件或字节码。例如,我期望输出类似于"views.login.usernamepassword.login.text": "Login",但是我得到了类似于{"0":123,"1":13,"2":10,"3":9,"4":34,"5":100,"6":105 ...etc的东西

我的方法

我对开发Gulp任务和节点模块非常陌生,所以一定要注意那些根本错误的事情。

存储库将是最最新的代码,但我也将努力使问题跟上它。

Gulp-任务文件

代码语言:javascript
复制
var gulp = require('gulp'),
    plugins = require('gulp-load-plugins')({camelize: true});
var gulpFlat = require('gulp-flat');
var gulpRename = require('gulp-rename');
var flatten = require('flat');

gulp.task('language:file:flatten', function () {

return gulp.src(gulp.files.lang_file_src)
    .pipe(gulpFlat())
    .pipe(gulpRename( function (path){
        path.extname = '.flat.json'
    }))
    .pipe(gulp.dest("App/Languages"));
});

节点模块的index.js (A.k.a ),我希望它变成一元化()

代码语言:javascript
复制
var through = require('through2');
var gutil = require('gulp-util');
var flatten = require('flat');
var PluginError = gutil.PluginError;

// consts
const PLUGIN_NAME = 'gulp-flat';


// plugin level function (dealing with files)
function flattenGulp() {

    // creating a stream through which each file will pass
    var stream = through.obj(function(file, enc, cb) {
        if (file.isBuffer()) {

             //FIXME: I believe this is the problem line!!
            var flatJSON = new Buffer(JSON.stringify(
                flatten(file.contents)));
            file.contents = flatJSON;
    }

    if (file.isStream()) {

        this.emit('error', new PluginError(PLUGIN_NAME, 'Streams not supported! NYI'));
        return cb();
    }

    // make sure the file goes through the next gulp plugin
    this.push(file);
    // tell the stream engine that we are done with this file
    cb();
});

// returning the file stream
return stream;
}

// exporting the plugin main function
module.exports = flattenGulp;

资源

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-22 23:33:47

关于错误在哪里,你是对的。解决办法很简单。您只需要解析file.contents,因为flatten函数在对象上运行,而不是在缓冲区上操作。

代码语言:javascript
复制
...
var flatJSON = new Buffer(JSON.stringify(
  flatten(JSON.parse(file.contents))));
file.contents = flatJSON;
...

这应该能解决你的问题。

既然你是个新手,我希望你不介意我提个建议。您可能需要考虑给您的用户提供美化JSON输出的选项。要做到这一点,只需让您的主函数接受一个options对象,然后您就可以执行如下操作:

代码语言:javascript
复制
...
var flatJson = flatten(JSON.parse(file.contents));
var jsonString = JSON.stringify(flatJson, null, options.pretty ? 2 : null);
file.contents = new Buffer(jsonString);
...

如果您计划在将来扩展插件,您可能会发现options对象在其他方面很有用。

可以随意查看我编写的一个名为格利普变换的插件的存储库。我很高兴回答有关这方面的任何问题。(例如,如果您愿意的话,我可以给您一些关于实现插件的流模式版本的指导)。

更新

我决定接受你的捐款邀请。您可以查看我的分叉这里和我打开的这里问题。欢迎您使用您喜欢的多或少,如果您真的喜欢,我总是可以提交一个拉请求。希望它至少能给你一些想法。

谢谢你让这个项目顺利进行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35564976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档