Can't import the named export 'PromiseQueue' from non EcmaScript module (only default export is available)
最近在开发一个electron应用,需要用到ssh功能。
经过挑选,最终使用的是node-ssh这个包。
然而,使用的过程并不顺利,执行npm run electron:serve运行出错,报错信息如下:
报错信息说的是使用import语法导入了非ES模块。 网上找文章,都是说只要在webpack中配置对mjs文件的解析就行:
但实测并没有效果。
那只能分析源码了。
找到具体文件./node_modules/node-ssh/lib/esm/index.mjs,发现是这么写的:
再定位到node_modules/sb-promise-queue,发现有cjs和esm两个版本:
既然有esm版本,那应该是可以用import语法的。
对比sub-promise-queue的package.json与没有报错的ssh的package.json,发现多了"exports"配置项和“module"配置项:
从配置上来看应该没问题,解析不正确大概是webpack的问题。
但时间紧迫,不能去研究webpack了。
我就直接将"exports"配置项删掉,从配置上来看删没有影响。
然后将"main"改为"lib/esm/index.mjs",删掉"module"选项。
编译。
ok,sub-promise-queue不报错了:
于是继续看assert模块。
原本以为会和sb-promise-queue一样的问题,结果assert模块并没有分为cjs和esm两个版本的文件,只有cjs版本:
啊这...
突然想到,ssh中只有cjs没有报错,那assert中只有cjs,为什么会报错?
那就来看看assert.js:
ok是什么呢:
啥,assert是ok,然后assert.ok=ok,循环引用吗。
先不管这个,看看有没有AssertionError吧:
没看出来有什么问题,去掉assert.ok=ok,取消循环引用试试?
没用。
于是回到./node_modules/node-ssh/lib/esm/index.mjs,看看AssertionError到底有什么用:
直接throw。那其实AssertionError不存在也没关系,因为不存在也会报错。
我选择将./node_modules/node-ssh/lib/esm/index.mjs中关于import from 'assert'的代码改成require()的方式(之前使用require()引入sb-promise-queue,编译时不再报错,但打开exe却表示sb-promise-queue找不到,因此认为在esm中使用require()会在打包时会忽略导入的模块)。
最后,编译打包,成功通过,打开exe也无异常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!