docker build执行npm install报错找不到type@module匹配版本求解决方案
问题根因
你当前的错误完全是package.json字段配置位置错误导致的:
"type": "module"是Node.js的ESM模块规范顶层配置项,需要放在package.json的最外层,和name、version字段平级- 你错误地将该配置写在了
devDependencies和scripts字段下:- 写在
devDependencies里时,npm会将其识别为你要安装名为type、版本号为module的依赖包,自然找不到对应版本,就抛出你看到的No matching version found for type@module报错 - 写在
scripts里时,它会被识别为一个名为type的脚本命令,完全不会生效为模块配置
- 写在
- 你之前删除该配置后应用找不到
index.ejs,是因为缺少顶层type: module配置时,Node.js默认按CommonJS规范解析模块,和你代码里的ESM语法路径解析规则不匹配导致的,和删除devDependencies里的错误配置没有关系。
解决步骤
- 调整
package.json的字段位置:- 删除
devDependencies里的"type": "module"配置 - 删除
scripts里的"type": "module"配置 - 在
package.json顶层新增"type": "module"配置,和name字段平级
调整后的正确配置示例:
- 删除
{ "name": "mediasoup-custom", "version": "1.0.0", "type": "module", "description": "", "main": "app.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node src/app.js", "mon": "nodemon src/app.js", "watch": "watchify public/index.js -o public/bundle.js -v" }, "author": "", "license": "ISC", "dependencies": { "body-parser": "^1.19.0", "ejs": "^3.1.6", "express": "^4.17.1", "httpolyglot": "^0.1.2", "mediasoup": "^3.7.1", "mediasoup-client": "^3.6.37", "mongoose": "^5.12.10", "protoo-client": "^4.0.4", "protoo-server": "^4.0.4", "react": "^17.0.2", "request": "^2.88.2", "socket.io": "^2.3.0" }, "devDependencies": { "@babel/cli": "^7.14.3", "@babel/core": "^7.14.3" }, "engines": { "node": "12.19.0" } }
- 处理lockfile版本不兼容问题:
你的构建日志还有lockfileVersion不兼容的警告,是因为Docker镜像里的npm版本为v6(对应lockfileVersion@1),而你本地的npm版本为v7+(生成的是lockfileVersion@2),可以二选一处理:
- 升级Dockerfile里的Node.js版本到16及以上,对应npm版本为v7+,和本地环境对齐
- 本地使用npm v6版本重新执行
npm install生成符合v1规范的package-lock.json,再进行Docker构建
调整完成后再执行docker build即可正常构建,同时应用的ESM模块解析规则不会改变,不会出现找不到index.ejs的问题。
内容的提问来源于stack exchange,提问作者Christoffer Palsgaard
相关产品推荐
相关产品推荐

