cuando en el entorno de desarrollo, mi aplicación funciona bien. Cuando en el entorno de producción se bloquea con el error:
Uncaught TypeError: (0 , _react.useEffect) is not a function
Sucede en un archivo que creé donde importo React y useEffect de esta manera:
import React, { useEffect } from 'react'
const X = () => {
useEffect(() => { ... })
...
}
agregar un console.log justo debajo de esta línea confirma que useEffect está indefinido cuando está en producción y la función esperada cuando está en dev.
Revisé mi package.json, yarn.lock y node_modules para ver si hay alguna versión de react o react-dom que pueda estar por debajo de 16.8.0 donde se introdujo useEffect. Pero todo es 16.13.1 y son la dependencia principal e intenté limpiar mi caché de hilos, eliminar node_modules & yarn.lock y volver a instalar.
Intenté agregarlo y eliminarlo peerDependencies
sin éxito.
Puse un cheque para asegurarme de que no hay 2 versiones separadas de React ejecutándose, pero guardando window.React1 = React
dentro de la biblioteca y window.React2 = React
dentro de mi aplicación y comprobando
window.React1 === window.React2
era cierto, así que tampoco es eso.
Por último, también intenté alias Reaccionar al específico en node_modules, pero sin suerte.
La única solución que he encontrado que funciona es si la importo así:
import React from 'react';
const X = () => {
React.useEffect(() => { ... })
...
}
¿Pero esto debería ser exactamente lo mismo que usar una importación desestructurada? Si uso explícitamente React.useEffect también me obliga a cambiar todos mis otros ganchos useState y useEffect a React.useSate
yReact.useEffect
El siguiente error se convierte TypeError: (0 , _react.useState) is not a function
en : en otro archivo donde uso React hooks.
Quiero resolver el problema, no implementar una solución alternativa.
Yo uso microbundle
para atar mi biblioteca utilizando reaccionar. Utilizo parcel-bundler
para importar el componente React y renderizarlo en un entorno de desarrollo (directamente desde src) o prod (la biblioteca incluida)
La versión incluida que uso está incluida con .mjs
También verifiqué la salida del paquete .mjs minimizado y dentro de React se importa de esta manera:
import ue,{useEffect as pe,useState as fe}from"react";
Lo que me parece bien.
Lo que realmente no entiendo es cómo una importación reestructurada lo rompería, pero simplemente hacer React.useEffect funcionaría bien.
Aquí está mi paquete.json
{
"name": "xxx",
"version": "1.1.4",
"repository": "[email protected]:xxx/xxx.git",
"author": "xxx",
"license": "MIT",
"source": "src/index.ts",
"main": "dist/bundle.js",
"umd:main": "dist/bundle.umd.js",
"module": "dist/bundle.mjs",
"publishConfig": {
"registry": "https://npm.pkg.github.com/@xxx"
},
"scripts": {
"build": "microbundle",
"dev": "parcel ./test-app/dev/index.html --port 3000",
"start": "parcel ./test-app/serve/index.html --port 3000",
"storybook": "start-storybook -s ./public -c .storybook --ci",
"prepublishOnly": "yarn build"
},
"dependencies": {
"@api-platform/admin": "2.1.0",
"@api-platform/api-doc-parser": "0.8.2",
"@fortawesome/fontawesome-svg-core": "^1.2.28",
"@fortawesome/free-solid-svg-icons": "^5.13.0",
"@fortawesome/react-fontawesome": "^0.1.9",
"@material-ui/core": "^4.9.10",
"@material-ui/icons": "^4.9.1",
"@react-keycloak/web": "^2.1.1",
"@types/pluralize": "^0.0.29",
"google-geocoder": "0.2.1",
"history": "^4.10.1",
"keycloak-js": "^9.0.3",
"lodash.debounce": "^4.0.8",
"lodash.omit": "^4.5.0",
"lodash.set": "4.3.2",
"notistack": "0.9.9",
"papaparse": "^5.2.0",
"parcel-bundler": "1.12.4",
"polished": "^3.5.2",
"react": "16.13.1",
"react-admin": "3.4.1",
"react-dom": "16.13.1",
"react-is": "16.13.1",
"react-redux": "^7.2.0",
"recompose": "^0.30.0",
"redux": "4.0.5",
"styled-components": "5.1.0"
},
"devDependencies": {
"@babel/core": "7.9.0",
"@babel/plugin-syntax-export-default-from": "7.8.3",
"@babel/preset-env": "7.9.5",
"@babel/preset-react": "7.9.4",
"@storybook/addon-a11y": "5.3.18",
"@storybook/addon-actions": "5.3.18",
"@storybook/addon-info": "5.3.18",
"@storybook/addon-knobs": "5.3.18",
"@storybook/addon-links": "5.3.18",
"@storybook/addon-storyshots": "5.3.18",
"@storybook/addon-storysource": "5.3.18",
"@storybook/addon-viewport": "5.3.18",
"@storybook/react": "5.3.18",
"@testing-library/react": "^10.0.3",
"@types/jsonld": "1.5.1",
"@types/lodash": "4.14.149",
"@types/node": "13.11.1",
"@types/papaparse": "5.0.3",
"@types/react-redux": "7.1.7",
"@types/recompose": "^0.30.7",
"@types/styled-components": "5.1.0",
"@welldone-software/why-did-you-render": "4.0.7",
"awesome-typescript-loader": "5.2.1",
"babel-loader": "^8.1.0",
"babel-plugin-module-resolver": "4.0.0",
"babel-plugin-styled-components": "1.10.7",
"lodash.get": "4.4.2",
"lodash.uniq": "4.5.0",
"microbundle": "0.11.0",
"openapi-types": "1.3.5",
"parcel-plugin-static-files-copy": "2.3.1",
"pluralize": "^8.0.0"
},
"alias": {
"jsonld": "./node_modules/jsonld/dist/jsonld.js"
},
"staticFiles": {
"staticPath": "public",
"watcherGlob": "**"
}
}
También vale la pena señalar, solo con React estoy teniendo este problema. Todas mis otras importaciones reestructuradas funcionan bien.
global
indicador--globals react=React
y agregar Reaccionar como dependencias pares <- Aunque podría no ser una solución adecuada? Mira este problema: github.com/developit/microbundle/issues/537 parece que viene deyarn
microbundler
lugar dereact-scripts
para la compilación de producción, o algo alteró las configuraciones de los paquetes de una manera negativa. Quiero llamar su atención. Los nombres de los ganchos de reacción deben comenzaruse
y pueden estar en esta líneaimport ue,{useEffect as pe,useState as fe}from"react";
que usan el efecto importado porquepe
algo salió mal con la reacción. Entonces, ¿habías intentado construir concreate-react-app
yreact-scripts
?Respuestas:
Parece que
microbundler
no tolera reaccionar. Este crea un paquete que intenta usarreact
desde un alcance global, en lugar deReact
eso realmente expuesto.Por la misma razón, su solución alternativa
React.useEffect
funciona como se esperaba, solo imagine que se ve asíwindow.React.useEffect
.Aquí hay un ejemplo de una aplicación primitiva:
Después de agrupar con solo
microbundle
completamente roto, pero cuando intentas agrupar concomo sugiere correctamente @Jee Mok, producirá el paquete correcto. Espero que los comentarios expliquen lo que pasó.
Y, por cierto, la "importación reestructurada" no tiene la culpa.
fuente