geliştirme ortamında, benim app gayet iyi çalışıyor. Üretim ortamında hatayla kilitleniyor:
Uncaught TypeError: (0 , _react.useEffect) is not a function
React ve useEffect'i içe aktardığım yerde oluşturduğum bir dosyada olur:
import React, { useEffect } from 'react'
const X = () => {
useEffect(() => { ... })
...
}
Bu satırın hemen altına bir console.log eklemek, useEffect'in üretim sırasında gerçekten tanımsız olduğunu ve dev.
UseEffect'in tanıtıldığı 16.8.0'ın altında olabilecek herhangi bir tepki veya tepki sürümü için package.json, yarn.lock & node_modules'umu kontrol ettim. Ama her şey 16.13.1 ve ana bağımlılık ve iplik önbelleğimi temizlemeye, node_modules & yarn.lock'u silmeye ve yeniden kurmaya çalıştım.
peerDependencies
Başarısız bir şekilde eklemeyi ve kaldırmayı denedim .
React'ın 2 ayrı sürümünün çalışmadığından emin olmak için bir kontrol yaptım, ancak window.React1 = React
kütüphanenin window.React2 = React
içine ve uygulamama kaydetme ve kontrol etme
window.React1 === window.React2
doğruydu, o yüzden de öyle değil.
Son olarak, node_modules içindeki belirli bir React'i taklit etmeye çalıştım, ancak şanssızdı.
Ben işe yaradığını bulduğum tek çözüm, ben böyle ithal:
import React from 'react';
const X = () => {
React.useEffect(() => { ... })
...
}
Ancak bu, yıkılmış bir içe aktarma kullanmakla tamamen aynı mı olmalıdır? React.useEffect'i açıkça kullanırsam, diğer tüm kullanımlarımı değiştirmem için beni zorlar ve Durum ve useEffect kancaları React.useSate
veReact.useEffect
Sonraki hata sadece olur: TypeError: (0 , _react.useState) is not a function
React kancaları kullandığım başka bir dosyada.
Ben bir çözüm uygulamak değil sorunu çözmek istiyorum.
Kullandığım microbundle
Tepki kullanarak Kitaplığımı paketlemek için. Kullandığım parcel-bundler
Tepki bileşenli ithalat ve (doğrudan src itibaren) bir dev ortamında işlemek veya prod (paketlenmiş kütüphane) için
Kullandığım paket sürümü .mjs ile birlikte geliyor
Minimize edilmiş .mjs paketinin çıktısını da kontrol ettim ve React'ın içi şöyle ithal edildi:
import ue,{useEffect as pe,useState as fe}from"react";
Bu bana iyi geliyor.
Gerçekten anlamadığım şey, yeniden yapılandırılmış bir içe aktarmanın onu nasıl kıracağı, ancak sadece React.useEffect'i yapmak işe yarayacak mı?
İşte benim paketim.
{
"name": "xxx",
"version": "1.1.4",
"repository": "git@github.com: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": "**"
}
}
Ayrıca kayda değer, bu sorunla karşılaştığım tek tepki. Diğer tüm yeniden yapılandırılmış ithalatlarım iyi çalışıyor.
global
bayrak denemek --globals react=React
ve akran bağımlılıkları olarak Tepki ekleme <- Bu doğru bir düzeltme olmayabilir rağmen. Şu konuya bakın: github.com/developit/microbundle/issues/537 geliyor gibi görünüyoryarn
microbundler
yerine kullanmak react-scripts
ya da kötü bir şekilde paket yapılandırmaları değiştirilmiş bir şey oldu. Dikkatinizi çekmek istiyorum tepki kanca isimleri ile başlamalı use
ve bu satırda import ue,{useEffect as pe,useState as fe}from"react";
hangi useEffect ithal bir pe
şey tepki ile yanlış gitti gibi olabilir . Yani, create-react-app
ve ile inşa etmeyi denedin react-scripts
mi?