当 NODE_ENV=production 时,Typescript 编译失败(在 Docker 中)

Posted

技术标签:

【中文标题】当 NODE_ENV=production 时,Typescript 编译失败(在 Docker 中)【英文标题】:Typescript compilation fails (in Docker) when NODE_ENV=production 【发布时间】:2019-01-31 03:10:18 【问题描述】:

所以我有一个 create-react-app-ts 应用程序,我想将它 Dockerize 并托管在 Zeit Now 上。

在本地一切正常,运行 yarn tscreact-scripts-ts build 效果很好。

通过以下 Dockerfile 创建 Docker 映像也很有效:

FROM mhart/alpine-node:10.9
WORKDIR /usr/src

ARG REACT_APP_API_ENDPOINT
ARG NODE_ENV

COPY yarn.lock package.json ./
RUN yarn

COPY . .
RUN yarn build && mv build /public

但是,当发布到 Now 时,构建脚本在 Typescript 编译时失败,输出项目中大多数文件的编译错误。

如果我在WORKDIR... 上方的Dockerfile 中设置ENV NODE_ENV production,我也可以在本地复制它。

因此,Typescript 或 react-scripts-tsNODE_ENV=production 时的行为似乎不同。我以前从未遇到过这个错误,也不知道如何调试它。在本地运行 NODE_ENV=production tscNODE_ENV=production react-scripts-ts build 也可以正常工作。

我正在使用以下配置运行 Typescript v 3.0.1:


  "compilerOptions": 
    "baseUrl": ".",
    "outDir": "build/dist",
    "module": "esnext",
    "target": "es6",
    "lib": ["es6", "dom", "esnext.asynciterable"],
    "sourceMap": true,
    "allowJs": true,
    "jsx": "react",
    "moduleResolution": "node",
    "rootDir": "src",
    "forceConsistentCasingInFileNames": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "suppressImplicitAnyIndexErrors": true,
    "noUnusedLocals": true,
    "allowSyntheticDefaultImports": true,
    "strict": true
  ,
  "exclude": ["node_modules", "build", "scripts", "acceptance-tests", "webpack", "jest", "src/setupTests.ts"]

任何建议将不胜感激! :)

编辑:将 env var args 添加到 Dockerfile。为了简洁起见,它最初被忽略了,但它最终成为问题和解决方案的一部分

【问题讨论】:

您可能应该发布错误消息。源代码在 GitHub 上吗?我有一个 React TS 项目,您可以尝试部署并开始添加一些包以查看它是否/何时失败。 github.com/styfle/react-server-example-tsx 【参考方案1】:

所以我终于找到了问题!在我原来的Dockerfile 中,NODE_ENV 被设置之前 yarn install。这意味着对于生产版本,yarn 不会安装 devDependencies,因此不会安装我的任何 @types 库。这导致了整个项目的所有编译错误。

Dockerfile 中移动NODE_ENV 下面/之后 yarn install 的定义解决了这个问题。

FROM mhart/alpine-node:10.9
WORKDIR /usr/src

COPY yarn.lock package.json ./
RUN yarn

ARG REACT_APP_API_ENDPOINT
ARG NODE_ENV

COPY . .
RUN yarn build && mv build /public

注意:据我所知,yarn build 将确保再次删除 devDependencies,所以不要担心这会导致您的构建膨胀。 :)

【讨论】:

这让我头疼了好几个小时。谢谢!

以上是关于当 NODE_ENV=production 时,Typescript 编译失败(在 Docker 中)的主要内容,如果未能解决你的问题,请参考以下文章

if(process.env.NODE_ENV === 'production') 总是假的

if(process.env.NODE_ENV ==='production')总是假的

使用带有 NODE_ENV=production 的 spawn 函数

vue 构建而不覆盖 NODE_ENV

无法让 NODE_ENV 在开班时粘在我的 MEAN 堆栈上

如何在 Windows 上设置 NODE_ENV=production?