有没有办法为babel插件提供自定义选项?

时间:2015-06-11 09:33:33

标签: javascript plugins babeljs

我可能错了,但我找不到任何解决方案来为我的自定义babel插件提供一些自定义选项。你有什么想法我能做到这一点吗?

这是我的构建过程,我使用gulp与browserify和babelify:

gulp.task("scripts", function() {
    return browserify({
        entries: "myFile.js"
    })
    .transform(babelify.configure({
        plugins: ["./lib/myPlugin:after"]
    }))
    .bundle()
    .pipe(source("all.js"))
    .pipe("build/");
});

我想给我的插件提供一些自定义数据,做这样的事情:

gulp.task("scripts", function() {
    return browserify({
        entries: "myFile.js"
    })
    .transform(babelify.configure({
        myCustomOptions: {
            rootPath: "some path",
            customInfo: "..."
        }
        plugins: ["./lib/myPlugin:after"]
    }))
    .bundle()
    .pipe(source("all.js"))
    .pipe("build/");
});

然后在我的插件中,我想检索刚刚声明的customOptions对象。有没有办法实现这样的目标?

谢谢,

此致

2 个答案:

答案 0 :(得分:6)

最近在 Babel 6 中发生了变化。来自the docs

  

插件可以指定选项。您可以通过将其包装在数组中并提供选项对​​象来在配置中执行此操作。例如:

{
  "plugins": [
    ["transform-async-to-module-method", {
      "module": "bluebird",
      "method": "coroutine"
    }]
  ]
}
Babel插件手册中的

Plugin Options文档。

答案 1 :(得分:3)

我找到了出路,但我很确定这不是一个正确的方法:

阅读巴贝尔代码,似乎有一个名为“额外”的隐藏选项。我使用该选项来推送自定义选项:

gulp.task("scripts", function() {
    return browserify({
        entries: "myFile.js"
    })
    .transform(babelify.configure({
        extra: {
            myPlugin: {
                // here i put my custom data
            }
        },
        plugins: ["./lib/myPlugin:after"]
    }))
    .bundle()
    .pipe(source("all.js"))
    .pipe("build/");
});

然后在我的插件中,我可以检索我的自定义选项:

var myPlugin = function(babel) {
    var t = babel.types;
    var pluginConf;

    return new babel.Transformer("babel-platform", {
        CallExpression(node, parent, scope, config) {
            pluginConf = pluginConf || config.opts.extra["myPlugin"] || {};
            // Doing some stuff here on the CallExpression
        }
    });
}

我知道这绝对不是一个正确的方法。你有其他选择吗?