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也无异常。

 

posted @   hdxg  阅读(1797)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css
点击右上角即可分享
微信分享提示