Node ES6环境下如何通过package.json脚本调用export default内容
问题根因
执行脚本无输出、后续尝试的写法报错,核心是对ES模块的加载、导出规则理解有偏差:
- 直接运行
node src/weekday.js时,模块仅完成加载,你通过export default导出的异步函数只是模块对外暴露的成员,不会自动执行,文件里没有任何主动调用函数的代码,自然不会打印日志 - 动态
import()返回的是Promise对象,resolve后得到的是包含所有导出成员的模块对象,不是你导出的default函数本身,直接加()调用必然报类型错误 - 项目开启
"type": "module"后,所有.js文件默认按ES模块规范解析,无法用CommonJS的require()直接加载,会抛出规范不兼容的错误
正确配置方案
二选一即可:
方案1:给脚本添加入口执行判断(最推荐,适配CLI场景)
这种写法不需要改npm scripts配置,还能兼容模块被其他文件import引用的场景,不会重复执行逻辑。直接修改src/weekday.js,在文件末尾添加自执行判断即可:
#! /usr/bin/env node export const mon = () => console.log('Monday') export const tues = () => console.log('Tuesday') export const wed = () => console.log('Wednesday') const main = async () => { await mon() await tues() await wed() } export default main // 新增:判断当前文件是被直接执行时,才运行主逻辑 if (import.meta.url === new URL(process.argv[1], 'file:').href) { main() }
修改后保留原来的scripts配置即可:
"scripts": { "week": "node src/weekday.js" }
执行npm run week就能正常依次输出Monday、Tuesday、Wednesday。
方案2:不修改源文件,直接在npm script中完成调用
如果不想改动weekday.js的源码,可以把scripts配置改成正确处理动态import的写法:
"scripts": { "week": "node -e 'import(\"./src/weekday.js\").then(module => module.default())'" }
这种写法的逻辑是:动态加载模块后,从返回的模块对象中取出default导出的函数,再执行调用。注意这种写法在Windows cmd环境下可能遇到引号转义问题,跨平台使用优先选方案1。
内容的提问来源于stack exchange,提问作者GʀᴜᴍᴘʏCᴀᴛ
相关产品推荐
相关产品推荐

