使用babel,如何将一些代码附加到每个文件的顶部?

Par*_*ris 5 javascript transpiler babeljs

我的目标是假装通过babel获得一些requirejs代码。我发现,如果我if (typeof define !== "function") { var define = require("amdefine")(module); }在nodejs中运行时在每个文件的顶部添加以下内容,则似乎可以解决问题。

这是我写的一些代码,我认为它们会起作用或几乎起作用:

function injectDefine(babel) {
    var header = 'if (typeof define !== "function") { var define = require("amdefine")(module); }';

    return new babel.Plugin('amdefine', {
        visitor: {
            Program: {
                enter: function(path, file) {
                    path.unshiftContainer(
                        'body',
                        babel.types.expressionStatement(
                            babel.types.stringLiteral(header)
                        )
                    );
                },
            },
        },
    });
}

require('babel-core/register')({
    stage: 0,
    plugins: [{transformer: injectDefine}],
});

require('../components/button');
Run Code Online (Sandbox Code Playgroud)

该components/button文件只是我尝试测试是否可以加载某些文件。

其他说明:我正在使用babel 5,现在无法升级。我现在也不能.babelrc很轻松地使用它。

Par*_*ris 7

提示 1:BABEL_DISABLE_CACHE=1如果您正在对插件进行大量测试,则需要环境变量。如果你有一个像npm run unit你一样运行的脚本,你可能想要BABEL_DISABLE_CACHE=1 npm run unit在测试你的插件时像这样运行。

Tip 2:babel.parse会给你一个完整的程序。你能做的最简单的事情是babel.parse(header).program.body[0]。

以下最终工作:

function injectDefine(babel) {

    var header = 'if (typeof define !== "function") { var define = require("amdefine")(module); }';

    return new babel.Plugin('amdefine', {
        visitor: {
            Program: {
                enter: function(node, parent) {
                    node.body.unshift(
                        babel.parse(header).program.body[0]
                    );
                },
            },
        },
    });
}

require('babel-core/register')({
    cache: false,
    stage: 0,
    plugins: [injectDefine],
});
Run Code Online (Sandbox Code Playgroud)