javascript - 如何使用 Babel.js 在 AST 中插入导入语句?

标签 javascript babeljs abstract-syntax-tree

我试图使用 Babel.js 将 ImportDeclaration 插入到 JavaScript 代码片段中:

const babel = require('babel-core')
const t = babel.types
const traverse = babel.traverse
const template = babel.template
const generate = require('babel-generator').default

const babylon = require('babylon')

const code = [
  "import A from 'a'",
  "import B from 'b'",
  "export default {",
  "  components: {",
  "  },",
  "  methods: {",
  "    init () {",
  "    }",
  "  }",
  "}"
].join("\n")
console.log(code)
const ast = babylon.parse(code, {
  sourceType: 'module'
})
var n = []
traverse(ast, {
  ImportDeclaration: {
    exit(path) {
      n.push(path)
    }
  }
})

const name = 'UserDialog',
  src = './user-dialog.vue'
if (n.length) {
  const importCode = "import " + name + " from '" + src + "'"
  console.log(importCode)
  const importAst = template(importCode, {
    sourceType: 'module'
  })()
  // append to last import statement
  n[n.length - 1].insertAfter(importAst);
  console.log(generate(ast).code)
}


但我收到以下错误

enter image description here

这样做的正确方法是什么?

供引用:
您可以从 git clone https://github.com/aztack/babel-test.git 获得以上代码

最佳答案

你最好把它写成一个 Babel 插件,例如

const babel = require('babel-core');

const code = [
  "import A from 'a'",
  "import B from 'b'",
  "export default {",
  "  components: {",
  "  },",
  "  methods: {",
  "    init () {",
  "    }",
  "  }",
  "}"
].join("\n");

const result = babel.transform(code, {
  plugins: [myImportInjector]
});

console.log(result.code);


function myImportInjector({ types, template }) {
  const myImport = template(`import UserDialog from "./user-dialog";`, {sourceType: "module"});

  return {
    visitor: {
      Program(path, state) {
        const lastImport = path.get("body").filter(p => p.isImportDeclaration()).pop();

        if (lastImport) lastImport.insertAfter(myImport());
      },
    },
  };
}

关于javascript - 如何使用 Babel.js 在 AST 中插入导入语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47993537/

相关文章:

javascript - JavaScript生成器捕获错误

javascript - 尝试运行 Node 服务器时出现 "Unexpected Token <"

javascript - IE11 上的 VueJS 错误 - SCRIPT1004 : Expected ';'

c++ - 如何识别在 clang 函数体中声明的变量

java - ASTParser 类的 setEnvironment 方法未定义

javascript - Hammer.js 单击在点击操作后点击后面的 DOM 元素上触发

javascript - 使用像 SystemJS 这样的模块加载器时,在 Safari 的 Web Inspector 中进行调试

javascript - jquery 加载时 getElementById 的问题

java - 从 JAVA 中提取 AST 并将 AST 打印到文件中

javascript - 在服务器上呈现 <option value ="foo"selected>