La compilación de Typescript falla (en Docker) cuando NODE_ENV=production
Así que tengo una aplicación create-react-app-ts que me gustaría dockerizar y alojar en Zeit Now.
Todo funciona bien localmente, ejecutar yarn tsc y react-scripts-ts build funciona de maravilla.
Crear la imagen de Docker también funciona muy bien a partir del siguiente Dockerfile:
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
Sin embargo, al publicar en Now, el script de compilación falla en la compilación de Typescript, mostrando errores de compilación para la mayoría de los archivos en el proyecto.
También puedo reproducir eso localmente si configuro ENV NODE_ENV production en mi Dockerfile justo encima de WORKDIR....
Entonces parece que o bien TypeScript o react-scripts-ts actúan de manera diferente cuando NODE_ENV=production. Nunca me había encontrado con este error antes, y no sé cómo depurarlo. Ejecutar NODE_ENV=production tsc o NODE_ENV=production react-scripts-ts build también funciona bien localmente.
Estoy ejecutando Typescript v 3.0.1 con la siguiente configuración:
{
"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"]
}
¡Cualquier consejo sería muy apreciado! :)
EDITAR: Se agregaron argumentos de variables de entorno al Dockerfile. Originalmente se omitieron por brevedad, pero resultaron ser parte del problema y la solución
Respuesta #1
¡Así que finalmente encontré el problema! En mi Dockerfile original, NODE_ENV estaba configurado antes de yarn install. Esto significa que para la compilación de producción, yarn no instalaría las devDependencies, y por lo tanto no instalaría ninguna de mis bibliotecas @types. Esto causó todos los errores de compilación en todo el proyecto.
Mover la definición de NODE_ENV debajo/después de yarn install en el Dockerfile resolvió el problema.
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
Nota: Hasta donde sé, yarn build se asegurará de eliminar nuevamente las devDependencies, así que no te preocupes de que esto infle tu compilación. :)
