Плагин Babel: как вставить дочерний узел

#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() с узлом, и он работает. @SouradeepNanda

3. Я пытаюсь вставить JSX.

4. Очень, очень поздно. Но я думаю, вам просто нужно посмотреть на ссылку в сообщении. Я быстро взглянул на это. Возможно, это то, что вы ищете t.jsxAttribute(name, value); .

Ответ №2:

Я нашел обходной путь, просто введя код в виде открытого текста. React, кажется, работает просто отлично.

 path.node.children.push('<div>Click me</div>')