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

Plugins Babel:replaceWithSourceString提供意外令牌(1:1),plugins,build,babeljs,middleware,Plugins,Build,Babeljs,Middleware,我试图动态替换“import”语句 下面是一个检查导入是否以加号结束的示例 module.exports = function(babel) { return { visitor: { ImportDeclaration: function(path, state) { // import abc from "./logic/+" if( ! path.node.source.value.end

我试图动态替换“import”语句

下面是一个检查导入是否以加号结束的示例

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更改为

path.replaceWithSourceString('console.log("Hi")')
这就行了<强>'_(ツ)_/“


真正应该避免使用任何和所有帮助您变得优秀的方法

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

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

Babel standalone是否可以这样做?模板在7.12版中似乎不可用。9@cbutler你是不是像OP一样从插件函数的第一个参数中提取了
babel
?它应该也可以独立使用。我的代码与OP有点不同。我可以在这里添加它作为答案,但有人会这样做可能会因为这个对我大喊大叫,或者我可以创建一个新问题。但是当我在控制台中检查Babel时,它不在Babel对象上。我创建了我自己的问题,这里有任何人愿意帮助(将不胜感激)