Docker构建Svelte+Vite项目报错:无法找到Vite依赖模块
问题描述
通过Github Actions使用Dockerfile部署包含Svelte+Vite前端的Java应用到Azure时遇到问题:本地构建正常,但Docker环境中构建失败:
- npm install阶段出现svelte-hmr、@melt-ui/svelte与Svelte 5.x的peer依赖冲突警告,包安装虽完成但可能存在异常;
- 执行
npm run build时抛出ERR_MODULE_NOT_FOUND错误,无法找到/usr/src/app/learnify/frontend/node_modules/vite/dist/node/chunks/dep-Cyk9bIUq.js模块。
已尝试降级Vite和Node.js版本,问题仍未解决。
错误日志
#8 [ 5/10] RUN cd learnify/frontend && npm install #8 0.745 npm warn ERESOLVE overriding peer dependency #8 0.746 npm warn While resolving: svelte-hmr@0.16.0 #8 0.746 npm warn Found: svelte@5.15.0 #8 0.746 npm warn node_modules/svelte #8 0.746 npm warn dev svelte@"^5.0.0" from the root project #8 0.746 npm warn 11 more (@sveltejs/kit, u/sveltejs/vite-plugin-svelte, ...) #8 0.746 npm warn #8 0.746 npm warn Could not resolve dependency: #8 0.746 npm warn peer svelte@"^3.19.0 || ^4.0.0" from svelte-hmr@0.16.0 #8 0.746 npm warn node_modules/@sveltejs/vite-plugin-svelte/node_modules/svelte-hmr #8 0.746 npm warn svelte-hmr@"^0.16.0" from u/sveltejs/vite-plugin-svelte@3.1.2 #8 0.746 npm warn node_modules/@sveltejs/vite-plugin-svelte #8 0.746 npm warn #8 0.746 npm warn Conflicting peer dependency: svelte@4.2.19 #8 0.746 npm warn node_modules/svelte #8 0.746 npm warn peer svelte@"^3.19.0 || ^4.0.0" from svelte-hmr@0.16.0 #8 0.746 npm warn node_modules/@sveltejs/vite-plugin-svelte/node_modules/svelte-hmr #8 0.746 npm warn svelte-hmr@"^0.16.0" from u/sveltejs/vite-plugin-svelte@3.1.2 #8 0.746 npm warn node_modules/@sveltejs/vite-plugin-svelte #8 0.804 npm warn ERESOLVE overriding peer dependency #8 0.804 npm warn While resolving: u/melt-ui/svelte@0.76.2 #8 0.804 npm warn Found: svelte@5.15.0 #8 0.804 npm warn node_modules/svelte #8 0.804 npm warn dev svelte@"^5.0.0" from the root project #8 0.804 npm warn 11 more (@sveltejs/kit, u/sveltejs/vite-plugin-svelte, ...) #8 0.804 npm warn #8 0.804 npm warn Could not resolve dependency: #8 0.804 npm warn peer svelte@">=3 <5" from u/melt-ui/svelte@0.76.2 #8 0.804 npm warn node_modules/bits-ui/node_modules/@melt-ui/svelte #8 0.804 npm warn u/melt-ui/svelte@"0.76.2" from bits-ui@0.21.16 #8 0.804 npm warn node_modules/bits-ui #8 0.804 npm warn #8 0.804 npm warn Conflicting peer dependency: svelte@4.2.19 #8 0.804 npm warn node_modules/svelte #8 0.804 npm warn peer svelte@">=3 <5" from u/melt-ui/svelte@0.76.2 #8 0.804 npm warn node_modules/bits-ui/node_modules/@melt-ui/svelte #8 0.804 npm warn u/melt-ui/svelte@"0.76.2" from bits-ui@0.21.16 #8 0.804 npm warn node_modules/bits-ui #8 5.408 #8 5.408 added 255 packages, changed 1 package, and audited 319 packages in 5s #8 5.409 #8 5.409 82 packages are looking for funding #8 5.409 run `npm fund` for details #8 5.419 #8 5.419 4 low severity vulnerabilities #8 5.419 #8 5.419 To address all issues (including breaking changes), run: #8 5.419 npm audit fix --force #8 5.419 #8 5.419 Run `npm audit` for details. #8 5.420 npm notice #8 5.420 npm notice New major version of npm available! 10.8.2 -> 11.0.0 #8 5.420 npm notice Changelog: #8 5.420 npm notice To update run: npm install -g npm@11.0.0 #8 5.420 npm notice #8 DONE 5.9s #9 [ 6/10] RUN cd learnify/frontend && npm run build #9 0.310 #9 0.310 > frontend@0.0.1 build #9 0.310 > vite build --emptyOutDir #9 0.310 #9 0.363 node:internal/modules/esm/resolve:265 #9 0.363 throw new ERR_MODULE_NOT_FOUND( #9 0.363 ^ #9 0.363 #9 0.363 Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/usr/src/app/learnify/frontend/node_modules/vite/dist/node/chunks/dep-Cyk9bIUq.js' imported from /usr/src/app/learnify/frontend/node_modules/vite/dist/node/cli.js #9 0.363 at finalizeResolution (node:internal/modules/esm/resolve:265:11) #9 0.363 at moduleResolve (node:internal/modules/esm/resolve:933:10) #9 0.363 at defaultResolve (node:internal/modules/esm/resolve:1169:11) #9 0.363 at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:542:12) #9 0.363 at ModuleLoader.resolve (node:internal/modules/esm/loader:510:25) #9 0.363 at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:239:38) #9 0.363 at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:96:40) #9 0.363 at link (node:internal/modules/esm/module_job:95:36) { #9 0.363 code: 'ERR_MODULE_NOT_FOUND', #9 0.363 url: 'file:///usr/src/app/learnify/frontend/node_modules/vite/dist/node/chunks/dep-Cyk9bIUq.js' #9 0.363 } #9 0.363 #9 0.363 Node.js v20.18.1 #9 ERROR: process "/bin/sh -c cd learnify/frontend && npm run build" did not complete successfully: exit code: 1 ------ > [ 6/10] RUN cd learnify/frontend && npm run build: 0.363 at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:542:12) 0.363 at ModuleLoader.resolve (node:internal/modules/esm/loader:510:25) 0.363 at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:239:38) 0.363 at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:96:40) 0.363 at link (node:internal/modules/esm/module_job:95:36) { 0.363 code: 'ERR_MODULE_NOT_FOUND', 0.363 url: 'file:///usr/src/app/learnify/frontend/node_modules/vite/dist/node/chunks/dep-Cyk9bIUq.js' 0.363 } 0.363 0.363 Node.js v20.18.1 ------ ./Dockerfile:12 -------------------- 10 | 11 | RUN cd learnify/frontend && npm install 12 | >>> RUN cd learnify/frontend && npm run build 13 | RUN rm -r frontend 14 | -------------------- ERROR: failed to solve: process "/bin/sh -c cd learnify/frontend && npm run build" did not complete successfully: exit code: 1 Error: buildx failed with: ERROR: failed to solve: process "/bin/sh -c cd learnify/frontend && npm run build" did not complete successfully: exit code: 1
Dockerfile内容
FROM openjdk:21-jdk-slim RUN apt-get update && apt-get install -y curl \ && curl -sL https://deb.nodesource.com/setup_20.x | bash - \ && apt-get install -y nodejs \ && curl -L https://www.npmjs.com/install.sh | npm_install="10.9.0" | sh WORKDIR /usr/src/app COPY . . RUN cd learnify/frontend && npm install RUN cd learnify/frontend && npm run build RUN rm -r frontend RUN sed -i 's/\r$//' mvnw RUN chmod +x mvnw RUN ./mvnw package EXPOSE 8080 CMD ["java", "-jar", "/usr/src/app/target/learnify-0.0.1-SNAPSHOT.jar"]
解决方案
1. 解决依赖兼容性问题
Svelte 5.x与当前使用的svelte-hmr、@melt-ui/svelte版本存在peer依赖冲突,这是导致包安装异常的核心原因:
- 升级
@sveltejs/vite-plugin-svelte到v4.x及以上版本,该版本已适配Svelte 5,会自动引入兼容的svelte-hmr; - 升级
@melt-ui/svelte到v1.x及以上版本(该版本支持Svelte 5),或临时移除该依赖验证构建是否正常; - 在前端项目的
package.json中添加overrides字段强制统一依赖版本:"overrides": { "svelte-hmr": "^0.17.0" }
2. 优化Docker构建流程
方式一:使用多阶段构建(推荐)
分离前端构建和Java环境,避免环境冲突,同时减小最终镜像体积:
# 第一阶段:前端构建 FROM node:20-bookworm-slim AS frontend-builder WORKDIR /app/frontend COPY learnify/frontend/package*.json ./ RUN npm ci COPY learnify/frontend/ . RUN npm run build # 第二阶段:Java构建和运行 FROM openjdk:21-jdk-slim WORKDIR /usr/src/app COPY . . # 复制前端构建产物到Java项目的静态资源目录(根据实际结构调整) COPY --from=frontend-builder /app/frontend/dist ./learnify/src/main/resources/static RUN sed -i 's/\r$//' mvnw RUN chmod +x mvnw RUN ./mvnw package EXPOSE 8080 CMD ["java", "-jar", "/usr/src/app/target/learnify-0.0.1-SNAPSHOT.jar"]
方式二:修复现有Dockerfile
- 替换npm安装方式,避免手动安装可能导致的异常:
FROM openjdk:21-jdk-slim RUN apt-get update && apt-get install -y curl nodejs npm \ && npm install -g npm@10.9.0 WORKDIR /usr/src/app # 先复制package文件,利用Docker缓存加速依赖安装 COPY learnify/frontend/package*.json ./learnify/frontend/ RUN cd learnify/frontend && npm ci COPY . . RUN cd learnify/frontend && npm run build RUN rm -r learnify/frontend RUN sed -i 's/\r$//' mvnw RUN chmod +x mvnw RUN ./mvnw package EXPOSE 8080 CMD ["java", "-jar", "/usr/src/app/target/learnify-0.0.1-SNAPSHOT.jar"] - 使用
npm ci替代npm install,确保依赖版本与package-lock.json完全一致; - 优先复制
package*.json再安装依赖,提升Docker构建缓存效率。
3. 验证本地依赖一致性
- 删除本地
node_modules和package-lock.json,重新执行npm install,确保本地依赖环境与Docker一致; - 确认
package-lock.json已提交到Git仓库,避免Docker构建时依赖版本波动。
内容的提问来源于stack exchange,提问作者user28894823
相关产品推荐
相关产品推荐

