Babel:replaceWithSourceString提供意外令牌(1:1)

时间:2019-02-19 16:42:38

标签: plugins build babeljs babel middleware

我正在尝试动态替换“导入”语句。

下面是检查导入是否以加号结尾的示例。

module.exports = function(babel) {

    return {
        visitor: {
            ImportDeclaration: function(path, state) {
             // import abc from "./logic/+"
             if( ! path.node.source.value.endsWith("/+"))
              return;

             path.replaceWithSourceString('import all from "./logic/all"')

            }
        }
    }
}

这将导致错误

SyntaxError: src/boom.js: Unexpected token (1:1) - make sure this is an expression.
> 1 | (import all from "./logic/all")

问题是replaceWithSourceString is wrapping the string in rounded braces.

如果我将replaceWithSourceString更改为

path.replaceWithSourceString('console.log("Hi")')

这有效。.¯__(ツ)_ /¯

任何人都可以帮助您变得很棒

1 个答案:

答案 0 :(得分:1)

确实应该避免

replaceWithSourceString,因为正如您所看到的那样,它并不是一个很好的API。创建用于插入脚本的AST的推荐方法是使用template。假设这是针对Babel 7.x的,您可以

const importNode = babel.template.statement.ast`import all from "./logic/all"`;
path.replaceWith(importNode);