如何使用Node.js读取JS文件并将其默认导出模块解析为JSON
解决方案
方案1:使用Node.js原生模块导入(推荐)
该方案直接复用Node.js内置的ES Module加载逻辑,无需手动解析源码,实现成本最低,适合sample.js依赖都已安装的场景。
如果你的项目是CommonJS规范(package.json中无"type": "module"配置),可以用动态import()表达式加载ESM模块:
const fs = require("fs"); async function getDefaultExport() { // 动态导入ES Module const sampleModule = await import("./sample.js"); // 取默认导出内容 const defaultExport = sampleModule.default; // 直接转JSON字符串 const targetJsonStr = JSON.stringify(defaultExport); console.log(targetJsonStr); // 如需JS对象直接用defaultExport即可,无需额外JSON.parse return defaultExport; } getDefaultExport().catch(console.error);
如果你的项目是ESM规范(package.json中有"type": "module"配置),可以直接用顶层导入:
import sample from "./sample.js"; const targetJsonStr = JSON.stringify(sample); console.log(targetJsonStr);
方案2:静态解析JS源码AST(无需执行依赖)
如果sample.js中导入的依赖不需要安装,仅需要提取静态默认导出内容,可以通过解析JS抽象语法树(AST)实现,不需要执行完整的sample.js代码。
首先安装依赖:
npm install @babel/parser @babel/traverse
实现代码:
const fs = require("fs/promises"); const parser = require("@babel/parser"); const traverse = require("@babel/traverse").default; async function parseDefaultExportFromCode() { const code = await fs.readFile("./sample.js", "utf8"); // 解析ESM代码为AST const ast = parser.parse(code, { sourceType: "module", }); let exportVarName; // 第一步:定位export default语句,拿到导出的变量名 traverse(ast, { ExportDefaultDeclaration(path) { if (path.node.declaration.type === "Identifier") { exportVarName = path.node.declaration.name; } }, }); if (!exportVarName) throw new Error("未找到默认导出内容"); let exportValue; // 第二步:定位对应变量的声明,提取值 traverse(ast, { VariableDeclarator(path) { if (path.node.id.name === exportVarName) { // 截取变量初始化部分的代码,直接求值 const initCode = code.slice(path.node.init.start, path.node.init.end); exportValue = eval(`(${initCode})`); } }, }); const targetJsonStr = JSON.stringify(exportValue); console.log(targetJsonStr); return exportValue; } parseDefaultExportFromCode().catch(console.error);
内容的提问来源于stack exchange,提问作者kimbaudi
相关产品推荐
相关产品推荐

