#javascript #plugins #babeljs #babel-plugin #babel-babylon
#javascript #Плагины #babeljs #babel-плагин #babel-вавилон
Вопрос:
Кажется, что path.insertAfter(), path.insertBefore(), path.unshiftContainer() и path.pushContainer() работают только с инструкциями. Как вы вставляете узлы, которые не являются операторами?
В моем случае я пишу плагин babel jsx и пытаюсь вставить дочерний узел, который является контейнером JSXExpressionContainer. Когда я делаю это, я получаю следующую ошибку:
TypeError: Property body[0] of BlockStatement expected node to be of a type ["Statement"] but instead got "JSXExpressionContainer"
Как мне это исправить?
Ответ №1:
Из документации здесь:
FunctionDeclaration(path) {
path.insertBefore(t.expressionStatement(t.stringLiteral("Because I'm easy come, easy go.")));
path.insertAfter(t.expressionStatement(t.stringLiteral("A little high, little low.")));
}
Глядя на вашу ошибку, убедитесь, что вы правильно ввели свои типы. Просто проверьте типы babel здесь и посмотрите, какие параметры необходимы для каждого типа.
Комментарии:
1. Это не работает. Выдает ту же ошибку, что и в вопросе. Я использую babel7
2. Я думаю, что это ошибка с типами, которые вы пытаетесь вставить, а не с
.insertBefore()
или.insertAfter()
функциями. Просто попробуйте вставить что-нибудь попроще. У меня есть проект babel, и я использовал.insertAfter()
с узлом, и он работает. @SouradeepNanda3. Я пытаюсь вставить JSX.
4. Очень, очень поздно. Но я думаю, вам просто нужно посмотреть на ссылку в сообщении. Я быстро взглянул на это. Возможно, это то, что вы ищете
t.jsxAttribute(name, value);
.
Ответ №2:
Я нашел обходной путь, просто введя код в виде открытого текста. React, кажется, работает просто отлично.
path.node.children.push('<div>Click me</div>')