You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

容器运行Node时ES Module的require()错误解决方案咨询

解决容器中Angular项目yarn lint时的ERR_REQUIRE_ESM错误

解决方案1:锁定兼容的string-width版本

问题根源是string-width最新版本转为纯ESM模块,但依赖它的wide-align仍使用CommonJS的require()加载。在package.json中添加yarn resolutions强制使用兼容CommonJS的旧版本:

"resolutions": {
  "string-width": "^4.2.3"
}

执行yarn install更新依赖后,重新构建容器即可。

解决方案2:优化Dockerfile构建流程

本地环境依赖缓存可能和容器不一致,调整Dockerfile优先缓存依赖安装层,确保依赖版本与本地一致:

FROM node:18.18

# 先复制依赖配置文件,利用Docker缓存
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile

# 再复制项目代码
COPY ./ ./

RUN yarn lint

--frozen-lockfile参数会强制使用本地的yarn.lock版本,避免容器中拉取不同版本的依赖。

解决方案3:统一本地与容器的yarn版本

容器中node镜像自带的yarn版本可能和本地不同,导致依赖安装差异。在Dockerfile中指定与本地一致的yarn版本:

FROM node:18.18
# 启用corepack管理包管理器版本
RUN corepack enable && corepack prepare yarn@1.22.19 --activate

COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile
COPY ./ ./
RUN yarn lint

替换1.22.19为你本地的yarn版本(执行yarn --version查看)。

解决方案4:跳过可选依赖构建

错误提示@parcel/watcher是可选模块,若lint步骤不需要它,可在安装依赖时跳过可选依赖:

FROM node:18.18
COPY ./ ./
RUN yarn install --ignore-optional
RUN yarn lint

为什么本地环境正常?

本地环境中yarn.lock可能已经锁定了兼容的string-width版本,或者yarn的缓存机制保留了旧版本依赖。而容器是全新环境,默认拉取了最新版的string-width,触发了ESM与CommonJS的兼容冲突。

内容的提问来源于stack exchange,提问作者KastenBrot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:01:21