如何用Babel.js将导入语句插入到AST中?

weixin_38050648 2019-09-12 04:00:01

我试图插入一个导入声明成JavaScript代码段与Babel.js: 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)
} 但我得到了以下错误 有什么正确的方法来做到这一点? FYI: 你可以得到上面的代码从git clone https://github.com/aztack/babel-test.git








...全文
242 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38083721 2019-09-12
  • 打赏
  • 举报
回复

你最好还是写信以此为巴贝尔的插件,例如 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()); }, }, }; }

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧