هل تريد طلب ميزة أو الإبلاغ عن خطأ ؟
التعزيز
ما هو السلوك الحالي؟
كان لدي عدة حالات من React عن طريق الخطأ.
عند محاولة استخدام الخطافات ، حصلت على هذا الخطأ:
hooks can only be called inside the body of a function component
هذا ليس صحيحًا لأنني كنت أستخدم مكونات الوظيفة. استغرق مني بعض الوقت للعثور على السبب الحقيقي للقضية.
ما هو السلوك المتوقع؟
اعرض رسالة الخطأ الصحيحة. ربما تكتشف أن التطبيق يحتوي على حالات متعددة من React وتقول أنه قد يكون سبب الأخطاء.
للتوضيح فقط: لقد كنت تستورد خطافًا (لنقل useState
) من وحدة react
مختلفة عن تلك المستخدمة لعرض المكون؟
أوافق على أن هذا محير. لست متأكدًا مما إذا كانت لدينا طريقة لمعرفة ما إذا كانت أي وحدة React أخرى يتم عرضها. AFAIK نحاول تشغيل React بمعزل قدر الإمكان بحيث يمكن لمثيلات React المتعددة أن تعمل في نفس السياق العام دون مشاكل.
وإلا يمكننا على الأرجح تحديث رسالة الخطأ وذكر هذه الحالة أيضًا إذا لم تكن محيرة للغاية.
نعم ، لقد قارنت React1 === React2
وكان false
(React1 من index.js و React2 من الملف باستخدام الخطاف). عندما يحدث هذا ، تفشل الخطافات مع ظهور رسالة الخطأ العامة أعلاه.
تهدف هذه المشكلة إلى زيادة الوعي بهذه الحالة وربما تحسين رسالة الخطأ بطريقة ما لمساعدة الأشخاص الذين يواجهون ذلك. من المحتمل جدا على الرغم من ذلك.
نعم ، لقد حاولت ربط حزمة npm أقوم بإنشائها. إنه يلقي نفس الخطأ لأن الحزمة الأخرى تستخدم الخطافات أيضًا ولكن مع React الخاصة بها. اضطررت إلى نشر الحزمة الخاصة بي على NPM ثم استيرادها مباشرة من NPM. بهذه الطريقة ذهب الخطأ ، لكنني آمل أن يتم إصلاح ذلك لأن نشر حزمة دون اختبارها أمر سيء ، من الواضح
يعاني Lerna monorepos من هذا أيضًا عندما يتم تحديد خطاف مخصص في حزمة واحدة ويستخدمه الآخر نظرًا لأن التبعيات المرتبطة تستخدم نسختها الخاصة من التفاعلات.
لدي حل بديل (hacky) في الوقت الحالي باستخدام npm-link-shared
و prestart
npm برنامج نصي لاستبدال تبعية الحزمة الواحدة بـ react
مع رابط رمزي للآخر ، لذا فهم يستخدمون نفس المثال.
"prestart": "npm-link-shared ./node_modules/<other package>/node_modules . react"
واجهت نفس المشكلة وقمت بحلها بإضافة:
alias: {
react: path.resolve('./node_modules/react')
}
إلى resolve
في تهيئة webpack لتطبيقي الرئيسي.
من الواضح أنه كان خطئي في استخدام نسختين من React لكنني أوافق على أنه سيكون من الرائع أن تكون رسالة الخطأ أفضل. أعتقد أن هذا ربما يشبه: https://github.com/facebook/react/issues/2402
mpeyper إنه يعمل. شكرا
apieceofbart هذا عمل لي. شكرا على اقتراحك. 👍
كما أفهم ، تنشأ هذه المشكلة عند وجود نسخ متعددة من React في نفس الحزمة.
هل هذه مشكلة أيضًا إذا كانت حزمتان منفصلتان بنسخهما الخاصة من React تقومان بتشغيل تطبيقات React الخاصة بها على عناصر dom منفصلة ، كما هو موضح هنا: https://medium.jonasbandi.net/hosting-multiple-react-applications-on- نفس الوثيقة c887df1a1fcd
أعتقد أن هذا الأخير هو نمط "تكامل" شائع يستخدم على سبيل المثال في إطار عمل meta-spa أحادي (https://github.com/CanopyTax/single-spa).
أواجه هذه المشكلة أيضًا حتى مع إصدارات التفاعل نفسها تمامًا ، تطوير الخطافات ليتم نشرها بمفردها معطل عند استخدام npm-link
. الحصول على نفس الرسالة غير المفيدة hooks can only be called inside the body of a function component
. حل الاسم المستعار apieceofbart لي هذه المشكلة. شكرا جزيلا!
نفس المشكلة هنا عندما أنا npm link
حزمة إلى تطبيقي الرئيسي. لم أتمكن من الحصول على عمل babel-plugin-module-resolver
.
انها تقول:
Could not find module './node_module/react'
هذا أمر مزعج لأنه يمنعني من اختبار المكون الخاص بي محليًا قبل نشره.
لقد أصلحت مشكلتي عن طريق إزالة علامة الإقحام في "react": "^16.7.0-alpha.2"
ها هو التعليق الكامل: https://github.com/facebook/react/issues/14454#issuecomment -449585005
أنا أستخدم Yarn ، وقد أصلحت هذا عن طريق فرض الحل في package.json
:
"resolutions": {
"**/react": "16.7.0-alpha.2",
"**/react-dom": "16.7.0-alpha.2"
},
نفس الشيء هنا!!
أردت فقط ترك ملاحظة هنا لأي شخص قد يكون لديه هذه المشكلة بنفس الطريقة التي واجهت بها.
نحن نشغل React و Rails باستخدام جوهرة react-rails
ونعرض المكونات مباشرةً في عروض Rails. كنت أتلقى هذا الخطأ في كل مرة يتم فيها دفع إصدار جديد من التطبيق ، لأن Turbolinks كانت تستحوذ على حزمة JS الجديدة من <head>
التي حملت مثيلًا إضافيًا من React. كان الحل هو أن تقوم Turbolinks بإعادة تحميل صفحة كاملة عندما تكتشف أن الحزمة قد تغيرت: https://github.com/turbolinks/turbolinks#reloading -when-plants-change
يبدو أن هذا قد حلها بالنسبة لنا.
أنا متحمس جدًا لوضع Hooks أخيرًا في الإنتاج ، ونحن جميعًا مدينون بشكر كبير لكل من جعل ذلك ممكنًا. إنها متعة كبيرة في العمل بها وجعلت الكود الخاص بي أقصر وأكثر وضوحًا.
تمامًا مثل التنبيه ، لا تزال هذه المشكلة ذات صلة في الإصدار الذي تم إصداره مع نفس رسالة الخطأ غير المفيدة "لا يمكن استدعاء الخطافات إلا داخل جسم مكون الوظيفة."
هل هذا شيء يمكن حله؟ أتخيل أنه قد يصبح أكثر انتشارًا مع بدء المزيد من المطورين في تنفيذ الميزات الجديدة ، وستؤدي رسالة خطأ أوضح إلى قطع شوط طويل بدلاً من "الإصلاح" المباشر.
شكرا مرة أخرى على كل العمل الشاق وتهنئة على الإصدار! إنها حقًا مجموعة مذهلة من الميزات.
تحرير : كان يجب أن ننظر عن كثب في العلاقات العامة المفتوحة ، فقط وجدت # 14690 يعالج هذا. شكرا @ threepointone!
taylorham الرابط في الالتزام لا يشير إلى أي شيء حتى الآن. سأنتظر ذلك ، ولكن هذه مشكلة أواجهها منذ استخدام الخطافات في حزمة _ (بدءًا من npm link
) _ ومن المستحيل التعامل معها محليًا دون النشر.
بعد النظر في العديد من المشكلات ، اعتقدت أن هذه كانت مشكلة في أداة تحميل التفاعل الساخن التي كانت تجمع المكونات إلى الفئات ، ولكن حتى بعد إصدارها لإصدار مع دعم الخطاف ، فإنها لا تزال تفشل بنفس الطريقة.
لقد جربت الكثير من الاختراقات المختلفة ولكن لم يحالفني الحظ. لا أعرف لماذا لم يصب الجميع بهذه المشكلة حتى الآن 🧐
dotlouis نعم ، إنها مجرد رسالة خطأ محدثة حتى الآن والمشكلة نفسها لا تزال مؤلمة.
الشيء الوحيد الذي نجح معي على الإطلاق هو جعل أي تطبيق أقوم بتطويره يعتمد على مثيل المكتبة لـ React باستخدام "react": "link:../my-library/node_modules/react"
.
[حسنًا] بالنسبة لي ، لم يكن التصحيح متعلقًا بـ package.json أو سبب رد الفعل المزدوج الآخرين: كان لديّ themeProvider العام أعلى تطبيقي ، قادم من السياق. يبدو أن استبداله بـ "خطاف useContext" (أثناء إعادة كتابته كمركب وظيفي) هو الحل الوحيد
ربما هناك مشكلة عندما
<GoodOldContext iam={a class component}>
<BrandNewHook>
errors : Hooks can only be called inside the body of a function component #35
</BrandnewHook>
</GooOldContext>
export withGoodOldContext.consumer(here component)
أقوم بتطوير مكون حيث يوجد مجلد example
يستخدم create-react-app
.
أدى القيام بذلك بعملة package.json
حل هذه المشكلة بالنسبة لي:
{
...
"dependencies": {
"my-component": "link:..",
"react": "link:../node_modules/react",
"react-dom": "link:../node_modules/react-dom",
"react-scripts": "2.1.3"
},
...
}
taylorhamDylanVann شكرا لكم يا رفاق المدخلات. لسوء الحظ ، ما زالت لا تعمل بالنسبة لي.
ولم أتمكن من العثور على أي وثائق حول هذا البروتوكول link:
الذي استخدمته.
بشكل أساسي ، تقول أن "رد الفعل الربيع" (قسم آخر يستخدم أيضًا التفاعل كاعتمادية) لا يمكنه العثور على react-dom
. هل يمكنك أن تدلني على بعض الوثائق حول "react": "link:../some/path"
فضلك؟
أنا أستخدم حزمة واجهة المستخدم المرتبطة أيضًا وتمكنت من إصلاح هذه المشكلة.
تحتاج إلى تصدير رد فعل renderToString من واجهة المستخدم (حزمة مرتبطة).
لقد قمت بإنشاء وظيفة تصيير في الحزمة المرتبطة.
فقط من أجل سياق أفضل - https://github.com/facebook/react/issues/14257
شكرا @ theKashey. gaearon يبدو أنه يعتقد أن هذا هو السلوك الطبيعي. أحصل على أنه لا يجب تحميل React مرتين ، ولكن ما هي الطريقة الموصى بها للعمل مع حزمة محلية مرتبطة بعد ذلك؟
لدي أيضًا مشكلات في ربط مساحات عمل Lerna بشكل صحيح. كانت هذه هي الحيلة التي استخدمتها للحصول على هذا العمل. تأكد من تشغيل npm install
بعد ذلك.
"dependencies": {
"react-dom": "file:../common/node_modules/react-dom",
"react": "file:../common/node_modules/react"
}
هناك العديد من الطرق لحلها ، ولن تساعد قرارات الغزل عادةً - إنها أكثر ارتباطًا بـ "أداة البناء"
aliases
- فقط اسم مستعار "صعب" كل شيء مثل react
لملف واحد resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx'],
alias: {
react: path.resolve(path.join(__dirname, './node_modules/react')),
}
import {setAliases} from 'require-control';
setAliases({
'react': path.resolve(path.join(__dirname, './node_modules/react'))
});
moduleNameMapper
"jest": {
"moduleNameMapper": {
"^react$": "<rootDir>/node_modules/$1",
},
theKashey شكرًا على رؤيتك ، هذا منطقي عندما نفكر في كيفية عمل دقة الوحدة (أسفل ، ثم أعلى الشجرة) ، ولكن من وجهة نظر المستخدم ، لا أجد هذا عمليًا للغاية. عندما أقوم باستخدام npm link
حزمة ، أتوقع أن تعمل دون الحاجة إلى إعادة ربط التبعيات بشكل صريح. هذا يجعل تطوير حزمة محليًا أمرًا مؤلمًا للغاية.
هذا هو حجر الزاوية ، هذه هي الطريقة التي صمم بها node_modules
للعمل ، ولهذا السبب قد يكون لديك نسختان من Button
في نسختين رئيسيتين مختلفتين ، والوحدات التابعة ستعثر بسهولة على "الصحيح" نسخة من الحزمة.
هذه هي الطريقة التي يجب أن تعمل بها طوال الوقت.
العناصر الداخلية Node.js
واضحة تمامًا - حاول فتح ملف مع إضافة جميع البادئات المعروفة (مثل node_modules
) أو الامتدادات (مثل js
، ts
، json
) ؛ إذا لم يتم العثور على أي دليل انتقل إلى أعلى. الطريقة الوحيدة "لإصلاحها" - استبدال نظام دقة وحدة nodejs.
yarn pnp
سيفعل ذلك ، وقد يحل المشكلة. yarn workspaces
، والذي قد يؤدي إلى مشاركة الحزم في الأعلى - سيحل المشكلة أيضًا دون الحاجة إلى أي "سحر".
npm workspaces
؟ لا يوجد حاليا.
انتهى بي الأمر في الواقع إلى تبديل مشروعي لاستخدام مساحات العمل. إنه يحل هذا دون الحاجة إلى استخدام القرارات ، ويكون الرفع / الهيكل مفيدًا على أي حال.
كان هذا واحدًا كان مخدشًا. لقد جربت إعداد webpack solution.alias ولكنه لم يكن يعمل ، وجربت العديد من الإعدادات أيضًا ولكن لم أتمكن أبدًا من تشغيله لسوء الحظ ، ولكن إليكم كيف تمكنت أخيرًا من تشغيله:
هذا هو هيكل المجلد الخاص بي:
المشروع
|
+ - node_modules
|
+ - بناء
| |
| + - index.js
|
+ - مثال (إنشاء-رد-تطبيق)
| |
| + - package.json
اضطررت إلى تعديل package.json الخاص بي داخل مجلد المثال ، وسحب التفاعل بشكل أساسي من العقدة_الرئيسية للمشروع بناءً على اقتراحjmlivingston ، وإليك الطريقة التي ينتهي بها الأمر:
"dependencies": {
"react": "file:../node_modules/react",
"react-dom": "file:../node_modules/react-dom",
"react-scripts": "2.1.5"
},
الآن بعد ذلك قمت بتشغيل npm install
ثم قمت بتشغيل npm link
، هذه هي الحيلة.
نأمل أن يساعد هذا شخصًا آخر ويوفر بعض الوقت.
إذن أي حل لهذه المشكلة؟ لقد جربت أكبر عدد ممكن من التوصيات هنا ولم يحالفني الحظ. أنا أستخدم تطبيق create-react-app ونسخة مطبوعة. استخدام React / React-dom 16.8.3. هذا مشروع جديد أنشأته منذ يومين سهل جدًا. أنا أستخدم useSpring () و animated.div. شكرا
@ guru-florida هل تستخدم جهاز التوجيه بأي فرصة؟
أنا أستخدم نفس الحزمة التي تستخدمها (تطبع & إنشاء تطبيق-تفاعل) ومشكلتي مع السمة render
. تغييره إلى component
أدي الحيلة.
قبل:
<Route path="/signup" render={SignUp} />
بعد:
<Route path="/signup" component={SignUp} />
أتمنى أن يساعد ..!
mikeyyyyyy لا ، لا تستخدم جهاز توجيه React في هذا. شكرًا للنصيحة على الرغم من أنني كنت في المشروع الأخير الذي جربته باستخدام الربيع وكان لدي نفس المشكلة.
واجهت هذه المشكلة مع رابط npm (في تطبيق لا يتجزأ) ، يبدو أن npm link .../whatever/node_modules/react
لا يحل المشكلة ، ويعمل بشكل جيد مع المكونات غير ذات الخطاف
tj أعتقد أن لديك مشكلة مع SSR. الحل السريع هو تصدير وظائف التفاعل أو التفاعل الكامل من الحزمة المرتبطة واستيرادها في حزمة الخادم
seeden ahh أنا لا أستخدم SSR ، فقط SPA w / Parcel. لديّ ui
pkg داخليًا لأشراضي الخاصة وتطبيق أعمل عليه ، وكلاهما لهما نفس الإصدار react
، يبدو غريبًا أن هناك نسخة مكررة ولكن ربما يكون هذا مصدر قلق خاص بالطرود
tj أوه ، فهمت. ثم نتمنى لك التوفيق في هذه القضية الغريبة للغاية. قضيت أسبوع مع هذا
إذن أي حل لهذه المشكلة؟
لا توجد مشكلة هنا في حد ذاتها. كما هو موضح في هذه الصفحة ، يحتاج React إلى أن تكون مكالمات useState()
على نفس الكائن react
ككائن react
كما يظهر من داخل react-dom
. إذا لم يكن هذا ما يحدث لك ، فهذا يعني أنك تقوم بتجميع نسختين من React على الصفحة - وهو أمر سيء بحد ذاته كما أنه يكسر بعض الميزات الأخرى قبل الخطافات. لذا سترغب في إصلاحه على أي حال. تحتوي هذه الصفحة على طرق شائعة للتشخيص لإصلاحها.
نترك هذه المناقشة مفتوحة لمشاركة حلول بديلة معينة عندما يواجه الأشخاص هذه المشكلة. لكنها ليست مشكلة في حد ذاتها يمكن "حلها" بواسطة أي شخص غيرك.
واجهت هذه المشكلة مع رابط npm (في تطبيق لا يتجزأ) ، رابط npm ... / أيا كان / node_modules / رد فعل لا يبدو أنه يحلها ، يعمل بشكل جيد مع المكونات غير الخطافية على الرغم من
هل تمانع في إنشاء حالة نموذجية صغيرة؟
gaearon سيفعل ، يجب أن يكون لديه وقت للحفر أكثر قليلاً الأسبوع المقبل
لحسن الحظ ، قام require-control
بإصلاح مشكلتنا مع السياق الثابت لـ yarn link
+ SSR + العناصر المصممة 4. شكرا @ theKashey 👍
حاولت كل شيء هنا وفشلت. لقد كان في الواقع شيئًا مختلفًا لم يتم توثيقه هنا. يتعلق الأمر بحساسية الحالة للواردات المتفاعلة . في بعض الحالات كان لدينا:
import React from 'react'
وفي غيرها:
import React from 'React'
في بعض أنظمة الملفات (يونكس ، أو إس إكس) يتسبب هذا في إنشاء Webpack لنسختين من React.
تسبب هذا في ارتباك شديد لأنني استطعت أن أرى بوضوح أن لدينا نسخة واحدة فقط من React ؛ لكنها كانت الطريقة التي كنا نستوردها بدلاً من ذلك.
يأتي الاختبار على وثائق التفاعل جيدًا أيضًا لأنه من الواضح أنه يستخدم الأحرف الصغيرة فقط.
يبدو هذا وكأنه قد يستحق الذكر في المستندات؟
بالنسبة لي ، كان سبب تكرار React هو Webpack DllPlugin. بالنسبة إلى مكتبة الارتباط الديناميكي للمورد الخاص بي ، لم أقم بتضمين react
و react-dom
إلى قائمة الإدخالات الخاصة بي ، ومع ذلك ، كان لدي مكتبات أخرى تتطلب react
أو react-dom
لذا احتوت DLL الخاصة بي على react
و react-dom
(يمكن أن يكشف الفحص السريع لملف json البيان عن ذلك). لذلك ، عندما كنت أقوم بتشغيل الكود ، واستوردت React إلى التطبيق ، كان يتم تحميله من node_modules
، ولكن في كود البائعين ، كان React مطلوبًا من ملف DLL الخاص بهم.
بشكل عام : كن حذرًا مع ملفات DLL وتأكد من أن الوحدات المضمنة لا تتضمن تبعيات إضافية لا تحتاجها وإلا فسوف تضاعف استيرادها.
تمكنت من إصلاح هذا عن طريق تحديث react-hot-loader
إلى 4.6.0
هذه هي الحيلة للأشياء npm link
في الطرد:
"alias": {
"react": "../ui/node_modules/react",
"react-dom": "../ui/node_modules/react-dom"
}
لست متأكدًا مما إذا كان هذا هو ما سيحاول استخدامه لبناء إنتاج ، يبدو نوعًا من الاختراق ولكنه يعمل من أجل التطوير على الأقل
theKashey OMG يا رجل ، إنه يعمل! لقد جربت العديد من الحلول المختلفة التي يقترحها الأشخاص فيما يتعلق بهذه المشكلات: التعامل مع package.json
deps ، وتتبع "تفاعلين" عبر المشروع ، والتحقق مما إذا كنت قد انتهكت * قاعدة الخطافات "(التي لا) ، لكني أعتقد أن خيارك مع:
alias: {
react: path.resolve(path.join(__dirname, './node_modules/react')),
'react-dom': path.resolve(path.join(__dirname, './node_modules/react-dom'))
}
يسمح لنا بنقل مشروعنا إلى المستوى التالي ، باستخدام الخطافات في app-as-a-lib الخاص بنا.
هذا هو الملف webpack.config.js الناتج
npm ls react
عائدات
[email protected] D:\code\project
`-- (empty)
لي
console.log(window.React1 === window.React2)
إرجاع صحيح
في هذه المرحلة ، أعتقد أن إصلاح القطاع الأمني هو سبب المشكلة
تحديث. لقد كان السبب بالفعل هو سلوك SSR لـ React-apollo (https://github.com/apollographql/react-apollo/issues/2541)
الترقية إلى 2.3.1 إصلاحه
مرحبًا يا شباب ، يواجه فريقنا هذه المشكلة واستغرق الأمر بضعة أيام لحلها.
الحل أ: حدد موضع الحزمة للبحث عنه ، كما هو مذكور أعلاه
alias: {
react: path.resolve(path.join(__dirname, './node_modules/react')),
'react-dom': path.resolve(path.join(__dirname, './node_modules/react-dom'))
}
الحل ب: استخدم webpack solution.modules لتحديد أولويات مجلد node_modules الصحيح للبحث عن الوحدات
أول شيء أولاً ، إنه ليس خطأ رد الفعل ، بل إنه ليس خطأ lerna ، ولكن قد يحتاج رد فعل ، حزمة الويب ، و npm-link إلى تحمل بعض المسؤوليات.
-غير monorepo:
هيكل
- mono repo root
- packages
- ComponentWithHooks (peerDependency: react@^16.8.1)
- ProductA (dependency: ComponentWithHooks, dependency: react@^16.8.4)
- ProductB (dependency: react@^16.8.1)
بمجرد التمهيد مع مساحات العمل ، سيتم حلها إلى
- mono repo root
- node_modules
- react(16.8.1)
- packages
- ComponentWithHooks
- node_modules (empty)
- ProductA
- node_modules
- react(16.8.4)
- ProductB
- node_modules (empty)
وبمجرد أن تخدم ProductA
مع حزمة الويب أو ربما أي شيء آخر ، فستحتوي على مثيلين للتفاعل.
الكود في ProductA ، سيبحث عن ProductA/node_modules/react
.
لكن ComponentWithHooks الذي تم استيراده سيبحث عن mono repo root/node_modules/react
.
لماذا ا؟ تذكر قواعد البحث عن npm؟ إذا لم تتمكن من العثور على الوحدة النمطية في مجلد node_modules الخاص بها ، فسوف تبحث عن node_modules الخاصة بالوالدين ...
لذا فقد طبقت أدوات مثل webpack هذه القاعدة بشكل افتراضي تمامًا.
لا حرج في أن يصبح حل الريبو الأحادي شائعًا.
ولن تلاحظ الحزمة العادية هذا لأن معظمها لا يتطلب مثيلًا واحدًا مثل رد الفعل والإعادة.
أواجه نفس المشكلة باستخدام استنساخ أساسي للغاية باستخدام مثال مساحات عمل الغزل - https://github.com/mwarger/yarn-workspace-hooks-repro
لدي component-library
مكتوب بخط مطبوع ومجمع مع طرد. example-demo
هو ما سيعرض هذا component-library
وهو تطبيق CRA تم إنشاؤه حديثًا. يتم رفع جميع الحزم الشائعة باستخدام خيوط ، لذلك من الناحية النظرية ، يجب أن يكون هناك إصدار واحد فقط من التفاعل متاح. ومع ذلك ، فإن المكالمة React.useEffect
التي أجريها في index.tsx تسبب الخطأ الذي يقودني إلى مشكلة GitHub هذه.
كل شيء يعمل حتى يتم إضافة خطاف. لإعادة إنتاج الخطأ ، قم بإلغاء التعليق من 7 إلى 9 في component-library/src/index.tsx
آمل أن أفعل شيئًا سخيفًا قد أغفلته. يرجى تقديم المشورة فيما يتعلق بأي خطوات قد أستخدمها لمحاولة علاج ذلك. شكرا لك!
تحرير المتابعة: إخراج البرنامج النصي لتصحيح الأخطاء المقترح أدناه يطبع true
بالنسبة لي. يبدو أنه ليس لدي تفاعلين.
// Add this in node_modules/react-dom/index.js
window.React1 = require('react');
// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);
استغرقت عدة ساعات ، لذا قد يكون من المفيد تدوين ملاحظة هنا.
في حالتي ، وضعت سطرًا <script defer src="./dist/bundle.js" />
في رأس قالب HTML ، والذي يعمل كالمعتاد عند عدم استخدام خطافات React. جميع الحلول لا تعمل ويعيد الشيك window.React1 == window.React2
true
في هذه الحالة.
نظرًا لأن حزمة الويب ستضخ علامة البرنامج النصي بعد ذلك ، فلا يجب أن يحتوي القالب على علامة البرنامج النصي من تلقاء نفسه. قم بإزالة علامة البرنامج النصي من القالب ، واجعل React وظيفية مع الخطافات (يقصد التورية) مرة أخرى.
في حالتي ، لدي تطبيق React والذي كان مرتبطًا بتبعية كنت أعمل عليها. سيؤدي هذا إلى الحيلة حتى أتمكن من إصلاح بعض التبعيات التي تحتاج إلى نقل react
و react-dom
إلى إدارات التطوير والنظراء.
cd node_modules/react && npm link
cd node_modules/react-dom && npm link react
npm link react
لماذا تعمل؟ تشير صفحة التحذير من الخطأ إلى أنه "لكي تعمل الخطافات ، يحتاج استيراد التفاعل من كود التطبيق الخاص بك إلى حل نفس الوحدة النمطية مثل استيراد التفاعل من داخل حزمة رد فعل دوم".
ما زلت أواجه هذه المشكلة ، على الرغم من تجربة كل ما سبق. تهيئة webpack4 / babel القياسية ، مع مكونات إضافية preset-env
و preset-react
. يتم تثبيت إصدارات رد فعل / رد دوم الخاصة بي على 16.8.4
باستخدام دقة الغزل (حيث يرجع أيضًا الاختيار window.React1 === window.React2
من أعلاه true
).
هذا في أبسط الاستخدامات:
import React, { useState } from "react";
function MyComp() {
const [hello] = useState(0);
return <div>HELLO {hello}</div>;
}
export default MyComp;
هل يملك أحدا أي أفكار أخرى؟
تحرير: للتوضيح ، يظهر الخطأ على أنه react.development.js:88 Uncaught Invariant Violation: Hooks can only be called inside the body of a function component.
حسب OP
في حالتي ، لدي تطبيق React والذي كان مرتبطًا بتبعية كنت أعمل عليها. سيؤدي هذا إلى الحيلة حتى أتمكن من إصلاح بعض التبعيات التي تحتاج إلى نقل
react
وreact-dom
إلى إدارات التطوير والنظراء.
- من التطبيق:
cd node_modules/react && npm link
- من التطبيق:
cd node_modules/react-dom && npm link react
- من الحزمة المرتبطة:
npm link react
لماذا تعمل؟ تشير صفحة التحذير من الخطأ إلى أنه "لكي تعمل الخطافات ، يحتاج استيراد التفاعل من كود التطبيق الخاص بك إلى حل نفس الوحدة النمطية مثل استيراد التفاعل من داخل حزمة رد فعل دوم".
شكرا! هذا يعمل بشكل جيد بالنسبة لي. (حتى عند استخدام الوضع المختلط للرابط والرمز npm)
لقد جربت كل ما هو مقترح أعلاه وما زلت أواجه الخطأ.
بقليل من المساعدة من inverherive ، وجدنا أن enzyme-adapter-react-16
لا يزال يتسبب في حدوث مشكلات.
بينما قمنا بتحديث react-test-renderer
إلى أحدث إصدار (16.8.4) لأنه أضاف مؤخرًا دعم الخطافات ، وجدنا عبر npm ls react-test-renderer
أن أحدث إصدار من enzyme-adapter-react-16
(1.11.2 ) لديه تبعية داخلية [email protected]
، والتي لا تدعم الخطافات.
├─┬ [email protected]
│ └── [email protected]
└── [email protected]
لإصلاح هذه المشكلة ، بالإضافة إلى اتباع إصلاحات chulanovskyi ، نظرًا لأننا نستخدم الغزل ، أضفنا قرارات react-test-renderer
إلى package.json الخاص بنا. هذا يفرض على كل مراجع react-test-renderer
استخدام "16.8.4".
"resolutions": {
"react-test-renderer": "16.8.4"
},
كان هذا محبطًا للغاية ، أتمنى أن يساعد هذا شخصًا آخر. بفضل chulanovskyi و @ theKashey لاقتراحاتهم أيضًا.
سيؤدي هذا إلى الحيلة حتى أتمكن من إصلاح بعض التبعيات التي تحتاج إلى تحريك رد فعل ورد فعل دوم إلى dev و peer deps.
ajcrews (ربما فاتني شيء ما ولكن) أنا npm link
مكتبة داخلية بها react
في peerDependencies
و devDependencies
وما زلت بحاجة إلى إصلاح بغض النظر عن حل الخطأ. بحث جميل!
كنت على وشك أن أنشر ولكن وجدت حلا
لدي مكتبة مكونات ، مع مثال على تطبيق CRA بالداخل من أجل التطوير
في حزمة تطبيق CRA.
"dependencies": {
"react": "link:../node_modules/react",
"react-dom": "link:../node_modules/reac-dom",
}
كان هذا محبطًا للغاية ، أتمنى أن يساعد هذا شخصًا آخر. بفضل chulanovskyi و @ theKashey لاقتراحاتهم أيضًا.
@ Paddy-Hamilton تحقق دائمًا من ملف القفل بعد التثبيت. لقد واجهت نفس المشكلة حيث كان yarn
يكرر react-test-renderer
. مع القليل من الجراحة في ملف القفل الخاص بك ، يمكنك إصلاح ما يلي:
yarn add -D react-test-renderer
-react-test-renderer@^16.0.0-0, react-test-renderer@^16.1.1:
+react-test-renderer@^16.0.0-0:
version "16.8.4"
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.4.tgz#abee4c2c3bf967a8892a7b37f77370c5570d5329"
integrity sha512-jQ9Tf/ilIGSr55Cz23AZ/7H3ABEdo9oy2zF9nDHZyhLHDSLKuoILxw2ifpBfuuwQvj4LCoqdru9iZf7gwFH28A==
dependencies:
object-assign "^4.1.1"
prop-types "^15.6.2"
react-is "^16.8.4"
scheduler "^0.13.4"
+react-test-renderer@^16.8.5:
+ version "16.8.5"
+ resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.5.tgz#4cba7a8aad73f7e8a0bc4379a0fe21632886a563"
+ integrity sha512-/pFpHYQH4f35OqOae/DgOCXJDxBqD3K3akVfDhLgR0qYHoHjnICI/XS9QDwIhbrOFHWL7okVW9kKMaHuKvt2ng==
+ dependencies:
+ object-assign "^4.1.1"
+ prop-types "^15.6.2"
+ react-is "^16.8.5"
+ scheduler "^0.13.5"
سيحذرك A yarn check
بالفعل
$ yarn check
warning "enzyme-adapter-react-16#react-test-renderer@^16.0.0-0" could be deduped from "16.8.5" to "[email protected]"
ثم قم بإزالته يدويًا عن طريق تطبيق التصحيح التالي:
-react-test-renderer@^16.0.0-0:
- version "16.8.4"
- resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.4.tgz#abee4c2c3bf967a8892a7b37f77370c5570d5329"
- integrity sha512-jQ9Tf/ilIGSr55Cz23AZ/7H3ABEdo9oy2zF9nDHZyhLHDSLKuoILxw2ifpBfuuwQvj4LCoqdru9iZf7gwFH28A==
- dependencies:
- object-assign "^4.1.1"
- prop-types "^15.6.2"
- react-is "^16.8.4"
- scheduler "^0.13.4"
-
-react-test-renderer@^16.8.5:
+react-test-renderer@^16.0.0-0, react-test-renderer@^16.8.5:
الآن لديك نسخة واحدة من react-test-renderer
بدون أي مخادع للاسم المستعار resolutions
أو webpack
.
لأية مشاكل متعلقة بالحزم المرتبطة و create-react-app
اتبع facebook / create-response-app # 6207
هناك العديد من الطرق لحلها ، ولن تساعد قرارات الغزل عادةً - إنها أكثر ارتباطًا بـ "أداة البناء"
- لحزمة الويب ، استخدم
aliases
- فقط اسم مستعار "صعب" كل شيء مثلreact
لملف واحدresolve: { extensions: ['.ts', '.tsx', '.js', '.jsx'], alias: { react: path.resolve(path.join(__dirname, './node_modules/react')), }
- للطرد ، استخدم نفس الأشياء ، ولكن حددها في package.json - https://parceljs.org/module_resolution.html#aliases
- بالنسبة إلى nodejs (غير الدعابة) ، قد تستخدم تتطلب التحكم
import {setAliases} from 'require-control'; setAliases({ 'react': path.resolve(path.join(__dirname, './node_modules/react')) });
- من باب الدعابة استخدم
moduleNameMapper
"jest": { "moduleNameMapper": { "^react$": "<rootDir>/node_modules/$1", },
هذا فعلها من اجلي
تضمين التغريدة
شكرا لك! يعمل ببراعة بالنسبة لي!
لقد صنعت حالة اختبار صغيرة مع الحد الأدنى من الإعداد باستخدام رد فعل 16.8.6 ، حزمة الويب الإلكترونية و RHL. والجدير بالذكر ، عندما يحدث هذا الخطأ ، يبدأ المتصفح بأكمله (في هذا الإعداد ، الإلكترون) في استخدام مجموعة كاملة من وقت وحدة المعالجة المركزية)
https://github.com/PerfectionCSGO/reeee
لقد كنت أصفق رأسي بشأن هذه المشكلة لمدة 3 أيام حتى الآن. في الأصل اعتقدت أن RHL كانت هي المشكلة ولكن إزالة ذلك تمامًا من هذا المشروع لن يحل المشكلة.
npm ls رد فعل إرجاع نتيجة واحدة فقط. لقد تأكدت من تطبيق الإصلاح أعلاه مع أحدث الإصدارات + الاسم المستعار لحزمة الويب.
سيعمل الرمز في وضع الحماية.
في حزمة ويب / موقع ويب بسيط ، ستعمل الشفرة بدون مشكلة. ومع ذلك ، استمرت هذه المشكلة مع حزمة الويب الإلكترونية.
"dependencies": {
"i18next": "^15.0.9",
"i18next-browser-languagedetector": "^3.0.1",
"react": "^16.8.6",
"react-dom": "npm:@hot-loader/react-dom",
"react-hot-loader": "^4.8.2",
"react-i18next": "^10.6.1",
"source-map-support": "^0.5.11",
"tslint": "^5.15.0"
},
"devDependencies": {
"@babel/core": "^7.4.3",
"@babel/preset-react": "^7.0.0",
"@babel/preset-typescript": "^7.3.3",
"@types/react": "^16.8.12",
"@types/react-dom": "^16.8.3",
"electron": "^4.1.3",
"electron-builder": "20.39.0",
"electron-webpack": "^2.6.2",
"electron-webpack-ts": "^3.1.1",
"typescript": "^3.4.1",
"webpack": "^4.29.6"
}
آمل أن يعطيني أحدهم مؤشرًا ...
عندما أقوم باستبدال رد فعل- l18next بـ mobx-رد فعل-لايت واستخدام مراقب ، فسوف يتسبب ذلك في نفس التأثير.
فيما يتعلق بمشكلتي ، لقد قمت بحلها عن طريق إرفاق حزمة إلكترونية إلكترونية والذهاب مع حل إلكترون أكثر نقاءً. أظن أنها سلسلة أدوات مستخدمة في webpack أو babel غير متوافقة.
واجهت هذه المشكلة فقط في الإنتاج. لم تساعد الحلول المقترحة هنا.
كانت حالة الاستخدام الخاصة بي عبارة عن تطبيق تابع لجهة خارجية يتم تحميله كأداة في موقع ويب آخر.
عندما تم تحميل الموقع لأول مرة مع عنصر واجهة المستخدم ، كان كل شيء يعمل بشكل جيد ، ولكن عندما ينتقل المستخدم إلى صفحة مختلفة ويعود إلى الصفحة مع الأداة ، تلقيت خطأ الخطافات.
لاحظ أن الخطأ يحدث فقط عندما لا يتسبب التنقل في إعادة تحميل الصفحة.
قضيت ساعات في محاولة لمعرفة ما هي المشكلة. أخيرًا كانت المشكلة في مقتطف الشفرة الذي يحمّل حزمة التطبيق. عند تغيير الصفحة ، يمكن تحميل الحزمة عدة مرات ، مما تسبب في اعتقادي إلى مثيلات React متعددة في نفس مساحة الاسم.
لقد أصلحته عن طريق التحقق مما إذا كان البرنامج النصي قد تم تحميله بالفعل.
أولاً قمت بتصدير مكتبتي إلى مساحة الاسم العالمية باستخدام تكوين "مكتبة" Webpack:
output: {
library: 'myLib',
...
}
ثم في نص التحميل ، تحققت مما إذا كانت المكتبة موجودة أم لا:
if(!window.myLib){
var bz = document.createElement('script');
bz.type = 'text/javascript';
bz.async = true;
bz.src = 'https://path/to/bundle.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(bz, s);
}
قد تكون حالة استخدام محددة للغاية ولكن آمل أن يساعد هذا شخصًا آخر.
لذلك لدينا تطبيق React رئيسي يستفيد من حزمة الويب.
نحاول إنشاء مكتبة React صغيرة تستخدم الخطافات ، وقد حاولنا تبديل الحزم (parcel، pure babel، webpack).
عند تجربة تنفيذ حزمة الويب الخاصة بنا ، قمنا بتمييز رد فعل و رد فعل دوم على أنهما خارجي ، لذلك لن نقوم بتضمينهما في الحزمة الخاصة بنا.
ما زلنا نحصل على نفس استثناء الخطافات عند استخدام رابط npm.
يعمل إنشاء ارتباط رمزي لتفاعل التطبيق الرئيسي ، ولكنه ليس سير عمل مطورًا رائعًا.
أواجه صعوبة في معرفة السبب الأساسي للمشكلة. ما الذي ينتج نسخة مكررة من React؟
مرحبًا @ adriene-orange ، قد تجد رسالتي https://github.com/facebook/react/issues/13991#issuecomment -472740798 لمزيد من التوضيحات.
تعدد المثيلات الناتج عن ارتباط npm يرجع إلى أن العقدة بشكل افتراضي ستبحث في وحدات node_modules للمجلد الأصلي عن الوحدة النمطية إذا لم تتمكن من العثور عليها في الحزمة الخاصة بك.
أبسط وأفضل حل نجده لهذا هو في تكوين حزمة الويب الخاصة بحزمة المدخل (أو أدوات أخرى) ، هناك شيء مثل resolve.modules
لتعيين المسارات يدويًا وترتيب المسارات التي ستبحث عنها حزمة الويب للوحدات النمطية. ستجبر Exp. ، resolve: { modules: [path.resolve(PACKAGE_ROOT, 'node_modules'), 'node_modules'] }
، حزمة الويب للبحث عن وحدات في node_module الخاصة بجذر حزمة الدخول أولاً. إذا لم تتمكن من العثور على الوحدة النمطية في الجذر ، فابحث في مجلد node_modules النسبي ...
لذلك لدينا تطبيق React رئيسي يستفيد من حزمة الويب.
نحاول إنشاء مكتبة React صغيرة تستخدم الخطافات ، وقد حاولنا تبديل الحزم (parcel، pure babel، webpack).
عند تجربة تنفيذ حزمة الويب الخاصة بنا ، قمنا بتمييز رد فعل و رد فعل دوم على أنهما خارجي ، لذلك لن نقوم بتضمينهما في الحزمة الخاصة بنا.
ما زلنا نحصل على نفس استثناء الخطافات عند استخدام رابط npm.يعمل إنشاء ارتباط رمزي لتفاعل التطبيق الرئيسي ، ولكنه ليس سير عمل مطورًا رائعًا.
أواجه صعوبة في معرفة السبب الأساسي للمشكلة. ما الذي ينتج نسخة مكررة من React؟
مرحبًا ، أتلقى هذا الخطأ
انتهاك ثابت: اتصال غير صالح في موضع الإغلاق. لا يمكن استدعاء الخطافات إلا داخل جسم مكون الوظيفة. قد يحدث هذا لأحد الأسباب التالية:
1. قد يكون لديك إصدارات غير متطابقة من React والعارض (مثل React DOM)
2. ربما تكون قد انتهكت قواعد الخطافات
3. قد يكون لديك أكثر من نسخة واحدة من React في نفس التطبيق
راجع https://fb.me/react-invalid-hook-call للحصول على نصائح حول كيفية تصحيح هذه المشكلة وحلها.
5 |
6 | const useApiHelper = (url, reducer) => {
> 7 | const [state, dispatch] = useReducer(reducer, {});
| ^
8 |
9 | useEffect(() => {
10 | fetch(url).then(res => res.json())
نموذج كود https://stackblitz.com/edit/react-mbze9q
عندما أحاول الوصول إلى هذه الوظيفة داخل حالات الاختبار ، فإنني أتلقى خطأً أعلاه
abhishekguru أنت تستدعي الخطاف خارج أحد المكونات هنا في اختبارك:
test('API test', async () => {
const newState = useAPIHelper( // <- Called outside of a component
'https://jsonplaceholder.typicode.com/posts',
reducer
)
console.log(newState, 'new');
// expect(newState[samUrl].loading).toEqual(true);
});
كما ينص الخطأ ، لا يمكن استدعاء الخطافات إلا من خطاف آخر ، أو من داخل مكون. في حالتك ، يمكنك إنشاء مكون للاختبار الخاص بك وتقديم هذا المكون الذي يستخدم الخطاف إذا كنت ترغب في ذلك.
المكونات وقح
abhishekguru إذا كان لديك خطاف عام مستخدم بين مكونات متعددة وتريد اختباره بشكل مستقل عن أي مكون معين ، فيمكنك التفكير في استخدام react-hooks-testing-library
.
import { renderHook } from 'react-hooks-testing-library'
test('API test', async () => {
const { result } = renderHook(() => useAPIHelper( // <- now called within a component
'https://jsonplaceholder.typicode.com/posts',
reducer
))
console.log(result.current, 'new');
// expect(result.current[samUrl].loading).toEqual(true);
});
كنت أرغب في التناغم هنا لأننا واجهنا مشكلات مع SSR فقط. نقوم بمسح require.cache
للعقدة عند تغيير الملف. هذا يعطي إعادة التحميل بشكل فعال على الخادم. سيؤدي مسح العقدة require.cache
إلى حدوث مشكلات مع المكتبات التي تحتاج إلى نسخة واحدة. هذا هو الحل لدينا:
Object.keys(require.cache)
.filter(key => !isSingleton(key)) // This is needed here because react cannot be deleted without causing errors
.forEach(key => {
delete require.cache[key]
})
تحتوي وظيفة isSingleton
على قائمة المكتبات التي يجب أن تحتوي على نسخة واحدة. القاعدة الأساسية الجيدة هي أي مكتبة تحتاج إلى تعريف في peerDependencies
https://yarnpkg.com/lang/en/docs/dependency-types/#toc -peerdependencies
كما كان لها نفس المشكلة وبالنسبة لي
window.React1 = require('react');
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2); // true
عاد أيضًا true
، جرب جميع الاقتراحات المقدمة ولكن لم ينجح شيء. أخيرًا اتضح أن:
يضيف Webpack علامة البرنامج النصي مع bundle.js
إلى index.html
تلقائيًا. كانت مشكلتي لأنني كنت أضيف bundle.js
إلى index.html
بشكل صريح ، والذي كان يعمل بشكل جيد قبل الخطافات.
بالنسبة لي ، كانت المشكلة بعد ترقية babel 7 ، ولم تكن هناك إصدارات منفصلة مع تفاعل npm ls. إزالة
قام "رد فعل-لودر ساخن / بابل" من .babelrc بإصلاح المشكلة مؤقتًا.
لقد جربت جميع الحلول المذكورة أعلاه ، ولكن لا يزال الخطأ موجودًا.
في النهاية ، اكتشفت أن سبب ذلك هو الحزمة why-did-you-update
، وهناك مشكلة متعلقة بها. مجرد دليل لأي شخص يستخدم حزمة مماثلة تعدل React.
لقد تمكنت من إصلاح هذا في سيناريو react-native
+ Yarn Workspaces
.
في الجذر package.json
{
"private": true,
"workspaces": {
"packages": [
"packages/*"
],
"nohoist": [
"**/react-native",
"**/react-native/!(react)/**"
]
}
}
هذا يمنع رفع الكود react-native
(كما هو مطلوب للتفاعل الأصلي) ، بينما لا يزال يرفع react
، وبالتالي فإن جميع الوحدات المشتركة تستخدم نفس التفاعل.
في metro.config.js
module.exports = {
watchFolders: [
path.resolve(__dirname, '../', 'shared-module'),
// ...more modules
path.resolve(__dirname, '../', '../') // to make sure the root `react` is also part of the haste module map
]
}
يتيح تكوين metro للمجمع معرفة مكان كل شيء.
لقد وجدت طريقة لحل المشكلة للأشخاص الذين يطورون محليًا حزمة npm على سبيل المثال ، وهم يحاولون اختبارها محليًا عن طريق تحميل الحزمة الخاصة بهم باستخدام رابط npm في نوع من أمثلة التطبيق.
لقد قمت بالتبديل من مثال التطبيق (الطريقة الأصلية لاختبار المكون) إلى Storybook . عند استخدام كتاب القصة في المشروع ، لن يتم تحميل React مرتين لأنه سيستخدم نفس العنصر الذي يستخدمه المكون. أثناء استخدام رابط npm ، واجهت مشكلات مع الخطافات وتحميل React مرتين ، كما أنني لم أتمكن من تشغيل أي من الحلول المذكورة أعلاه. لذا فإن Storybook قد حل مشكلتي ، ولدي الآن طريقة لاختبار المكون الخاص بي من خلال سيناريوهات متعددة وفي نفس الوقت إنشاء بعض الوثائق التفاعلية له.
من خلال مشاركة تجربتي في هذا الأمر ، قمت بحلها لمشروعنا باستخدام عناصر خارجية من webpack لمكتبة المكونات لاستبعاد react
و react-dom
من الإصدار.
لقد بدأنا للتو مع React. في حالتي ، بدأنا بـ Lerna monorepo مع حزمة مكتبة مكونات Neutrino وحزمة عميل Neutrino webapp. يستهلك تطبيق الويب منتج الإنشاء لمكتبة المكونات المرتبطة. بعد بعض التجارب والحصول على true
لنفس مثيل React ، بحثت عن طريقة لاستبعاد react
و react-dom
من إنشاء مكتبة المكونات على الإطلاق.
يبدو أنه حل نمط تصميم شائع لمكتبات مكونات حزمة الويب ، لذا قمت بإضافته في مكتبة المكونات إلى تكوين حزمة الويب:
"externals": {
"react": "react",
"react-dom": "react-dom"
}
لم أكن بحاجة إلى وضع علامة نصية عامة في حزمة تطبيقات الويب مقابل react
و react-dom
. أظن أن Webpack يقوم بتوفيرها لمكتبة المكونات في تنفيذها require
بنفس الطريقة التي توفرها لتطبيق الويب.
سبب آخر لهذا الخطأ هو الخطأ في تكوين Route
الخاص بـ React Router ،
هذا يفشل :
<Route render={MyHookedComponent}/>
ولكن هذا نجح :
<Route component={MyHookedComponent}/>
على سبيل المثال. تحتاج إلى استخدام component
وليس render
. من السهل ارتكاب هذا الخطأ نظرًا لأن render
يعمل بشكل جيد مع المكونات المستندة إلى الفصل.
كنت أعمل على biolerplate وأريد نشره على npm ، وتطويره بمساعدة رابط npm ، كان يعمل بشكل صحيح ولكن بعد فترة بدأت بإعطاء أخطاء Invalid Hook call warning
.
حاولت استخدام رابط npm ../myapp/node_modules/react لكنه لا يحل مشكلتي ،
وبالمقارنة مع React1 === React2
فهذا صحيح وكذلك npm ls react
تم أيضًا ، فإنه يظهر حزمة واحدة فقط.
وأنا لا أستخدم حزمة الويب أيضًا ، فأنا أقوم فقط بإضافة بعض الطبقات خارج تطبيق create-response- حتى لا أجبر تطبيقي على استخدام وحدة تفاعل مثبتة محليًا.
عالقة معها منذ 3 أيام.
مثل hnagarkoti .
لقد واجهت هذا التحذير أثناء عرض جانب الخادم (SSR) لأنني كنت أستخدم إصدارًا قديمًا من react-apollo
لذا أردت فقط ترك هذا الرابط هنا لمساعدة الروح المسكين التالية التي تواجه هذه المشكلة:
https://github.com/apollographql/react-apollo/issues/2541
باختصار ، getDataFromTree
لا يدعم خطافات التفاعل حتى الإصدار [email protected]
.
واجهت نفس المشكلة وقمت بحلها بإضافة:
alias: { react: path.resolve('./node_modules/react') }
إلى
resolve
في تهيئة webpack لتطبيقي الرئيسي.من الواضح أنه كان خطئي في استخدام نسختين من React لكنني أوافق على أنه سيكون من الرائع أن تكون رسالة الخطأ أفضل. أعتقد أن هذا ربما يشبه: # 2402
هل هناك أي اقتراحات للقيام بذلك باستخدام تطبيق create-response-app؟
^ حسنًا ، الحل الذي ذهبت إليه لحل هذا من أجل إنشاء تطبيق رد فعل هو استخدام رد فعل - إعادة توصيل التطبيق وتخصيص cra.
ها هو config-overrides.js الخاص بي:
const {
override,
addWebpackAlias,
} = require("customize-cra");
const path = require('path');
module.exports = override(
addWebpackAlias({
react: path.resolve('./node_modules/react')
})
)
مشروع مثال: https://github.com/dwjohnston/material-ui-hooks-issue/tree/master
لدينا في فريقنا مكون تنقل عالمي يعمل عبر عشرات التطبيقات ، كل هذه التطبيقات تأتي من رد فعل 15.0.0 لتفاعل 16.8.0 ، من أجل تمكين التنقل المطبق أعلاه ، يتعين علينا تجميعه بأحدث رد فعل
في هذه الحالة ، يعد وجود حالات متعددة من رد الفعل مطلبًا أساسيًا بالنسبة لنا ، أود أن أعرف ما إذا كان رد فعل الفريق الرسمي على استعداد لحل هذه المشكلة في المستقبل؟
dwjohnston كان الحل البديل الخاص بي مقابل create-react-app
هو إنشاء webpack config من أجل التطوير. يستخدم create-react-app
داخليًا webpack و webpack-dev-server ومحمل babel لذا فإن إنشاء حزمة webpack فقط من أجل التطوير لم يكن سيئًا للغاية لأن التبعيات موجودة بالفعل ضمنيًا ولكن لا يزال هناك قدر كبير من النفقات العامة للحصول عليها العمل بشكل صحيح.
لدي مشكلة في create-react-app
: https://github.com/facebook/create-react-app/issues/6953 لإضافة دعم webpack alias
أو ما شابه.
👋 إذا كان أي شخص يستخدم أيضًا create-react-app
ويعاني من نقطة الألم هذه ، فهل يمكنك إعطاء هذه المشكلة إبهامًا؟
ricokahler - شكرًا على الإشارة إلى ذلك. يسعدني أن أرى أنني لست الشخص الوحيد الذي يعاني من هذه المشكلة - لقد صادفتها مع السياق أيضًا.
هل هناك أي موارد تعرفها وتناقش هذه المشكلة بشكل أكبر؟
إذا كنت في قاربي ، فقد أضفت حزمة مكون تفاعل من دليل محلي ، والآن تقوم ببنائها وتثبيتها تلقائيًا ، جنبًا إلى جنب مع نسختها الخاصة من node_modules (لأنها تستخدم رابط npm للقيام بذلك) ، مما يمنحك نسخ التطبيق 2 أو رد الآن.
لقد عملت حوله عن طريق حذف node_modules /
"prestart": "rimraf ./node_modules/<my_package>/node_modules"
لقد واجهت هذا أيضًا عند إجراء SSR.
إذا كنت تستخدم Lerna للاختبار المحلي لمكتبة React الخاصة بك ، فيمكنك إضافة "رد فعل / رد فعل دوم / رد فعل جهاز توجيه" مثل peerDependencies في مكتبتك ، ولكن لا يجب عليك إضافتها على أنها devDependencies. (هذا يجعلها مكررة)
يمكنك استخدام node --preserve-symlinks
حتى يتمكن من البحث عن الريبو الأصل الذي يقوم بتثبيت peerDependencies.
على سبيل الدعابة ، تحتاج إلى إضافة مسار الريبو الأصل إلى خيار "jest.moduleDirectories" حتى يتمكن Jest من حلها
apieceofbart إنه يعمل بالنسبة لي ، تشك!
واجهت هذا الخطأ عند تحميل مكونات React الخارجية ، على سبيل المثال مع وحدات JS النمطية. إنها خارج المشروع تمامًا ، محملة بخاصية الاستيراد الديناميكي () (حسناً jsonp لمزيد من الدعم). للتغلب على هذه المشكلة ، نقوم بتمرير / حقن React كخاصية لكل وحدة. يعمل هذا ، ولكن بعد ذلك تعتمد كل وحدة على تطبيق React الذي يحتوي على. نحن نحاول إزالة التبعيات.
كما ذكر آخرون ، فإن هذه الخاصية تلغي React باعتبارها قابلة للاستخدام لأي نوع من الواجهات الأمامية المصغرة. تكمن المشكلة في وجود هذا التأثير الجانبي لإنشاء حالة عامة في وقت تشغيل JS عند استيراد React لاستخدامها كمكتبة.
أتفهم أنه بالنسبة لحالات الاستخدام البسيطة ، فإن وجود هذا التأثير الجانبي يعني أن React "أسهل في الاستخدام". ولكن عندما تتكون صفحة الويب من نصوص متعددة من خطوات الحزمة المتعددة ، يجب أن يكون أحدهم قادرًا على إعداد React (قم بهذا التأثير الجانبي بشكل صريح) ويمكن للآخرين استدعاء وظائف المكتبة.
ما زلت أواجه مشكلة في رد فعل التمهيد: # https://github.com/react-bootstrap/react-bootstrap/issues/3965
بالنسبة لأي شخص آخر عالق في محاولة إنشاء lib لـ React ، جرب https://github.com/whitecolor/yalc ، فهو يعمل بشكل أفضل من الروابط الرمزية.
mpeyper يعمل بشكل جيد. شكرا
apieceofbart هذا عمل لي. شكرا على اقتراحك. 👍
بالنسبة لي ، حدثت هذه المشكلة عندما انتقلت إلى دليل مشروعي في PowerShell ولم أحمل اسم دليل في المسار بأحرف كبيرة. لقد أنشأت المشروع في المستخدمين / ... / ... بدلاً من المستخدمين / ... / ...
تم حل المشكلة عندما أصلحت أخطاء الرسملة وأعدت إنشاء المشروع.
بالنسبة لي ، القيام بما يلي:
"react": "file:../my-library/node_modules/react",
"react-dom": "file:../my-library/node_modules/react-dom",
تم إصلاح معظمها ولكن لم يكن كافيًا ، ظللت أتلقى الخطأ hooks can only be called inside the body of a function component
.
تبين أن السبب في ذلك هو أن بعض مكونات مكتبتي تم تصديرها على النحو التالي:
export default Radium(withTranslation()(MyComponent))
: x:
حيث withTranslation
هو المكوّن الإضافي من رد فعل i18next و Radium
هو المكوّن الإضافي من Radium.
وتصديرها هكذا:
export default withTranslation()(Radium(MyComponent))
: heavy_check_mark:
تم إصلاح كل شيء.
لاحظ أن رد فعل i18next كان في الإصدار 10 الذي يستخدم خطافات React
mikeaustin نواجه نفس المشكلة. هل لديك أي مثال على "تمرير / حقن React كخاصية لكل وحدة نمطية"؟
ما زلت تواجه هذه المشكلة ، جرب جميع الخطوات:
بعض الأشياء التي يمكن أن يكون لها تأثير:
$ npm ls react-dom
/xxx
└── [email protected]
$ npm ls react
/xxx
└── [email protected]
حزمة الجذر
{
...
"workspaces": [
"packages/*",
],
"devDependencies": {
...
},
"dependencies": {
"react": "16.8.6",
"react-dom": "16.8.6"
},
"resolutions": {
"react": "16.8.6",
"react-dom": "16.8.6",
"**/react": "16.8.6",
"**/react-dom": "16.8.6"
}
}
JeremyGrieshop لدي نفس المشكلة والتي عملت معي ، شكرًا.
أضف "premart" في package.json الخاص بك على النحو التالي:
"scripts": {
"prestart": "rimraf ./node_modules/<my package>/node_modules",
"start": "react-scripts start",
"build": "react-scripts build",
},
واجهت هذه المشكلة ولم تكن بسبب إصدارات متعددة من رد فعل / رد فعل دوم
في الأدوات المخصصة التي أستخدمها ، تم مسح ذاكرة التخزين المؤقت المطلوبة (لغرض خارج هذه المناقشة) ، على سبيل المثال:
Object.keys(require.cache).forEach((key) => {
delete require.cache[key];
});
لذا لمعلوماتك للأشخاص الموجودين هناك ، إذا كنت تفعل شيئًا كهذا - فسيؤثر على خطافات React ، لذا تجنبها إذا استطعت
واجهت نفس المشكلة وقمت بحلها بإضافة:
alias: { react: path.resolve('./node_modules/react') }
إلى
resolve
في تهيئة webpack لتطبيقي الرئيسي.من الواضح أنه كان خطئي في استخدام نسختين من React لكنني أوافق على أنه سيكون من الرائع أن تكون رسالة الخطأ أفضل. أعتقد أن هذا ربما يشبه: # 2402
بالنسبة لأي شخص يستخدم Parcel ، إذا كان dist
مكان ملفاتك المجمعة ، فيجب عليك إضافة:
"alias": {
"react-mediator": "./dist"
},
إلى package.json
الخاص بك وبعد ذلك لا يزال بإمكانك link
(npm أو الغزل) المكتبة للتطوير / الاختبار المحلي.
mikeaustin نواجه نفس المشكلة. هل لديك أي مثال على "تمرير / حقن React كخاصية لكل وحدة نمطية"؟
يمكنك استخدام سياق React لتمرير "React" نفسها ، وإنشاء HoC لحقن الخاصية في كل مكون. يمكنك تمرير أي شيء في api مثل api.React ، لكنه يحصل على بعض الصعوبة في التفاف HoCs حول هذه المكونات (لأنها متوفرة الآن فقط داخل أحد المكونات ، وليست متاحة للتصدير.
const withReact = Component = props => (
<ReactContext.Provider value={api => <Component api={api} {...props} /> } />
)
أقضي ساعتين في هذا ، إذا لم يكن تغيير الكود المصدري لتغيير رسالة الخطأ وإضافة المزيد من المعلومات إليه أمرًا سهلاً وتحتاج إلى مزيد من الوقت ، على الأقل أضف هذه الملاحظة إلى المستند ،
_p.s: رد فعل يحتوي على وثائق رائعة ، لكنني أعتقد أن هذه الصفحة تحتاج إلى مراجعة ._
تضمين التغريدة
تمكنت من إصلاح هذا عن طريق تحديث
react-hot-loader
إلى^4.6.0
معان ، هذا أصلحها.
gaearontheKashey ما رأيك في إضافة هذا إلى https://reactjs.org/warnings/invalid-hook-call-warning.html حتى لا يضيع الناس وقتهم بسبب إصدار أقدم من react-hot-loader
؟
اعتقدت أنه تم توثيقه جيدًا عبر اثنتي عشرة مشكلة بالفعل.
مرحبًا ، أنا أستخدم React في كل من التطبيق والمكتبة . أستخدم المكتبة داخل التطبيق. تمكنت من إصلاح مشكلتي مثيلي التفاعل باستخدام:
في تكوين حزمة الويب للتطبيق :
alias: { react: path.resolve( '__dirname', '..', 'node_modules', 'react' ) // Adapt this to match your file tree
في مكتبة webpack config
externals: {
react: 'react', // Case matters here
'react-dom': 'react-dom' // Case matters here
}
لذا أواجه مشكلة في استدعاء الخطافات من ملف غير مترجم (* .js):
index.js
:
import ReactDOM from 'react-dom';
import './index.css';
import App from './app';
ReactDOM.render(App(), document.getElementById('root'));
app.jsx
import React from 'react';
import { BrowserRouter as Router, Route, Link } from 'react-router-dom';
const BaseContext = React.createContext();
const initialState = {
woo: true
};
const reducer = (state, action) => {
switch (action.type) {
default:
return state;
}
};
const Home = () => <h1>You're at home.</h1>;
const App = () => {
// eslint-disable-next-line
const [state, dispatch] = React.useReducer(reducer, initialState);
return (
<Router>
<BaseContext.Provider value={initialState}>
<BaseContext.Consumer>
<div className="welcome">
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
</ul>
</nav>
<header className="header">
<h1>Welcome!</h1>
</header>
<Route path="/" exact component={Home} />
</div>
</BaseContext.Consumer>
</BaseContext.Provider>
</Router>
);
};
export default App;
أي نصيحة ، بافتراض أنها ليست "نقلها إلى ملف JSX و transpile"؟
لا شيء يبدو أنه يعمل بالنسبة لي ، فأنا أستخدم مزيجًا من التحفيز والتفاعل ، ولدي تطبيق هجين ، وبدأت في استخدام الخطافات وفشلت بمجرد أن بدأت في إضافة turbolinks :(
تحرير: في الوقت الحالي ، قمت بحل مشكلتي عن طريق إضافة data-turbolinks-track="reload" data-turbolinks-eval="false"
إلى علامات البرنامج النصي التي استخدمتها بحيث يجب أن تفعل ذلك في الوقت الحالي
لدي نفس السؤال ، بعد 4 ساعات ، لقد وجدت أن جينكينز يستخدم ملفات التحويل المفقودة .babelrc إلى الخادم 。。。
لماذا هذا يخلق الخطأ؟
$ npm ls react
[email protected] /mnt/g/development/javascript/pow-vehmain
└── [email protected]`
Invalid hook call...
ServiceVisitMaintenance
src/components/ServiceVisit/ServiceVisitMaintenance.js:6
3 | import { ServiceVisitForm } from './ServiceVisitForm';
4 |
5 | const data = [{ id: 1, description: 'Ford' }, { id: 10, description: 'Edsel' }];
> 6 | const ServiceVisitMaintenance = () => {
7 | const [vehicleList, setVehicleList] = useState([]);
8 | return (
9 | <div>
ServiceVisitMaintaint.js:
import React, { useState } from 'react';
import { ServiceVisitForm } from './ServiceVisitForm';
const data = [{ id: 1, description: 'Ford' }, { id: 10, description: 'Edsel' }];
const ServiceVisitMaintenance = () => {
const [vehicleList, setVehicleList] = useState([]);
return (
<div>
<ServiceVisitForm vehicleList={data} />
</div>
);
};
export { ServiceVisitMaintenance };
يرجى التحقق من إصدار رد الفعل الخاص بك.
$ npm ls رد فعل dom
[email protected] / mnt / g / development / javascript / pow-ignmain
└── رد فعل- [email protected]
لقد واجهت هذا عندما أقوم بتصدير اتصال (mapStateToProps) (MyComponent) من المكتبة وباستخدام تلك المكتبة في تطبيق CRA الخاص بي.
لا ، كان هذا خطأي السيئ. الروتين الذي يسمى هذا استخدم رد فعل جهاز التوجيه دوم واستخدم خاصية العرض بدلاً من المكون.
هل واجه أي منكم نفس المشكلة ولكن مع غاتسبي؟
أحصل على النتيجة التالية بعد أن أتفاعل مع npm ls:
و "npm ls reaction-dom"
في البداية ، اعتقدت أنني قد قمت بتثبيت تفاعل عالمي بطريق الخطأ ، بعد إلغاء التثبيت على مستوى العالم ، لم يتغير شيء. بعد ذلك ، حاولت إنشاء مشروع جديد تمامًا في دليل مختلف ، "gatsby new random-name" وأضفت ميزة صغيرة (أضف التعليقات ، متابعًا إلى https://www.youtube.com/watch؟ .be) إلى gatsby-starter-default لاختبار ما إذا كان الخطأ سيعيد إنتاج نفسه. حسنًا ، مما يثير استيائي ، لقد فعلت!
سيتم استقبال أي نصيحة أو كل النصائح بشكل جيد من قبل عامة الناس المحبطين.
ما زلت أواجه هذه المشكلة في القصص القصيرة. هل هذا الناتج من npm ls صحيح أم لا؟
في حالتي ، كان سبب المشكلة هو الوحدة النمطية why-did-you-update
.
المستخدم إما مساحة العمل و lerna monorepo ورفع الحزمة. من شأنها أن تحل المشكلة.
نواجه نفس المشكلة مع SSR. يبدو أنه يعمل من خلال تعيين externals: [“react”]
في تكوين webpack الخاص بنا ثم تحميل react/umd/react.development.js
يدويًا. هذا هو الألم ، ولكن أود أن أجد طريقة أبسط.
حسنًا ، أتمنى أن يساعد هذا شخصًا ما. كنا نحمل webpack runtime.js عدة مرات عن طريق الخطأ مما تسبب في وجود نسخ متعددة من React. تأكد من تحميل runtimeChunk (runtime.js) مرة واحدة فقط.
إذا كانت لديك مشكلة في اختبارات Jest مثلي ، فهذا ما يبدو أنه يصلح لي.
أضف هذا في jest.config.js
moduleNameMapper: {
'^react$': '<rootDir>/node_modules/react/'
}
سيكون من الجيد أن يشير هذا الخطأ على الأقل إلى الملف الذي يحدث فيه. لقد اتصلت بطريق الخطأ بخطاف في وظيفة عادية وكان من الصعب تصحيحه.
لقد وجدت سببًا آخر للمشكلة والحل لها.
بيئتي هي electron
و webpack
لكن هذا قد يساعد أيضًا الأشخاص غير الإلكترونيين. قضيت أيامًا مؤلمة في محاولة لحل سبب ظهور رسالة الخطأ هذه بعد الترقية إلى React 16.9 (و React DOM 16.9).
في حالتي ، يبدو أن لديّ تفاعلين في التطبيق ، لكنني لم أتمكن من العثور على مكتبتين فعليتين في وحدات node_modules ، ولا حتى باستخدام npm ls react
. حتى أنني استخدمت webpack-bundle-analyzer
لإلقاء نظرة على ما بداخل الحزمة.
في النهاية ، اكتشفت أنه ليس لدي تفاعلين فعليًا في المشروع ، ولكن تمت الإشارة / تحميل React و React DOM مرتين في ملف HTML . يمكن التحقق من ذلك بسهولة عن طريق إضافة مثل console.log("React load")
إلى index.js من مكتبة React.
تم ربط المصدر الحقيقي بـ electron-webpack
. لم يتم تمييز التفاعل والتفاعل-dom على أنه خارجي ، لذلك تم تحميله في الحزمة وكذلك لاحقًا من وحدات node_modules بسبب طلب استخدامها في بعض الوحدات النمطية الأخرى.
كان الحل بسيطًا مثل إضافة هذه السطور إلى webpack.renderer.config.js
:
module.exports = {
externals: [
"react",
"react-dom"
],
};
حسنًا ، إذا كان أي شخص هنا يستخدم parcel.js ، لسبب غريب ، تمكنت من التخلص من الاستيراد التالي: import React from 'React';
وبمجرد أن بدأت في استخدام خطافات التفاعل ، تلقيت خطأ الانتهاك الثابت ولم أدرك أنه كان لأنني كنت أستورد بشكل غير صحيح باستخدام from 'React'
بدلاً من from 'react'
. عذرًا.
هل واجه أي منكم نفس المشكلة ولكن مع غاتسبي؟
أحصل على النتيجة التالية بعد أن أتفاعل مع npm ls:
و "npm ls reaction-dom"
في البداية ، اعتقدت أنني قد قمت بتثبيت تفاعل عالمي بطريق الخطأ ، بعد إلغاء التثبيت على مستوى العالم ، لم يتغير شيء. بعد ذلك ، حاولت إنشاء مشروع جديد تمامًا في دليل مختلف ، "gatsby new random-name" وأضفت ميزة صغيرة (أضف التعليقات ، متابعًا إلى https://www.youtube.com/watch؟ .be) إلى gatsby-starter-default لاختبار ما إذا كان الخطأ سيعيد إنتاج نفسه. حسنًا ، مما يثير استيائي ، لقد فعلت!
سيتم استقبال أي نصيحة أو كل النصائح بشكل جيد من قبل عامة الناس المحبطين.
نعم لقد واجهت نفس المشكلة مثلك. لقد اتبعت النصيحة هنا ... ،
// Add this in node_modules/react-dom/index.js
window.React1 = require('react');
// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);
أضفت React2 لفهرسة الملف تحت الصفحات. إنها ترجع كاذبة.
Deduped يعني أن npm كان يجب أن يضاعف التبعية ، انظر هنا ...
لا يلزم تثبيت نفس الحزمة مرتين! تمت الإشارة إليه للتو.
كما أنها تنقل الحزم "لأعلى الشجرة" (تسطيح الشجرة). هذا منطقي تمامًا لأنه بخلاف ذلك سيتعين على حزمة واحدة أن تبحث في node_modules لبعض الحزم الأخرى (والتي ستكون نوعًا من الفوضى) وتساعد على تبسيط التبعيات.
يمكنك التحقق من صحة ذلك ، حيث يمكن العثور على كل حزمة في مخطط التبعية الخاص بك والتي تقول تمت الاستغناء عنها مرة أخرى على الأقل في الرسم البياني ، وعادةً في "مستوى أعلى".
على الرغم من أنه من الواضح أن عملية التفريغ لم تنجح.
ماذا حاولت؟
أتلقى هذا الخطأ عند محاولة الإنشاء باستخدام NextJS. تستخدم بعض المكونات واجهة المستخدم المادية وتزول المشكلة إذا قمت بإزالتها. أنا لا أستخدم المكونات المصممة. حاولت حذف node_modules وما إلى ذلك دون حظ. لقد حاولت إضافة أسماء مستعارة وحلقات react
في ملف next.config.js و package.json بدون حظ. أنا أستخدم رد فعل 16.8.6 ، رد فعل دوم 16.8.6 ، و 9.0.4 التالي. يقول npm ls
أن هناك واحدًا فقط من كلٍّ منهما. أنا لا أستخدم أي روابط npm.
المستودع: https://github.com/dancancro/questions/tree/invalid-hook-call
Codesandbox موجود هنا: https://codesandbox.io/s/github/dancancro/questions/tree/invalid-hook-call/؟fontsize=14
Stackoverflow: https://stackoverflow.com/questions/57647040/nextjs-invalid-hook-call-hooks-can-only-be-called-inside-of-the-body-of-a-fun
الخطأ موجود هنا: https://gist.github.com/dancro/2dfafb053aaaedfade406fd4f67eb68a
... تقديم -> RenderToString -> ReactDOMServerRenderer.read -> ReactDOMServerRenderer.render -> Object.WithStyles [as render] ...
الخطاف المخالف هو استدعاء useStyles()
على السطر 17428 من الملف التالي في دالة withStyles
. ابحث عن "var class = useStyles (props)". تكمن المشكلة في الكود الذي تم إنشاؤه nextjs. الكود الذي كتبته لا يستخدم withStyles
أو أي خطافات أو أي وظائف تبدأ بـ "use *"
تحديث: أدت إزالة هذا من next.config.js إلى حل المشكلة:
webpack: config => {
config.externals = [
'/'
]
return config
},
اكتشفت حلاً بديلاً عن طريق حذف react
و react-dom
من مجلد node_modules
بالحزمة المرتبطة.
أنا في نفس المركب مثل الكثير منكم. لدي حزمة مكتبة أعمل عليها محليًا ، ولا أرغب في مواجهة مشكلة نشرها في كل مرة أحتاج فيها إلى رؤية التغييرات في حزمة التطبيق الخاصة بي. لقد ربطته وبدأت في الحصول على هذا الخطأ.
هذا هو الحل:
npm link
'dnode_modules
للحزمة أdist/
، بما في ذلك node_modules
node_modules
، احذف react
و react-dom
لاحظ أنني قمت بتثبيت نفس الإصدار من React في كلا الحزمتين. سيكون عليك إعادة تشغيل أي عمليات قيد التشغيل.
إزالة الأعمال غير المتوافقة مع why-did-you-update
بالنسبة لي. (https://github.com/maicki/why-did-you-update/issues/52)
غير متوافق لماذا قمت بالتحديث
@ bertho-zero يمكن استخدام أدوات devtools الجديدة أو استخدام الخطاف الخاص بي useWhyDidYouUpdate
brunolemos إنه رائع ولكنه أكثر تقييدًا لأنه يجب عليك وضعه على كل مكون.
حل @ dmart914 لي حل المشكلة. لدي أيضًا حزم مرتبطة حتى أتمكن من اختبار مكتبتي دون نشر تغيير ... هل وجد أي شخص حلاً لهذا؟ إن نشر مكتبة مفتوحة المصدر ليست تجربة رائعة ويجب أن تقوم بتوثيق حذف حزم NPM معينة لكي تبدأ الخطافات في العمل بطريقة سحرية ...
لا يعمل الحل المتعلق بإزالة الوحدة النمطية react
للحزمة المرتبطة إذا كانت هذه الحزمة تحتوي على اختبارات تتطلب react
(على سبيل المثال ، @testing-library/react
أو @testing-library/react-hooks
) ، لذلك يبدو أننا ما زلنا بحاجة إلى طريقة أفضل للتعامل مع هذا الأمر.
يتكون طلبي من جزأين. تطبيق الويب الرئيسي والوحدة النمطية التي يتم تحميلها ديناميكيًا في تطبيق الويب. يستخدم كل من تطبيق الويب والوحدة React 16.9.0.
يتم تحميل الوحدة في تطبيق الويب باستخدام React.lazy () و dynamic import ().
عندما يتم تحميل الوحدة النمطية يتم إلقاء الخطأ "استدعاء ربط غير صالح".
في حالتي ، منذ أن تم إنشاء التطبيق الرئيسي والوحدة النمطية بشكل منفصل ، فإنهم ليسوا على دراية ببعضهم البعض وسيكون لديهم نسختهم الخاصة من رد الفعل. لقد جربت الاقتراحات التالية التي تم العثور عليها في الموضوع ولكن لم أحل المشكلة.
إضافة اسم مستعار في webpack.config للوحدة النمطية والذي يشير إلى رد فعل التطبيق الرئيسي كما هو مقترح من قبل apieceofbart.
الاسم المستعار: {
رد فعل: path.resolve ("../../ node_modules / رد فعل")
}
حاولت توجيه تبعيات التفاعل في package.json للوحدة النمطية إلى التطبيق الرئيسي.
"التبعيات": {
"رد فعل دوم": " ملف: ../ مشترك / node_modules / رد فعل دوم "،
"رد فعل": " ملف: ../ مشترك / node_modules / رد فعل "
}
أعتقد أن رد فعل يجب أن يدعم تشغيل نسخ متعددة عندما يتعلق الأمر بالوحدات التي يتم تحميلها ديناميكيًا.
بناءً على بعض الردود أعلاه ، إليك ما نجح معي:
config/webpack.config.js
externals: {
react: {
root: 'React',
commonjs2: 'react',
commonjs: 'react',
amd: 'react'
},
'react-dom': {
root: 'ReactDOM',
commonjs2: 'react-dom',
commonjs: 'react-dom',
amd: 'react-dom'
}
}
package.json
"devDependencies" : {
...
"react": "^16.9.0",
"react-dom": "^16.9.0",
}
"peerDependencies": {
"react": "^16.9.0",
"react-dom": "^16.9.0"
}
public/index.html
<head>
<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
...
بعد ذلك ، تمكنت من تشغيل الخطافات في مكتبتي باستخدام React المحملة من CDN ، بينما استمر Jest في تحميل نسخة التفاعل من node_modules (مثبتة من devDependencies).
امل ان يساعد
لقد واجهت هذه المشكلة عندما أحاول تغيير المكون الخاص بي من مكون وظيفي إلى مكون classfull وأحصل أيضًا على هذا الخطأ ، لذا إليك الحل فيما يتعلق بهذا الخطأ ، آمل أن يساعد في حالتك أيضًا.
حاول استخدام مكون عالي المستوى في هذه الحالة
استيراد رد من "رد فعل" ؛
استيراد PropTypes من "أنواع العناصر" ؛
استيراد {withStyles} من "@ material-ui / styles" ؛
زر استيراد من "@ material-ui / core / Button" ؛
أنماط const = موضوع => ({
جذر: {
الخلفية: "تدرج خطي (45 درجة ، # FE6B8B 30٪ ، # FF8E53 90٪)" ،
الحد: 0 ،
راديوس: 3 ،
boxShadow: "0 3px 5px 2px rgba (255، 105، 135، .3)" ،
اللون الابيض'،
ارتفاع: 48 ،
المساحة المتروكة: "0 30 بكسل" ،
} ،
}) ؛
تعمل الفئة HigherOrderComponent على توسيع React.Component {
يقدم - يجعل(){
const {class} = this.props؛
إرجاع (
مكون عالي الرتبة
) ؛
}
}
HigherOrderComponent.propTypes = {
الفصول الدراسية: PropTypes.object.isRequired ،
} ؛
تصدير افتراضي مع أنماط (أنماط) (HigherOrderComponent) ؛
أنا أستخدم Yarn ، وقد أصلحت هذا عن طريق فرض الحل في
package.json
:"resolutions": { "**/react": "16.7.0-alpha.2", "**/react-dom": "16.7.0-alpha.2" },
هل أضفت في حزمة الوالدين أو الطفل؟
بناءً على بعض الردود أعلاه ، إليك ما نجح معي:
- تمت إضافة ما يلي إلى
config/webpack.config.js
externals: { react: { root: 'React', commonjs2: 'react', commonjs: 'react', amd: 'react' }, 'react-dom': { root: 'ReactDOM', commonjs2: 'react-dom', commonjs: 'react-dom', amd: 'react-dom' } }
- تم تحرير
package.json
"devDependencies" : { ... "react": "^16.9.0", "react-dom": "^16.9.0", }
"peerDependencies": { "react": "^16.9.0", "react-dom": "^16.9.0" }
- تم تعديله
public/index.html
<head> <script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script> ...
بعد ذلك ، تمكنت من تشغيل الخطافات في مكتبتي باستخدام React المحملة من CDN ، بينما استمر Jest في تحميل نسخة التفاعل من node_modules (مثبتة من devDependencies).
امل ان يساعد
لا إهانة ، ولكن من المزعج أن مثل هذه الحلول يجب اتباعها. لقد كنت أحاول حل هذا الخطأ خلال اليومين الماضيين دون الاعتماد على مثل هذه الاختراقات.
أنا أعمل على مكتبة قابلة لإعادة الاستخدام تحتوي على مكونات باستخدام الخطافات. أحتاج إلى اختبارها في مشاريع فعلية قبل نشرها. الحل الوحيد لذلك هو استخدام yarn|npm link
. أقوم بتجميع المكتبة باستخدام التجميع ، ويمكنني التحقق من أن الحزمة لا تحتوي على نسخة من رد الفعل. عندما أقوم بتجميع (حزمة الويب) التطبيق الذي يستخدم المكتبة ، يظهر الخطأ / المشكلة. يحدث هذا للتطبيقات العارية create-react-app
و next.js
للتطبيقات أيضًا. كلا الإطارين يستخدمان حزمة الويب في الخلفية.
هل وجد أي شخص حلاً مستدامًا حتى الآن؟
بالتخلي عن npm|yarn link
تمامًا ، تمكنت من حل المشكلة. بدلاً من ذلك ، أستخدم هذه المكتبة الجميلة ، والتي لا تعرف بنية مشروعك. كما يتيح لك أيضًا الاستمرار في استخدام حزمة الويب كمجمع ، لذلك لا يتعين عليك إعلان _react_ و _react-dom_ على أنهما external
أو alias
. لسوء الحظ ، فإنه يقدم بعض الدلائل الجديدة ويقفل الملفات للمشروع ، ولكن مهلا ، إنه يعمل ... محليًا وحتى داخل حاويات عامل الإرساء لدينا.
ربما سيكون هذا في القائمة مفيدًا بعض الشيء:
GabrielBB شكرا ، إنه عمل بالنسبة لي
@ dmart914 شكرا! الحل الوحيد الذي يناسبني حتى الآن :)
تتلقى حاليًا تحذير React Invalid Hook Call عند استخدام إعداد بسيط ومباشر.
مكون الوظيفة هذا:
__ التبعيات__
رد @ 16.10.1
رد فعل[email protected]
[email protected]
[email protected]
وتشغيل webpack test.js -o main.js
للبناء.
أتوقع أن هذا الملف:
React.useState
.test
وقم بتحديث رد الاتصال updateTest
.React.useEffect
.هل أفعل شيئًا خاطئًا أم أن هناك شيئًا آخر يحدث؟
// test.js
import React, { createElement as el } from 'react';
import ReactDOM from 'react-dom';
function Item() {
debugger;
const [test, updateTest] = React.useState(false); // Throws React error.
React.useEffect(function checkTest() { // Throws React error.
console.log("checking test", test);
}, [test]);
React.useEffect(function tester() { // Throws React error.
if (!test) {
setTimeout(() => {
console.log("changing value for test");
updateTest(true);
}, 1000);
}
}, [test]);
return el('div', {style: {width: '300px', height: '300px', 'background-color': 'green', border: '1px solid red'}});
}
function render() {
let root = document.querySelector('#primary');
if (!root) {
root = document.createElement('div');
document.body.appendChild(root);
}
ReactDOM.render(Item(), root);
}
render();
لقد نسيت إنشاء عنصر بالفعل. أنت تستدعي Item()
بشكل متزامن قبل أن تصل إلى المكالمة ReactDOM.render
. تحتاج إلى تمرير el(Item)
.
صحيح! شكرا لك على المعلومات.
أنا في وضع مماثل لبعض المعلقين الآخرين. أنا أستخدم حزمة الويب لتحويل بعض مكونات التفاعل (بعضها يستخدم الخطافات) ووضع الشفرة المنقولة في مجلد lib
. لقد أضفت رد فعل إلى الحقل externals
لتكوين حزمة الويب حتى لا يتم تجميعها مع كود المكون. أرغب في استخدام هذه المكونات في مشروعين منفصلين - فهذه المكونات مشتركة بينهما ولذا نود تطويرها في مكان واحد وجعل التحديثات تنعكس في كلا التطبيقين.
إذا تمت إضافة التبعية باستخدام common-components: file:../../common-components/lib
في package.json ، فسيتم تحميل المكونات بشكل مثالي ، ولكن تشغيل حزمة الويب لا يؤدي إلى تحديث المكونات على الفور - بدلاً من ذلك ، يجب أن أقوم بتشغيل yarn upgrade common-components
ثم إعادة تشغيل خادم dev.
إذا تمت إضافة التبعية باستخدام common-components: link:../../common-components/lib
، فستؤدي إعادة تشغيل webpack إلى تحديث الملفات في node_modules
للتطبيق الرئيسي (نظرًا لأنه يستخدم ارتباطًا رمزيًا الآن) ، ولكني أتلقى الخطأ أعلاه المتمثل في مثيلات متعددة من تتفاعل. أفترض أنه يستخدم الآن الإصدار التفاعلي الموجود في المجلد common-components/node_modules
.
هل هناك طريقة لاستخدام الروابط الرمزية (مثل common-components: link:../../common-components/lib
) ، مع التأكد أيضًا من استخدام المكونات المرتبطة للتفاعل الموجود في مجلد node_modules للتطبيق الرئيسي؟ نظرًا لأنني أخطط لاستخدام هذه المكونات في كلا التطبيقين ، لا يمكنني ربط حزمة التفاعل من أحدهما بمكتبة المكونات الشائعة وأود تجنب ربط تفاعلات التطبيقات الرئيسية مع تلك المستخدمة في حزمة المكونات المشتركة. لقد رأيت بعض التعليقات التي تشير إلى حقل webpack resolve
الذي يبدو واعدًا ولكني غير قادر على تشغيله. أي مساعدة سيكون موضع تقدير كبير!
تحرير: لأي شخص مهتم بحالة الاستخدام الخاصة بنا ، انتهى بنا الأمر بتغيير خطوة الإنشاء لنسخ الملفات ببساطة إلى المشروعين المطلوبين فيهما ، وتجنب النقل تمامًا.
قد يكون أحد الحلول السريعة هو عدم نشر الحزمة ، ولكن فقط دفعها إلى github واستيرادها إلى مشروعك باستخدام yarn add <git-url>
.
قد يكون أحد الحلول السريعة هو عدم نشر الحزمة ، ولكن فقط دفعها إلى github واستيرادها إلى مشروعك باستخدام
yarn add <git-url>
.
السبب الذي يجعل الكثير منا يستخدم المسارات النسبية للحزمة npm link و npm هو تطوير واختبار الكود دون الحاجة إلى نشر التغييرات على NPM أو GitHub قبل أن نعرف أنه سيعمل.
لقد واجهنا هذه المشكلة المتعلقة بـ https://github.com/facebook/react/issues/13972#issuecomment -447599035 حيث أعتقد أن هذا يمكن أن يكون بسبب خادم Webpack'd Node. كانت حالة الاستخدام الخاصة بنا عبارة عن اختبار تكامل يتم تشغيله داخل Jest والذي تم تشغيله webpack()
برمجيًا لبناء الخادم قبل تنفيذ الاختبارات. أعتقد أن المشكلة تتعلق بكيفية وجود ESM و CJS في نفس الوقت.
خذ هذا المثال على سبيل المثال:
// node express server, doing server-rendering
import React from 'react';
import { ApolloProvider } from '@apollo/react-common';
import { renderToStringWithData } from '@apollo/react-ssr';
res.send(await renderToStringWithData(<ApolloProvider><App /></ApolloProvider>)
ما أراه أثناء جلسة مصحح الأخطاء هو أنه يمكننا الحصول على مثيلين مختلفين من React في النسخة المترجمة من هذا الملف:
_react: {Children, ...}
_react2: {default: {Children, ...}
أين
_react
من ESM import React from 'react'
في هذا الملف
_react2
من CJS var _react = _interopRequireDefault(require("react"));
من داخل node_modules/@apollo/react-ssr/lib/react-ssr.cjs.js
أعتقد أن هذا تسبب في عدم تساوي الإشارة إلى React في المكانين (ملف عرض الخادم ، وداخل حزمة @apollo/react-ssr
) وبالتالي تسبب في طرح الخطأ.
وجدنا أن هذا ربما كان ناتجًا عن الاستخدام الآلي لـ webpack()
من داخل الاختبار ، وقمنا بإعادة تشكيل هذه الاختبارات لتكون اختبارات شاملة. الدرس هو أنه إذا كانت المشكلة تحدث فقط في كود الاختبار ، فقد تكون لديك اختبارات معقدة للغاية.
تمكنت من حلها مع الغزل:
cd إلى myApp/node_modules/react
و yarn link
ثم في مكتبتك ، قم بتشغيل yarn link react
تستخدم مكتبتك الآن نفس إصدار التفاعل تمامًا مثل تطبيقك الرئيسي
حاولت ضبط رد الفعل على أنه تبعية الأقران في lib الخاص بي ولكن بعد ذلك لن يبني lib
كيف يمكن إصلاح ذلك باستخدام create-react-app
بدون إخراج أو التبديل إلى yarn
؟
يمكنك فقط استخدام نفس الأسلوب بالضبط باستخدام رابط npm. لا حاجة للقذف.
لا يعد ربط react
أفضل فكرة عند العمل في مشاريع متعددة بإصدارات مختلفة.
woles أنت على حق تمامًا ولكن في حالتي ، هذا يحل مشكلة "الخطافات" الخاصة بي. آمل أن يتوصل المطورون في رد الفعل إلى حل أفضل
أهلا،
لقد أصلحت هذا الخطأ بعد ساعات من إدراك أنني استخدمت المكون عن طريق الخطأ داخل جهاز التوجيه المتفاعل.
كان تطبيقي يعمل ولكن في مكون واحد لم أتمكن من إضافة useState على الإطلاق. السبب هو أنني استخدمت المكون داخل طريقة عرض أجهزة التوجيه التفاعلية بدون وظيفة الترتيب الأعلى مثل هذا:
<Route exact path="/path" render={ ComponentCausingTheErrorMesage }/>
التبديل إلى
<Route exact path="/path" component={ ComponentNowWorkingAgain }/>
أصلحه لي
كنت أستخدم npm link
بين تطبيق ووحدة كنت أعمل عليها بنشاط ، واضطررت إلى إصلاحها عن طريق ربط التطبيق react
و react-dom
بالوحدة النمطية ، ثم الربط الوحدة النمطية للتطبيق:
في التطبيق:
cd node_modules/react && npm link
react-dom
في الوحدة:
npm link react && npm link react-dom
npm link
في التطبيق:
npm link [module-name]
أمل أن هذا يساعد شخصاما
كان لدينا خطافات تعمل من جانب العميل ولكننا كنا نواجه هذا الخطأ في SSR. قام زميلي بحل هذا الأمر من خلال ما يلي في تهيئة حزمة الويب من جانب الخادم:
const nodeExternals = require('webpack-node-externals');
const serverConfig = () => {
// lots of config, then:
externals: [
nodeExternals({
modulesFromFile: true,
}),
],
}
تمكنت من حلها مع الغزل:
cd إلى
myApp/node_modules/react
وyarn link
ثم في مكتبتك ، قم بتشغيل
yarn link react
تستخدم مكتبتك الآن نفس إصدار التفاعل تمامًا مثل تطبيقك الرئيسي
حاولت ضبط رد الفعل على أنه تبعية الأقران في lib الخاص بي ولكن بعد ذلك لن يبني lib
هذا يعمل بشكل جميل فقط
واجهت للتو هذه المشكلة ، عند استخدام حزمة الويب الإلكترونية ، تفاعل مع واجهة المستخدم المادية في نفس الوقت. عندما أحاول استخدام أي شيء من واجهة المستخدم المادية - أتلقى هذا الخطأ (على سبيل المثال ، حاول استخدام مكون أو استخدام
حدث الخطأ في مكونات من واجهة المستخدم المادية.
أي حلول لقضيتي؟
مرحبًا ZVER3D ، حاول قراءة تعليقي السابق. أتمنى أن يساعد!
كنت أستخدم
npm link
بين تطبيق ووحدة كنت أعمل عليها بنشاط ، واضطررت إلى إصلاحها عن طريق ربط التطبيقreact
وreact-dom
بالوحدة النمطية ، ثم الربط الوحدة النمطية للتطبيق:في التطبيق:
1. `cd node_modules/react && npm link` 2. same for `react-dom`
في الوحدة:
1. `npm link react && npm link react-dom` 2. `npm link`
في التطبيق:
1. `npm link [module-name]`
أمل أن هذا يساعد شخصاما
عزيزتي موسى ، لقد ساعدني هذا كثيرًا. لم تفكر حتى في أن المشكلة هي نسخ مختلفة من رد الفعل !! أقوم بإنشاء مكون محليًا لنشره على NPM ولكن لدي مشروع منفصل لاختباره محليًا ، باستخدام رابط npm. من الواضح (الآن) كلاهما يستخدم إصدارات مختلفة من التفاعل. D'oh!
مرحبًا ZVER3D ، حاول قراءة تعليقي السابق. أتمنى أن يساعد!
شكرا لتشير لي في الاتجاه الصحيح. كان الحل الآخر هو إضافة مكتبة ui ، التي تستخدمها في "whiteListedModules". ستكون المشكلة الوحيدة هي أنه سيتعين عليك القيام بذلك لجميع الوحدات التي تتطلب الرد على التجميع.
لذلك ، في package.json كتبت هذا:
"electronWebpack": {
"whiteListedModules": [
"@material-ui/core",
"@material-ui/icons"
]
}
أقوم بتطوير تطبيق React باستخدام نهج monorepo. لدي تطبيق رئيسي ( brush
) ومكون مكتبة تفاعل ( react-gbajs
).
لذلك عندما أحاول عرض مكون react-gbajs
الخاص بي ، لدي هذا الخطأ حول مثيلات متعددة من React. إذا قمت بنسخ الرمز نفسه ولصقه على brush
، فليس لدي أي مشكلة.
لقد اتبعت العديد من الأساليب لإصلاحها ، لكنني لم أحلها (تغيير البناء على Webpack ، مساحة عمل Yarn ، رابط npm ...)
حاولت تصحيح الأخطاء للتحقق مما إذا كان لدي بالفعل نسختان من نظام التشغيل React (باستخدام console.log(window.React1 === window.React2)
من مستند React) ، ولكن تم تقييمه على أنه true
!
(الحل البديل السيئ للغاية الذي أستخدمه الآن هو تمرير الخطافات كدعم: <GBAEmulator useEffect={useEffect} />
... لكنني لا أريد حقًا دمجها)
أي شخص لديه بعض الأفكار لإصلاحها؟
مشروعي مفتوح المصدر وأضيف مكوّن مكتبة التفاعل الجديد هذا في هذا الفرع: https://github.com/macabeus/klo-gba.js/blob/ac18f4d42b122c333622f502947135c2de217ce2/react-gbajs/src/index.js#L251 -ل 274
أهلا بكم،
لدي تطبيق (myApp) يستخدم مكتبة مخصصة (myDepPackage) كتبعية. كلاهما يستخدم webpack كأداة بناء وبالطبع كنت أواجه نفس الخطأ. لم يعمل أي من الحلول المذكورة أعلاه بالنسبة لي. ما فعله ، هو إجبار حزمة الويب على عدم تضمين رد الفعل في الحزمة النهائية للمكتبة المخصصة (myDepPackage). سطر التكوين الوحيد الذي اضطررت لإضافته إلى تهيئة webpack (من myDepPackage) هو أدناه:
externals: {
react: "react",
},
يمكنك معرفة المزيد حول خيار "العناصر الخارجية" هنا: https://webpack.js.org/configuration/externals/#externals
tsevdos Veeeery شكرا لك !!! ❤️
لقد حل مشكلتي التي قلتها في التعليق السابق.
بالنسبة لنا ، كانت المشكلة أن لدينا تطبيق React قابل للتضمين يتم تحميله في الصفحة من رمز قصير في WordPress ويتم تثبيته على div بمعرف عشوائي. في بعض الصفحات ، لدينا العديد من التطبيقات المضمنة وكانت تعمل بشكل جيد حتى بدأنا في استخدام الخطافات.
ستشتكي فقط من الصفحات التي تحتوي على العديد من التطبيقات المضمنة ، لذلك كان الحل هو تحديث الرمز المختصر لـ WP لتحميل البرنامج النصي بالبناء مرة واحدة فقط.
يبدو الأمر بسيطًا وواضحًا ، لكن كان من الصعب معرفة ذلك! خاصة لأنه كان يفعل ذلك ويعمل بشكل جيد حتى أضفنا الخطافات.
ومن المثير للاهتمام ، أنه في بعض الصفحات لدينا تطبيقات أخرى - مختلفة - قمنا بتضمينها والتي تستخدم أيضًا الخطافات ، وتقوم بتحميل النص / الإنشاء الخاص بها باستخدام React أيضًا ، ... ولكن بعد ذلك تعمل بشكل جيد! كانت المشكلة عندما تم تحميل نفس البنية بالضبط أكثر من مرة وهم يستخدمون الخطافات .
كنت أواجه هذه المشكلة مع html-webpack-plugin
وكنت أستخدم index.html
يبدو مثل هذا كإعداد template
إلى HtmlWebpackPlugin
.
// webpack.config.js
plugins: [
new HtmlWebpackPlugin({
template: "./public/index.html"
})
],
<!-- public/index.html -->
<html>
<head>
<title>React App</title>
</head>
<body>
<div id="root"></div>
<script src="main.js"></script>
</body>
</html>
أدركت أن المكون الإضافي كان يضخ <script type="text/javascript" src="main.js"></script>
مباشرة بعد <div id="root"></div>
.
لذلك ، عندما فتحت أداة التطوير ولدت html بدا هكذا.
<html>
<head>
<title>React App</title>
</head>
<body>
<div id="root"></div>
<script src="main.js"></script>
<script type="text/javascript" src="main.js"></script> <!-- injected from html-webpack-plugin -->
</body>
</html>
بالنسبة لي ، كان هذا يتسبب في Invalid Hook Call Warning
.
تمكنت من إزالة التحذير عن طريق إزالة <script src="main.js"></script>
كما هو موضح أدناه.
<!-- public/index.html -->
<html>
<head>
<title>React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
آمل أن يساعد شخصًا ما يبحث عن حل!
اعلم أن المكتبات المعتمدة على React قد تتسبب أيضًا في حدوث هذه المشكلات. في حالتي ، كنت أستخدم إصدارات مختلفة من @emotion/core
و @emotion/styled
.
أهلا،
أحد الحلول الممكنة بدون إخراج هو مزج حل تكوين الاسم المستعار webpack مع مكتبات التخصيص- cra والتفاعل-التطبيقات التي تم إعادة توصيلها. بهذه الطريقة ، يمكنك تجاوز فقط تكوين حزمة الويب الضرورية لحل المشكلة ، عن طريق إنشاء ملف config-overrides.js باستخدام:
const { override, addWebpackAlias } = require('customize-cra');
const path = require('path');
module.exports = override(
addWebpackAlias({
react: path.resolve(path.join(__dirname, './node_modules/react')),
}),
);
واجهت هذه المشكلة على موقع Gatsby ، وقمت بتشغيل تثبيت npm وتحديثه إلى أحدث إصدار من Gatsby وقام بإصلاحه جميعًا
إذا كنت تواجه مشكلة في إجراء اختبار الدعابة تشغيل yarn or npm test
(كما كنت) وكنت تستخدم react-test-renderer
، فتأكد من أن react-test-renderer
يطابق الإصدار نفسه من react
انت تستخدم.
// Package.json
{
...
"react" : "16.8.3",
...
}
قم بتشغيل yarn add [email protected]
لدي lib وتحققت من جميع إصدارات react
و react-dom
في كل من lib والمشاريع الرئيسية. هم بالضبط نفس الشيء لكنهم لم يعملوا.
ومع ذلك ، حل apieceofbart يعمل بالنسبة لي.
apieceofbart ، لقد وفرت يومي <3
ما نجح بالنسبة لي هو مزيج من اقتراحين من سلسلة المحادثات هذه.
تكوين حزمة الويب للتطبيق الرئيسي ( اقتراح apieceofbart )
resolve: { alias: { react: resolve('./node_modules/react') } }
تهيئة حزمة ويب التبعية ( اقتراح tsevdos )
externals: react: 'react' }
نفس الشيء هنا. أحتاج إلى إجراء هذين الإصلاحين لإنجاحه. تفسيري هو أن التكوين الثاني يخبر التبعية لاستخدام رد فعل خارجي بالاسم "رد فعل" ، ويشير التكوين الأول الاسم "رد فعل" إلى مجلد "node_modules / رد فعل" في المستودع الرئيسي. لذلك ، كلاهما ضروري لجعل جسر التفاعل يعمل.
ومع ذلك ، يبدو أن واحدًا منهم يكفي لبعض الناس ، وهو ما لا أفهمه حقًا.
ما نجح بالنسبة لي هو مزيج من اقتراحين من سلسلة المحادثات هذه.
تكوين حزمة الويب للتطبيق الرئيسي ( اقتراح apieceofbart )resolve: { alias: { react: resolve('./node_modules/react') } }
تهيئة حزمة ويب التبعية ( اقتراح tsevdos )
externals: react: 'react' }
نفس الشيء هنا. أحتاج إلى إجراء هذين الإصلاحين لإنجاحه. تفسيري هو أن التكوين الثاني يخبر التبعية لاستخدام رد فعل خارجي بالاسم "رد فعل" ، ويشير التكوين الأول الاسم "رد فعل" إلى مجلد "node_modules / رد فعل" في المستودع الرئيسي. لذلك ، كلاهما ضروري لجعل جسر التفاعل يعمل.
ومع ذلك ، يبدو أن واحدًا منهم يكفي لبعض الناس ، وهو ما لا أفهمه حقًا.
العنصر الثاني مهم!
إذا تم التجاهل ، في عملية الإنشاء ، فسيتم تصدير التفاعل معًا ، لأنه تبعية داخلية
الحب الكبيرapieceofbart !!!! كنت على وشك ركل مكتبي عبر الحائط
لذلك ، لا يوجد حتى الآن حل بديل للخدمات المصغرة. لدي تطبيق جذر مع رد فعل يتطلب ديناميكيًا حزمًا مع تفاعل آخر. لا يمكننا استخدام الإصدار الخارجي من التفاعل فقط لأن هناك الكثير من الفرق المستقلة التي لها تبعياتها الخاصة. إذا دفعناهم لاستخدام نفس الإصدار الخارجي ، فمن الواضح أن معظم المشاريع ستتعطل وسيصبح من المستحيل ترقية هذا الإصدار لأن كل مشروع سيعتمد على هذا الإصدار.
أيه أفكار؟
هل هناك حل لاستخدام خطاطيف التفاعل مع رابط npm ، ولا يتطلب إخراجًا من CRA؟
تضمين التغريدة
يمكنك استخدام craco للكتابة فوق تكوين CRA بدون إخراج.
https://github.com/gsoft-inc/craco
بفضل tsevdos ، قمت بحل مشكلتي وقمت بعمل برنامج تعليمي حول كيفية إنشاء حزمة React: https://youtu.be/esyS87NfBOw
كنت أتلقى هذه المشكلة ولم يتم تطبيق حل webpack لأنني أستخدم أداة تجميع الطرود بدلاً من ذلك. تمكنت من إصلاحه من خلال تحديد اسم مستعار في package.json من تطبيقي الرئيسي الذي يشبه هذا
"alias": {
"react": "./node_modules/react",
"react-dom": "./node_modules/react-dom"
},
مواجهة مشكلات بمحاولة استخدام مكونات React الخاصة بي (مكتوبة بخطافات) في تطبيق إلكتروني في نفس المشروع باستخدام حزمة مختلفة من json. تبدو بنية الملف كما يلي:
- javascript
- src
- ComponentIWantToUse.tsx
- package.json
- electron
- src
- IwantToUseItHere.tsx
- package.json
يتضمن كلا package.json رد فعل و رد فعل دوم في package.json لكنهما من نفس الإصدارات ولا أرى أنهما يظهران عمليتي تثبيت متفاعلين عندما أقوم بـ npm ls react
. أيه أفكار؟
تحرير: نجح حل @ ewan-m!
لذلك واجهت حالة غريبة ، على ما أعتقد. تحتوي مكتبة الطرف الثالث للأسف على مكونات وظيفية ومكونات قائمة على الفصل. مكوناتي في قاعدة الكود الخاصة بي وظيفية. يعمل المكون المستند إلى الفصل من المكتبة كتخطيط يجعل المكون الخاص بي كطفل. أعتقد أن هذا هو ما يتسبب في ظهور "خطأ: اتصال ربط غير صالح". كيف يمكنني التغلب على ذلك لاستخدام الخطافات ، هل أحتاج إلى تحويل مكوني إلى مكون فئة؟
GrandathePanda لمزج الطبقات والمكونات الوظيفية لا يجب أن تهم. إذا كان الفصل يستدعي وظيفة وظيفية ، والتي تستدعي الخطاف ، فلا توجد مشكلة هناك. الشيء الوحيد الذي لا يمكنك فعله هو استدعاء الخطاف مباشرة من الفصل.
حسنًا ، JeremyGrieshop ، فلا يزال لدي بعض التحقيقات التي يجب القيام بها ، إذا قدمت دون استخدام مكون الطرف الثالث ، فسيكون ذلك جيدًا ، لذلك هناك بعض التعارض بين تلك المكتبة والرمز الخاص بي في ذلك الوقت. إذا كان عليّ أن أخمن أنهم يستخدمون إصدار رد فعل مختلف ربما في الحزمة الخاصة بهم.
حسنًا ، JeremyGrieshop ، فلا يزال لدي بعض التحقيقات التي يجب القيام بها ، إذا قدمت دون استخدام مكون الطرف الثالث ، فسيكون ذلك جيدًا ، لذلك هناك بعض التعارض بين تلك المكتبة والرمز الخاص بي في ذلك الوقت. إذا كان عليّ أن أخمن أنهم يستخدمون إصدار رد فعل مختلف ربما في الحزمة الخاصة بهم.
حسنًا ، تحقق من npm ls react react-dom
من تطبيقك لمعرفة ما إذا كانت هناك إصدارات متعددة. من الممكن أن يكون لمكتبة الطرف الثالث تبعية بإصدار معين.
JeremyGrieshop لذلك يبدو أن تطبيقي يستخدم 16.12.0 للتفاعل و dom والطرف الثالث (واجهة مستخدم البحث المرنة) يستخدم 16.8.0 للتفاعل و dom. إذا كنت على صواب ، فالمشكلة هي أنه نظرًا لأن مكتبة الجهة الخارجية 16.8.0 الخاصة بي تعرض المكون الذي تم إنشاؤه باستخدام 16.12.0 ، فهل سيؤدي ذلك إلى حدوث المشكلة؟ وهي أيضًا عبارة عن lerna monorepo والتي من المحتمل أن تزيد من تعقيد هذا الأمر بعد قراءة جميع التعليقات المذكورة أعلاه. نشأت المشكلة من خطاف useStyles الذي تم إنشاؤه في materialui ، فهم يزودون بخاصية withStyles للتوافق مع الإصدارات السابقة وأعتقد في هذه الأثناء أنني سأذهب إلى هذا الطريق. تبدو جميع التغييرات التي تم إجراؤها على webpack و / أو حزمة json المذكورة أعلاه حقًا وكأنها عصابة قابلة للكسر أكثر من مجرد الذهاب مع مخصص كلاسيكي في هذه الأثناء بينما تكتشف الخطافات كيفية النضج في مواجهة العديد من مراوغات التنفيذ المختلفة.
GrandathePanda IMHO ، خياراتك هي (1) حث الطرف الثالث إما على تحديث تبعية التفاعل إلى 16.12 ، أو جعلهم يقررون ما إذا كان الاعتماد على الأقران أكثر ملاءمة من التبعية ؛ (2) استخدم 16.8 في تطبيقك حتى يشتركوا في نفس إصدارات lib ؛ (3) حذف نسختهم من رد فعل مع:
rimraf node_modules/search-ui/node_modules/react && rimraf node_modules/search-ui/node_modules/react-dom
يمكن وضع الأمر أعلاه في "الإنشاء المسبق" و "الإعداد المسبق" ضمن جزء "البرامج النصية" من الحزمة. json (وهو ما أفعله حاليًا). الجانب السلبي لـ (3) ، على ما أعتقد ، هو إذا تستخدم أي شيء تم إيقاف العمل به بين 16.8 و 16.12.
أهلا بكم،
لدي تطبيق (myApp) يستخدم مكتبة مخصصة (myDepPackage) كتبعية. كلاهما يستخدم webpack كأداة بناء وبالطبع كنت أواجه نفس الخطأ. لم يعمل أي من الحلول المذكورة أعلاه بالنسبة لي. ما فعله ، هو إجبار حزمة الويب على عدم تضمين رد الفعل في الحزمة النهائية للمكتبة المخصصة (myDepPackage). سطر التكوين الوحيد الذي اضطررت لإضافته إلى تهيئة webpack (من myDepPackage) هو أدناه:
externals: { react: "react", },
يمكنك معرفة المزيد حول خيار "العناصر الخارجية" هنا: https://webpack.js.org/configuration/externals/#externals
tsevdos أحبك. لقد وضعت حدًا لبعض الأيام من المتاعب الشديدة. شكرا لك.
مرحبا جميعا،
أحاول استخدام رابط في أحد المكونات ، سيتم تصدير هذا المكون من gatsby-browser.js .
ما هو السلوك الحالي؟
سأتعامل مع هذا الخطأ:
رفض غير معالج (خطأ): استدعاء ربط غير صالح. لا يمكن استدعاء الخطافات إلا داخل جسم مكون الوظيفة. قد يحدث هذا لأحد الأسباب التالية:
- قد يكون لديك إصدارات غير متطابقة من React والعارض (مثل React DOM)
- ربما تكون قد انتهكت قواعد الخطافات
- قد يكون لديك أكثر من نسخة واحدة من React في نفس التطبيق
راجع https://fb.me/react-invalid-hook-call للحصول على نصائح حول كيفية تصحيح هذه المشكلة وحلها.
هذا نموذج للتعليمة البرمجية:
import React from 'react';
import PropTypes from 'prop-types';
import { Provider } from 'react-redux';
import configureStore from './src/utils/configure-store';
import { useApiResources } from './src/hooks/use-api-resources';
const RootWrapper = ({ element }) => {
const resources = useApiResources();
const store = configureStore();
return <Provider store={store}>{element}</Provider>;
};
RootWrapper.propTypes = {
element: PropTypes.node.isRequired,
};
export default RootWrapper;
ما هو السلوك المتوقع؟
يجب تشغيل الخطاف بدون أخطاء ، أو يجب توفير رسائل خطأ مفيدة.
إصدارات التفاعلات وتفاعلات دوم هي 16.12.0
@ leejh3224 شكرا جزيلا يا صاح! بعد ساعات من البحث وجدت هذه الإجابة ، لقد حلت مشكلتي.
فقط غيرت تهيئة HtmlWebpackPlugin من
inject: true
to inject: 'head'
واختفت أخطاء التفاعل المصغرة.
لقد قمت بإنشاء سؤال stackoverflow مع تجربتي في محاولة جعل هذا يعمل. هل من الممكن ، لأولئك الذين تمكنوا من جعل هذا يعمل ، إلقاء نظرة عليه وتقديم بعض النصائح؟
أنا أنقل تطبيق jquery إلى React. لديّ أداة لفضح مكونات React داخل jQuery تسمى asJqueryPlugin
. ها هو الملف:
import React from 'react'
import ReactDOM from 'react-dom'
/**
* A way to render React components with props easily with jQuery
*
* ## Register the React Component
*
* In your React Component file, register the component with jQuery using `asJqueryPlugin`
* ```
* const Greeting = ({ person }) => <div>Hello {person}</div>
* asJqueryPlugin('Greeting', Greeting, { person: "Bob" })
* ```
*
* ## Rendering, Selecting and Updating Props with jQuery
*
* Select an element and render using the `react` function
* ```
* $('#greeting').react('Greeting', { person: 'Frank' })
* ```
*/
window.reactRegistry = window.reactRegistry || {}
// This is how React components register themselves as available within jQuery
export default function asJqueryPlugin(componentName, Component) {
window.reactRegistry[componentName] = { Component }
}
if (typeof window.$ !== 'undefined') {
;(function($) {
// Add the plugin function jQuery
$.fn.react = function renderReactIntoElements(componentName, props) {
this.each(function render() {
const entry = window.reactRegistry[componentName || $(this).data('react')]
if (!entry) throw Error(`${componentName} component is not registered.`)
ReactDOM.render(<entry.Component {...props} />, this)
})
return this
}
})(window.$)
}
يحتوي التطبيق على العديد من نقاط الدخول في Webpack ، ويستخدم حوالي 3-4 مكونات هذه التقنية الآن. عندما يتم تجميع المكونات في حزم مختلفة لنقاط الإدخال ، أعتقد أن هذا هو الوقت الذي تحدث فيه المشكلة.
لذلك إذا كان لدي نقطتا إدخال في Webpack:
entry: {
foo: './assets/js/foo',
bar: './assets/js/bar'
}
ثم في كل ملف من هذه الملفات ، قمنا بإعداد مكون مكشوف (كل منها يستخدم الخطافات):
// foo.js
import React from 'react'
import asJqueryPlugin from '../utils/asJqueryPlugin'
const Foo = () => {
const ref = useRef()
return <div ref={ref}>Foo</div>
}
asJqueryPlugin('Foo', Foo)
// bar.js
... same stuff but with Bar component
الآن إذا قمت بتضمين كلا الإدخالين في نفس الصفحة ، وحاولت عرض كلا المكونين عبر المكون الإضافي jquery ...
<script src="/bundles/foo.js" />
<script src="/bundles/bar.js" />
<script>
$('#foo-container').react('Foo')
$('#bar-container').react('Bar')
</script>
... حصلت على هذا الخطاف الخطأ.
لست متأكدًا مما إذا كان هذا يساعد المحادثة أم لا ، ولكن على الأقل يُظهر حالة استخدام لكيفية قيام مطور عاقل (بشكل مشكوك فيه) بوضع نفسه في موقف به حالات رد فعل متعددة.
ساعدني ذلك - https://github.com/facebook/react/issues/13991#issuecomment -554928373
ولكن كان علي أيضًا إزالة react
و react-dom
من التبعيات ونقلها إلى تبعيات النظير وإلغاء تثبيت وحدات العقدة وإعادة تثبيتها.
أهلا،
قرأت المحادثة والعديد من المنشورات على الويب وما زلت عالقًا مع الخطأ عدة مرات من رد الفعل.
أدفع هذا الريبو لإعادة إنتاج الخطأ: https://github.com/jeromelegrand/dooliz-lib
أتمنى أن يساعدني أحد.
شكرا.
أنا أواجه هذه المشكلة ولا أذهب إلى أي مكان بالحلول أعلاه.
باختصار: أنا متأكد من أن لديّ إصدار رد فعل واحد فقط قيد التشغيل ، وأحصل على الخطأ باستخدام رد فعل التمهيد ، والذي ربما لا يستخدم الخطافات بشكل خاطئ ، لأنه لا يوجد أي شخص آخر لديه مشكلات.
يحدث هذا الخطأ على الواجهة الخلفية لـ node.js بالنسبة لي.
__ماذا راجعته حول إصدارات التفاعل__
لدي إعداد خيط مع مساحات عمل ، yarn list react
أو yarn list react-dom
يظهر فقط مثيل واحد.
لقد طبعت تتطلب ذاكرة تخزين مؤقت لمعرفة ما تم استيراده:
for(var key in require.cache) {
if(key.indexOf("react") !== -1 && key.indexOf("index") !== -1) {
console.log(key);
}
}
أنا أقوم بتشغيله قبل أن أقوم بتمزيق شيء من رد فعل bootstrap ، والذي يسبب لي خطأ الخطاف غير الصالح ، ويسجل:
C:\web\resourceful\daCore\node_modules\react-dom\index.js
C:\web\resourceful\daCore\node_modules\react\index.js
C:\web\resourceful\daCore\node_modules\react-router-dom\index.js
C:\web\resourceful\daCore\node_modules\react-router-dom\node_modules\react-router\index.js
C:\web\resourceful\daCore\node_modules\react-is\index.js
C:\web\resourceful\daCore\node_modules\mini-create-react-context\dist\cjs\index.js
C:\web\resourceful\daCore\node_modules\react-router\index.js
C:\web\resourceful\daCore\node_modules\@fortawesome\react-fontawesome\index.js
C:\web\resourceful\daCore\node_modules\@tinymce\tinymce-react\lib\cjs\main\ts\index.js
والذي يبدو أنه يؤكد أنه تم تحميل إصدار رد فعل واحد فقط.
أخيرًا أضفت هذا إلى node_modules / رد فعل dom / index.js
console.log("React DOM daCore");
global['React1'] = require('react');
وهذا إلى node_modules / رد فعل جهاز التوجيه dom / cjs / Form.js
require('react-dom');
global['React2'] = require('react');
console.log('#TEST '+(global['React1'] === global['React2']? 'SAME' : 'NOT SAME'));
الذي يطبع SAME
أي فكرة ماذا يمكن أن يكون هذا؟
سأقوم أيضًا بنشر هذا على ريبو ريبو-بوتستراب.
لذلك أنا متأكد من أن وجود حالتين من React ليس هو المشكلة هنا. أعتقد أن المشكلة هي عندما يكون هناك رد فعل اثنين _roots_. هل تتصل بـ ReactDOM.render()
عدة مرات في أجزاء مختلفة من الصفحة؟ إذا كان الأمر كذلك ، أعتقد أن هذا يمكن أن يسبب المشكلة. أعتقد أن الخطافات "تنتمي" إلى "جذر" معين وتتعطل عندما يكون هناك العديد منها وتشترك الحزمتان في بعض التعليمات البرمجية المشتركة. أنا أخمن هنا ...
... أعتقد أن المشكلة هي عندما يكون هناك رد فعل اثنين _roots_. هل تتصل بـ
ReactDOM.render()
عدة مرات في أجزاء مختلفة من الصفحة؟
شكرًا لك timkindberg ، لقد ساعدني هذا في حلها نهائيًا. أدركت أنني أستخدم أداة رد فعل الشجرة للقيام بعملية تصيير أولية وجلب البيانات المطلوبة قبل إجراء التصيير النهائي باستخدام ReactDOMServer.renderToString
أدت إزالة استخدام هذه الحزمة بسرعة إلى إزالة الخطأ ، ولدي الآن نفس الشيء الذي أعمل به مع رد فعل-ssr-prepass ، والذي يوصى به الآن في صفحة رد الفعل-شجرة-ووكر التمهيدي
لذلك كان بالفعل مكالمتين ReactDOM.render
! في الوقت الحالي ، يعمل هذا الإعداد مع رد فعل-ssr-prepass بالنسبة لي ، وعندما يهبط التشويق في رد فعل دوم / خادم يمكنني التبديل إلى ذلك
أنا أستخدم react-compare-image
https://github.com/junkboy0315/react-compare-image
في مشروع Gutenberg الخاص بي ولكن لدي هذه المشكلة الغريبة على الرغم من أن كل شيء يعمل كلما قمت بإزالة مكون ReactCompareImage
من وظيفة الحفظ. تعمل وظيفة التحرير بشكل مثالي ولكن الحفظ لا يعمل.
لقد قمت بالاطلاع على https://reactjs.org/warnings/invalid-hook-call-warning.html ولا أعتقد ، لدي أي من هذه المشكلات.
هنا هو ملف وظيفة الحفظ الكامل:
`` استيراد المفتش من "./inspector" ؛
استيراد {جزء} من "رد فعل" ؛
استيراد ReactCompareImage من "رد فعل مقارنة صورة" ؛
/ **
حفظ const = ({className ، السمات}) => {
const {
paddingTop,
paddingRight,
paddingBottom,
paddingLeft,
marginTop,
marginRight,
marginBottom,
marginLeft,
border,
borderColor,
borderType,
background,
backgroundImage,
gradient,
dividerColor,
buttonColor,
direction,
beforeImage,
beforeLabel,
afterImage,
afterLabel,
} = attributes;
const style = {
"padding": `${paddingTop}px ${paddingRight}px ${paddingBottom}px ${paddingLeft}px`,
"margin": `${marginTop}px ${marginRight}px ${marginBottom}px ${marginLeft}px`,
"border": `${border}px ${borderType} ${borderColor}`,
"background": background
};
return(
<Fragment>
<ReactCompareImage
leftImage={beforeImage.url}
leftImageLabel={beforeLabel}
rightImage={afterImage.url}
rightImageLabel={afterLabel}
vertical={'vertical' === direction}
sliderLineColor={dividerColor}
/>
</Fragment>
);
} ؛
تصدير حفظ افتراضي ؛
""
أنا أيضا أواجه هذه المشكلة. لدي ملخص منشور على SO: https://stackoverflow.com/questions/60331304/next-js-with-typescript-invalid-hook-call-hooks-can-only-be-called-inside-of-t
لدي أيضًا مثال بسيط قابل للتكرار: https://github.com/coler-j/shopify_playground
تطبيق My Main هو تطبيق create-react
(لم يتم إخراجه) كان يستورد مكتبة مشتركة تستخدم React أيضًا. تمكنت من حل هذا من خلال:
استخدام Rollup لحزم المكتبة بدلاً من webpack
لسبب ما لم أعمل بعد ، لم يؤد استخدام العوامل الخارجية إلى إزالة React من حزمة المكتبة.
Rollup-config.js
export default [
{
input: 'src/index.js',
output: {
file: pkg.main,
format: 'cjs',
sourcemap: true,
},
plugins: [external(), babel(), resolve(), commonjs(), svgr()],
},
{
input: 'src/index.js',
output: {
file: pkg.module,
format: 'es',
sourcemap: true,
},
plugins: [
alias({
entries: [{ find: '<strong i="12">@components</strong>', replacement: 'src/components' }],
}),
external(),
babel(),
svgr(),
],
},
]
تثبيت craco واستخدامه لتعديل حزمة الويب للتطبيق الرئيسي
craco.config.js
const path = require('path')
module.exports = {
webpack: {
alias: {
react: path.resolve(__dirname, './node_modules/react'),
},
},
}
بفضل arminyahya لتوجيهي إلى craco.
أحاول استخدام الخطافات أثناء تحميل رد فعل من cdn. يعطي هذا المثال (هذا هو صفحة html بأكملها) الخطأ Hooks can only be called inside of the body of a function component
عند استدعاء Example()
. لقد أزلت كل شيء ، حتى ReactDOM ، لذلك من الصعب أن أتخيل أنه يمكنني الحصول على نسخ متعددة من React. هل هذا مستحيل؟
<!DOCTYPE html>
<html>
<head>
<script crossorigin src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
</body>
<script type="text/babel">
function Example() {
let [count, setCount] = React.useState(0);
return ( <h1>Hello</h1> );
};
Example();
</script>
</body>
</html>
samkamin هذا لأن لديك جذور صفرية تتفاعل. تحتاج إلى تقديم طلبك. ومع ذلك ، لا يزال هذا تأكيدًا جيدًا على أن الخطافات تعتمد على (وتقترن) بجذر رد الفعل.
<html>
<head>
<script crossorigin src="https://unpkg.com/[email protected]/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/[email protected]/umd/react-dom.development.js"></script>
<script crossorigin src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
</body>
<div id="root"></div>
<script type="text/babel">
function Example() {
let [count, setCount] = React.useState(0);
return ( <h1>Hello</h1> );
};
ReactDOM.render(<Example />, document.getElementById('root'))
</script>
</body>
</html>
شكرا لك! لم يكن هذا في الواقع عدم وجود جذر رد فعل - لقد قمت بإزالة ذلك أثناء تبسيط الخطأ قدر الإمكان - ولكن هناك شيء غبي بنفس القدر: بدلاً من <Example />
، كنت أكتب Example()
. ليس الشيء نفسه على الإطلاق. شكرا لك مرة أخرى.
لا شيء يبدو أنه يعمل بالنسبة لي. أقوم بإنشاء مكون للمشاركة والاستخدام في مشاريع أخرى ، ولكن عند الاختبار محليًا من مشروع آخر لا يعمل. أنا أستخدم الخطافات ذات التفاعل 16.13.0.
webpack.config.js
module.exports = {
entry: ENTRY,
output: {
library: LIBRARY_NAME,
path: path.resolve(__dirname, OUTPUT_DIR),
filename: OUTPUT_FILENAME,
libraryTarget: 'commonjs2',
},
module: {
rules: [
{
test: /\.(js|tsx)$/,
exclude: /node_modules/,
loader: 'babel-loader',
},
{
test: /\.tsx?$/,
exclude: /node_modules/,
use: 'ts-loader',
},
],
},
resolve: {
alias: {
'<strong i="7">@src</strong>': path.resolve(__dirname, './src'),
'<strong i="8">@components</strong>': path.resolve(__dirname, './src/components'),
'<strong i="9">@core</strong>': path.resolve(__dirname, './src/core'),
react: path.resolve(__dirname, './node_modules/react'),
'react-dom': path.resolve(__dirname, './node_modules/react-dom'),
},
extensions: ['.js', '.json', '.tsx', '.ts'],
},
externals: {
react: 'react',
},
target: 'node',
plugins: [
new HtmlWebPackPlugin({
template: './tests/index.html',
filename: 'index.html',
}),
]}
أي اقتراحات؟ اختبرت كل اقتراحات المناقشات القديمة.
شكرا! :ابتسامة:
لقد أعلنت Settings.js على النحو التالي:
import React, {useState} from 'react';
import {
View,
Text,
Switch
} from 'react-native';
export function Settings(props) {
const [rememberPin, setRememberPin] = useState(false);
let {changeView, header} = props;
const toggleRememberPin = (value) => {
setRememberPin(value);
};
return (
<View>
<Text>Remember PIN:</Text>
<Switch
onValueChange={toggleRememberPin}
value={rememberPin}
ios_backgroundColor="#aeaeae"
/>
</View>
);
}
export default {Settings};
أقوم باستيراده واستخدامه في App.js على النحو التالي:
import React, {Component} from 'react';
import {
SafeAreaView,
StyleSheet,
View,
Text,
TouchableOpacity,
Dimensions,
ScrollView,
Switch
} from 'react-native';
import Colors from './src/assets/Colors';
import {Settings} from './src/components/Settings';
...
export default class App extends Component {
constructor(props) {
super(props);
this.state = {viewsStack: this.viewsStack};
}
viewsStack = {
SplashScreen: false,
BindingInstructions: false,
PinPad: false,
Qr: false,
Dashboard: false,
Authorizations: false,
Settings: true,
Browsers: false,
TransmitSDK: false,
OTP: false,
};
changeView = (newView) => {
let {viewsStack} = this.state;
for (let key of Object.keys(viewsStack)) {
viewsStack[key] = false;
}
viewsStack[newView] = true;
this.setState(viewsStack);
};
render() {
let {viewsStack} = this.state;
return (
<SafeAreaView style={styles.safeAreaView}>
{viewsStack.SplashScreen && (splashScreen())}
{viewsStack.BindingInstructions && (bindingInstructions({changeView: this.changeView}))}
{viewsStack.PinPad && (pinPad({message: 'Inserisci un nuovo PIN', changeView: this.changeView}))}
{viewsStack.Qr && (qr({header: 'QR Binding', message: 'Scansiona il QR dalla tua dashboard\noppure\ninserisci il codice manualmente.', changeView: this.changeView}))}
{viewsStack.Dashboard && (dashboard({header: 'Profilo Utente', changeView: this.changeView}))}
{viewsStack.Authorizations && (authorizations({header: 'Autorizzazioni', authorizations: [1, 2, 3, 4, 5, 6], changeView: this.changeView}))}
{viewsStack.Settings && (Settings({header: 'Impostazioni', changeView: this.changeView}))}
</SafeAreaView>
);
}
};
...
لكني أحصل على:
انا استخدم:
"react": "16.9.0",
"react-native": "0.61.5"
ماذا دهاك؟
أنت تستدعي المكون Settings
كدالة وليس كمكون دالة.
<Settings header='Impostazioni' changeView={this.changeView} />
لا يُسمح بالخطافات داخل الدوال العادية ، فقط في مكونات الوظيفة والطريقة التي تسميها تخدع رد الفعل على التفكير في أن المكون الخاص بك هو في الواقع وظيفة عادية.
ربما يؤدي هذا إلى تجنيب شخص ما الصداع ، إذا كنت تستخدم رد فعل جهاز التوجيه دوم إذا قمت بتمرير المكون الخاص بك في عرض مثل هذا (ليس بالطريقة الصحيحة) فسوف يمنحك Invalid Hook Call Warning
<Route path="/:cuid/:title" render={PostArticle} />
استغرقت نصف ساعة لأعرف أين أخطأت
قد يساعد هذا شخصًا ما - إذا كنت تواجه هذا الخطأ بعد استخدام جهاز التوجيه التفاعلي دوم ، فتحقق من كيفية تحديد مساراتك. على سبيل المثال ، يجب أن يكون <Route path={'/upgrade/:plan'} exact children={<Upgrade />} />
بينما كنت أفعل <Route path={'/upgrade/:plan'} exact children={Upgrade} />
يستخدم فريقي Yarn وكان يحصل على الخطأ Invalid hook call
فقط في الاختبارات ، وليس في التطبيق. كانت المشكلة أن react-test-renderer
كان يتحول إلى إصدار أقل من إصدار react
و react-dom
، لذلك أضفنا resolutions
في package.json
:
"devDependencies": {
...
"react": "16.12.0",
"react-dom": "16.12.0",
...
},
"resolutions": {
"react-test-renderer": "16.12.0"
}
بالنسبة للأشخاص الذين يستخدمون Gatsby في ملف فرعي ، فهذا حل ممكن.
gatsby-node.js
:
const path = require('path')
const fromRoot = name => path.resolve(__dirname + '/../node_modules/' + name)
exports.onCreateWebpackConfig = ({ actions }) => actions.setWebpackConfig({
resolve: {
alias: {
'react': fromRoot('react'),
'react-dom': fromRoot('react-dom'),
},
},
})
لدي نفس المشكلة عند تنفيذ الأمر npm link
هناك مشكلة
ثم استخدمت الحل الرسمي المقدم من خلال رد الفعل لحل هذه المشكلة
يمكن أن تظهر هذه المشكلة أيضًا عند استخدام رابط npm أو ما يعادله. في هذه الحالة ، قد "يرى" المجمع الخاص بك تفاعلين - أحدهما في مجلد التطبيق والآخر في مجلد مكتبتك. بافتراض أن myapp و mylib هما مجلدان شقيقان ، فإن أحد الحلول الممكنة هو تشغيل رابط npm ../myapp/node_modules/react من mylib. هذا يجب أن يجعل المكتبة تستخدم نسخة React الخاصة بالتطبيق.
إذا احتاج أ إلى تقديم ب ، أ ، ب فأخوة
npm link ./../A/node_modules/react
npm link
npm link B
إنه يعمل بالنسبة لي
حتى مع هذه الإجابات ، لست متأكدًا من سبب تلقيي الخطأ. لدي مكتبة التبعية الخاصة بي مرتبطة بتطبيقي الرئيسي وبعد أن تلقيت الخطأ ، اتبعت مستندات رد الفعل وربطت نسخة مكتبة التبعية الخاصة بي من رد فعل تطبيقي (تشغيل npm link <>/webapp/node_modules/react
. (حتى فعلت ذلك مع رد فعل- dom). عندما قمت بتسجيل الدخول لاختبار ما إذا كان React1 و React2 متماثلان ، فقد قام بتسجيل true
لذلك لم أكن أستخدم إصدارات مكررة من React ، كنت أستخدم نفس إصدارات React ، وكنت أستخدم مكونات دالة . لذلك على الرغم من أن تسجيل الاختبار يشير إلى أنه ليس لدي نسخة مكررة من React إلا أنني ما زلت أتلقى خطأ ربط.
لكن تجربة هذا الحل كما هو مذكور أعلاه أصلح هذا الخطأ المعين:
alias: {
react: path.resolve('./node_modules/react')
}
لذلك أنا في حيرة.
لذلك أنا في حيرة.
orpheus هل تقدم أكثر من جذر واحد متفاعل في نفس الصفحة؟ الملقب هل لديك أكثر من مكالمة واحدة ReactDOM.render
في نفس الصفحة؟
هل تقدم أكثر من جذر واحد متفاعل في نفس الصفحة؟ الملقب هل لديك أكثر من مكالمة واحدة
ReactDOM.render
في نفس الصفحة؟
تضمين التغريدة
انا لست. لدي ReactDOM.render
في جذر app
، lib
التي أقوم بربطها هي مكتبة مكونة ولا تستخدم ReactDOM.render
على الاطلاق.
تحرير: أفعل شيئًا مشابهًا لـ:
import React from 'react'
import ReactDOM from 'react-dom'
import Root from './App/Root'
ReactDOM.render(
<Root />,
document.getElementById('root')
)
حيث يعرض <Root />
شيئًا مثل
const Root = () => {
return <Provider store={store}>
<PermissionsProvider>
<Suspense fallback={null}>
<Router history={history}>
<Routes store={store} />
</Router>
</Suspense>
</PermissionsProvider>
</Provider>
}
PermissionsProvider
هو مكون React الذي أقوم باستيراده من الوحدة النمطية lib
المرتبطة الخاصة بي والتي تستخدم خطافًا يتسبب في فشل التطبيق. إنه يخلق الحالة والسياق ويجعلها أطفالًا.
مرحبًا ، أنا أستخدم الإلكترون مع خطافات التفاعل. إذا قمت بكتابة الخطاف الخاص بي ، فسيكون ذلك ناجحًا. ولكنه يحدث خطأ عندما أستخدم خطافات من حزمة أخرى في node_module ، مثل react-use
، swr
.
لا بد لي من نسخ الحزمة إلى ملفي المحلي.
هل يواجه أي شخص هذه المشكلة؟
مشروع مثال هنا:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error
الكود الأساسي:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsx
ما زلت أواجه هذه المشكلة أيضًا حتى بعد إزالة النسخ المكررة من رد فعل ورد الفعل. لقد أنشأت مشروع اختبار بسيط للغاية لإعادة الإنتاج.
$ tree -I node_modules
.
|-- test-app
| |-- dist
| | |-- index.html
| | `-- main.js
| |-- package-lock.json
| |-- package.json
| |-- src
| | |-- index.html
| | `-- index.js
| `-- webpack.config.js
`-- test-lib
|-- dist
| `-- main.js
|-- package-lock.json
|-- package.json
|-- src
| `-- index.js
`-- webpack.config.js
حاليًا ، أنا أستخدم طريقة الاسم المستعار webpack ، لكنني أيضًا جربت طريقة npm link
، ولم يعمل أي منهما.
لقد جئت عبر هذه القضية أيضا. أنا أستخدم ExpressJS + Pug لتقديم العروض ، ثم قمت بكتابة عارض (مشابه لـ ReactRails) يتيح لك عرض المكونات من جانب الخادم والعميل.
حاولت استخراج هذا إلى حزمة منفصلة حيث كانت تتسبب في الفوضى ، وواجهت هذه المشكلة.
لإصلاحه ، اضطررت إلى الإضافة تحت المفتاح resolve
:
alias: {
react: path.resolve("./node_modules/react"),
},
يعمل الآن كما هو متوقع عند تشغيل حزمة الويب بشكل طبيعي ، ولكن المشكلة لا تزال قائمة مع وحدة تخزين عامل الإرساء. أنا جديد جدًا على عامل الرصيف للتعامل معه ، لذا سأعيد زيارته لاحقًا.
تحرير: لقد تحدثت في وقت مبكر جدا. إنه يعمل بشكل جيد الآن مع تصيير React ، لكن ليس مع الهيدرات.
مرحبًا ، أنا أستخدم الإلكترون مع خطافات التفاعل. إذا قمت بكتابة الخطاف الخاص بي ، فسيكون ذلك ناجحًا. ولكنه يحدث خطأ عندما أستخدم خطافات من حزمة أخرى في node_module ، مثل
react-use
،swr
.لا بد لي من نسخ الحزمة إلى ملفي المحلي.
هل يواجه أي شخص هذه المشكلة؟
مشروع مثال هنا:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-errorالكود الأساسي:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsx
أهلا. كان لي نفس القضية. أنا أستخدم حزم الويب الإلكترونية التي تحدد جميع الوحدات على أنها عناصر خارجية لـ webpack. مع بعض الاستثناءات المشفرة - مثل رد فعل ورد فعل دوم.
بالنسبة لي ، كان هذا يعني أن رد الفعل الذي تم تحميله من الكود الخاص بي كان مختلفًا عن رد الفعل الذي تم تحميله من هذه الوحدة.
يبدو أن إضافة هذه الوحدات إلى القائمة البيضاء تساعد (لست متأكدًا مما إذا لم يكسر أي شيء آخر بعد :)
huhle شكرا ، إنه يعمل! ربما يجب علينا الغوص في حزم الويب الإلكترونية.
لقد تمكنت للتو من الحصول على هذا العمل بنفسي. أعتقد أنه أحد أفضل الحلول عندما يتعلق الأمر بمساحات عمل Lerna and Yarn ، وربما يمكن استخدام بعض القطع لحل آخر.
يبدو أن كل شيء يتلخص في تكوين المشروع package.json
الذي أقوم باستيراده. كنت بحاجة إلى تضمين هذه الأقسام:
"peerDependencies": {
"react": "^16.13.1",
"react-dom": "^16.13.1"
},
"workspaces": {
"nohoist": [
"react", "react-dom"
]
}
بعد القيام بذلك ، اضطررت إلى إعادة بناء المشاريع وكنت جاهزًا للعمل. يبدو أن إدراجها على أنها تبعيات للأقران يتيح لها أن يتم تثبيتها بواسطة مشروعك المستهلك. ولأنها غير مدرجة في التبعيات ، فلا ينبغي أن تكون متاحة للحزمة التي تحاول استيرادها ، ولكن لسبب ما ما لم تخبرها بعدم الرفع ، فإنها تظل متاحة ويشق مثيل رد فعل جديد طريقه و يسبب الخطأ.
حظ سعيد!
أحاول استخدام رد الفعل الزنبركي للحصول على تأثير التلاشي البسيط. لا يبدو ان شيء يعمل.
`استيراد React ، {useState ، useEffect} من 'رد فعل' ؛
استيراد {animated، useTransition} من 'رد فعل الربيع'؛
const TextContent = (props) => {
const [items] = useState([
{ id: '0', title: 'Text1' },
{ id: '1', title: 'Text2' },
{ id: '2', title: 'Text1' }
])
const [index, setIndex] = useState(0);
const transitions = useTransition(items[index], index => index.id,
{
from: { opacity: 0 },
enter: { opacity: 1 },
leave: { opacity: 0 },
config: { tension: 220, friction: 120 }
}
)
useEffect(() => {
const interval = setInterval(() => {
setIndex((state) => (state + 1) % items.length);
}, 4000)
return () => clearInterval(interval);
}, []);
return (
<div>
{
transitions.map(({ item, props, key }) => (
<animated.div
key={key}
style={{ ...props, position: 'absolute' }}
>
<p>{item.title}</p>
</animated.div>
))
}
</div>
)
}
تصدير محتوى النص الافتراضي ؛
حاولت التحقق مما إذا كانت لدي حالات متعددة من React. أخبرني Npm ls-ing أن لدي نسخة واحدة فقط من رد الفعل ورد الفعل ، وكلاهما عند 16.13.1.
مرحبًا ، أنا أستخدم الإلكترون مع خطافات التفاعل. إذا قمت بكتابة الخطاف الخاص بي ، فسيكون ذلك ناجحًا. ولكنه يحدث خطأ عندما أستخدم خطافات من حزمة أخرى في node_module ، مثل
react-use
،swr
.
لا بد لي من نسخ الحزمة إلى ملفي المحلي.
هل يواجه أي شخص هذه المشكلة؟
مشروع مثال هنا:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error
الكود الأساسي:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsxأهلا. كان لي نفس القضية. أنا أستخدم حزم الويب الإلكترونية التي تحدد جميع الوحدات على أنها عناصر خارجية لـ webpack. مع بعض الاستثناءات المشفرة - مثل رد فعل ورد فعل دوم.
بالنسبة لي ، كان هذا يعني أن رد الفعل الذي تم تحميله من الكود الخاص بي كان مختلفًا عن رد الفعل الذي تم تحميله من هذه الوحدة.
يبدو أن إضافة هذه الوحدات إلى القائمة البيضاء تساعد (لست متأكدًا مما إذا لم يكسر أي شيء آخر بعد :)
متألق! شكرا لك
أحاول استخدام رد الفعل الزنبركي للحصول على تأثير التلاشي البسيط. لا يبدو ان شيء يعمل.
`استيراد React ، {useState ، useEffect} من 'رد فعل' ؛
استيراد {animated، useTransition} من 'رد فعل الربيع'؛const TextContent = (props) => {
const [items] = useState([ { id: '0', title: 'Text1' }, { id: '1', title: 'Text2' }, { id: '2', title: 'Text1' } ]) const [index, setIndex] = useState(0); const transitions = useTransition(items[index], index => index.id, { from: { opacity: 0 }, enter: { opacity: 1 }, leave: { opacity: 0 }, config: { tension: 220, friction: 120 } } ) useEffect(() => { const interval = setInterval(() => { setIndex((state) => (state + 1) % items.length); }, 4000) return () => clearInterval(interval); }, []); return ( <div> { transitions.map(({ item, props, key }) => ( <animated.div key={key} style={{ ...props, position: 'absolute' }} > <p>{item.title}</p> </animated.div> )) } </div> )
}
تصدير محتوى النص الافتراضي ؛
حاولت التحقق مما إذا كانت لدي حالات متعددة من React. أخبرني Npm ls-ing أن لدي نسخة واحدة فقط من رد الفعل ورد الفعل ، وكلاهما عند 16.13.1.
نفس الشيء هنا. رد فعل و رد فعل دوم في 16.13.1 بالنسبة لي ، ومحاولة استخدام رد الفعل الربيع يجلب نفس الخطأ.
من موضوع آخر في styled-components
، علمت أنه إذا كنت تستخدم حزمة محلية خاصة بك من خلال file:
URI في package.json
، فأنت بحاجة إلى rm -rf node_modules/local-package-name/node_modules
قبل تشغيل تطبيقك ، لأنه على ما يبدو ، يتم نسخ الحزم المحلية دون التحقق node_modules
للاعتماديات الزائدة عن الحاجة.
من موضوع آخر في
styled-components
، علمت أنه إذا كنت تستخدم حزمة محلية خاصة بك من خلالfile:
URI فيpackage.json
، فأنت بحاجة إلىrm -rf node_modules/local-package-name/node_modules
قبل تشغيل تطبيقك ، لأنه على ما يبدو ، يتم نسخ الحزم المحلية دون التحققnode_modules
للاعتماديات الزائدة عن الحاجة.
نعم ، هذه هي نفس المشكلة لما يقرب من اثنتي عشرة حالة استخدام في هذا الموضوع فقط. أضفت هدفًا "preebuild" و "prebuild" للقيام بـ rm -rf (باستخدام rimraf). استخدم مستخدم آخر في هذا الموضوع npm-link-shared في ما قبل التشغيل للحصول على الوحدات النمطية لمشاركة نفس مثيل التفاعل. الكثير منا منا مستخدمي monorepo يواجهون هذا.
مرحبًا ، أنا أستخدم الإلكترون مع خطافات التفاعل. إذا قمت بكتابة الخطاف الخاص بي ، فسيكون ذلك ناجحًا. ولكنه يحدث خطأ عندما أستخدم خطافات من حزمة أخرى في node_module ، مثل
react-use
،swr
.
لا بد لي من نسخ الحزمة إلى ملفي المحلي.
هل يواجه أي شخص هذه المشكلة؟
مشروع مثال هنا:
https://github.com/Zaynex/electron-react-ts-kit/tree/hooks-error
الكود الأساسي:
https://github.com/Zaynex/electron-react-ts-kit/blob/hooks-error/src/renderer/app.tsxأهلا. كان لي نفس القضية. أنا أستخدم حزم الويب الإلكترونية التي تحدد جميع الوحدات على أنها عناصر خارجية لـ webpack. مع بعض الاستثناءات المشفرة - مثل رد فعل ورد فعل دوم.
بالنسبة لي ، كان هذا يعني أن رد الفعل الذي تم تحميله من الكود الخاص بي كان مختلفًا عن رد الفعل الذي تم تحميله من هذه الوحدة.
يبدو أن إضافة هذه الوحدات إلى القائمة البيضاء تساعد (لست متأكدًا مما إذا لم يكسر أي شيء آخر بعد :)
ينطبق هذا أيضًا على الأشخاص الذين يواجهون مشكلة في مجموعة أدوات إعادة الإرسال أو إعادة الإرسال وحزمة الويب الإلكترونية. لدي تكوين العمل التالي:
// package.json
...
"electronWebpack": {
"whiteListedModules": ["react-redux"]
}
انظر https://github.com/electron-userland/electron-webpack/issues/349
كانت مشكلتي أنني كتبت
import React from 'React'
بدلا من:
import React from 'react'
في بعض الأحيان تكون هذه الأشياء الغبية.
لقد قمت بحلها عن طريق إضافة ما يلي إلى تكوين webpack الخاص بي:
externals: {
react: {
root: "React",
commonjs2: "react",
commonjs: "react",
amd: "react",
},
"react-dom": {
root: "ReactDOM",
commonjs2: "react-dom",
commonjs: "react-dom",
amd: "react-dom",
},
},
اعتقدت في البداية أنها كانت مشكلة في رابط npm ، وفعلت كل ما تم اقتراحه ، وحتى تحولت إلى الغزل. في النهاية برزت أن شيئًا آخر كان يحدث عند النشر على npm أعطى الخطأ نفسه عند الاستيراد في مشروع آخر.
هل قام أحد هنا بحل هذا مؤخرًا باستخدام lerna monorepo؟ لقد جربت بعض الاقتراحات دون أن يحالفني الحظ.
الوقوع في الخطأ بعد إضافة الكود الذي تم التعليق عليه مع // أدناه. تؤدي إضافة معلومات جزء CssBaseline ورد الفعل إلى حدوث الخطأ. كل شيء يسير على ما يرام عندما يتم التعليق عليها. الكود الأصلي هو ببساطة كود npx create-reaction-app الأساسي. جديد تمامًا على هذا ، ولم يكن لبعض الإصلاحات التي جربتها أعلاه أي تأثير.
استيراد رد من "رد فعل" ؛
استيراد الشعار من "./logo.svg" ؛
استيراد CssBaseline من "@ material-ui / core / CssBaseline" ؛
تصدير تطبيق الوظيفة الافتراضية () {
إرجاع (
//<React.Fragment>
//<CssBaseline />
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
//</React.Fragment>
) ؛
}
للاختبار المحلي:
في مكتبة node_modules ، احذف مجلد رد فعل ورد الفعل
في الحزمة الرئيسية ، قم بتشغيل "تثبيت الغزل" أو "تثبيت npm" مرة أخرى.
هذا يمنع تحميل النسخة الثانية من التفاعل في الحزمة الرئيسية. من الواضح أنه ليس إصلاحًا دائمًا ولكنه يعمل للاختبار المحلي.
بالنسبة لأي شخص يستخدم lerna ، قد تواجه هذه المشكلة عند تشغيل الاختبارات في حزمة واحدة ، حيث تشير الكود إلى مكونات في حزمة أخرى.
كانت المشكلة التي واجهناها في هذه الحالة بسبب رد الفعل الذي يتم استيراده في المواصفات ، وكذلك يتم استيراده في مكون في شجرة المكونات التي كانت تستخدم Material UI's withStyles ، والتي يتم تنفيذها باستخدام الخطافات في واجهة المستخدم المادية.
يبدو أن التفاعل يدير الحالة داخليًا في متغير ReactCurrentDispatcher.current
، وينتهي الأمر بالتعيين في حالة واحدة من التفاعلات ، ولكن يتم استخدامه في مثيل آخر من رد الفعل - عندما يكون فارغًا ، فإنه يرمي Invalid hook call ...
رسالة.
كنا بالفعل نستخدم Craco لإلغاء تهيئة حزمة الويب الخاصة بتطبيق Create React في وقت الإنشاء:
webpack: {
alias: {
react: path.resolve(__dirname, './node_modules/react'),
},
},
ومع ذلك ، يتم استخدام تجاوز حزمة الويب هذا فقط في وقت الإنشاء - عند إجراء الاختبارات ، لم يتم إنشاء الكود ، ولكن تم إنشاء مثيل له من المصدر - لذلك كان الحل لدينا هو الاستفادة من CracoAlias في craco.config.js
لتحديد مسار التفاعل أثناء الاختبارات:
plugins: [
{
plugin: CracoAlias,
options: {
source: 'options',
baseUrl: './',
aliases: {
// We need to alias react to the one installed in the desktop/node_modules
// in order to solve the error "hooks can only be called inside the body of a function component"
// which is encountered during desktop jest unit tests,
// described at https://github.com/facebook/react/issues/13991
// This is caused by two different instances of react being loaded:
// * the first at packages/desktop/node_modules (for HostSignUpDownloadComponent.spec.js)
// * the second at packages/components/node_modules (for packages/components/Modal)
react: './node_modules/react',
},
},
},
],
لقد استخدمت @craco/craco
كحل ، بدون إخراج ، باتباع مثال apieceofbart . كانت الخطوات بالنسبة لي هي التالية باستخدام npm link
لاختبار الوحدة المحلية:
npm i @craco/craco --save
craco.config.js
للجذر حيث يعيش package.json في التطبيق التجريبي.start
و build
و test
باستبدال react-scripts
بـ craco
في تطبيقي التجريبي.// craco.config.js
const path = require('path');
module.exports = {
webpack: {
alias: {
react: path.resolve(__dirname, './node_modules/react')
}
}
}
// package.json
{
....
"scripts": {
"start": "craco start",
"build": "craco build",
"test": "craco test",
"eject": "react-scripts eject"
},
...
}
تحرير: لم ألاحظ حتى أن jasondarwin لديه نفس الفكرة.
قضيت أفضل يوم في محاولة إصلاح هذه المشكلة. نشر الحل الخاص بي هنا في حالة أنه يساعد أي شخص.
نحن نستخدم monorepo وكانت حزمتان تستوردان مثيلات مختلفة من رد الفعل ، لكنهما كانا يتجهان إلى نفس المكان في وحدات عقدة الجذر. تبين أن لدينا هاتين الحالتين لأن أحد التطبيقات كان يستخدم حزمة الويب الخاصة به لإنشاء حزمة. تم رفع هذا بشكل صحيح إلى وحدة عقدة الجذر ، ولكنه سيحصل على مثيله الخاص عند استيراده بواسطة تلك الحزمة. كان الحل يتضمن رد فعل وتفاعل DOM في العناصر الخارجية لتكوين حزمة الويب بحيث لا تنشئ حزمة الويب مثيلًا جديدًا من رد الفعل للحزمة.
externals: {
react: 'react',
reactDOM: 'react-dom',
},
أمل أن هذا يساعد شخصاما!
بالنسبة لي ، كان يستخدم الإصدار 4.0.0 من أداة تحميل التفاعل الساخن الإصدار 4.0.0 ، ويبدو أن التحديث إلى الإصدار 4.8 من برنامج رد الفعل الساخن
أتلقى الرسالة Invalid hook call
فقط عند إجراء اختباراتي على خطاف مخصص أقوم بإنشائه للعمل مع النوافذ المشروطة.
لإثبات السلوك ، قمت بإنشاء مثال في ما يلي:
(https://github.com/BradCandell/invalid-hook-example)
react
و react-dom
هل أفتقد شيئًا واضحًا بشكل رهيب؟ عندما انتهكت القاعدة في الماضي ، سيفشل npm start
. لكن هذا فشل فقط في اختباراتي.
أنا أقدر المساعدة!
-براد
لقد قمت بحلها عن طريق إضافة ما يلي إلى تكوين webpack الخاص بي:
externals: { react: { root: "React", commonjs2: "react", commonjs: "react", amd: "react", }, "react-dom": { root: "ReactDOM", commonjs2: "react-dom", commonjs: "react-dom", amd: "react-dom", }, },
اعتقدت في البداية أنها كانت مشكلة في رابط npm ، وفعلت كل ما تم اقتراحه ، وحتى تحولت إلى الغزل. في النهاية برزت أن شيئًا آخر كان يحدث عند النشر على npm أعطى الخطأ نفسه عند الاستيراد في مشروع آخر.
هذه ثابتة بالنسبة لي. كنت أستورد رد فعل توستيفي وكنت أتلقى مكالمة ربط غير صالحة. مررت بكل عنصر في خطأ وحدة التحكم:
- قد يكون لديك إصدارات غير متطابقة من React و React DOM.
- ربما تكون قد انتهكت قواعد الخطافات.
- قد يكون لديك أكثر من نسخة واحدة من React في نفس التطبيق.
انتهى الأمر بكونه الإصدار الثالث. تابعت هذا:
https://reactjs.org/warnings/invalid-hook-call-warning.html#duplicate -react
لم يعمل أي من الحلول المذكورة أعلاه بالنسبة لي ، حتى أدركت أنني كنت أقوم بتجميع نسخة أخرى من رد الفعل مع المكتبة التي كنت أستوردها.
لقد قمت بتحويل وتجميع الكود المصدري لمكتبتي ، لذا فإن التحقق من الإصدارات المختلفة من React المدرجة في المستندات كان يعيد true
بدلاً من false
.
لقد أدى وضع علامة react
على أنه تبعية خارجية وتركه خارج حزمة مكتبتي إلى الحيلة.
لم تكن حالتي حالة أحادية ، لكنها كانت حالة مشابهة إلى حد ما. نحن نعمل على تطوير إطار عمل جديد لواجهة المستخدم ، وبدلاً من استخدام رابط npm أو lerna ، نستخدم فقط الأسماء المستعارة لحزمة الويب لطلب الملفات الموجودة في مجلد شقيق. إنه يعمل بشكل جيد ، لكنك ستواجه هذه المشكلة. لحسن الحظ ، حل حل apieceofbart لنا المشكلة.
السطر 130: 21: يُطلق على React Hook "useStyles" في الوظيفة "PharmacyDashboard" التي ليست مكونًا لوظيفة React أو وظيفة React Hook مخصصة لخطافات التفاعل / قواعد الخطافات
السطر 133: 45: يتم استدعاء React Hook "React.useState" في الوظيفة "pharmacyDashboard" وهي ليست مكونًا لوظيفة React أو دالة React Hook مخصصة لخطافات التفاعل / قواعد الخطافات
هذا هو الخطأ ..... هل يمكن لأي شخص مساعدتي في حل هذا
vyshnaviryali ، من الأفضل أن تستدعي وظيفتك usePharmacyDashboard
./src/components/HomeFiles/AppFooter.js
السطر 1: 1: تعريف القاعدة "المواد-ui / no-hardcoded-labels" لم يتم العثور على المواد-ui / no-hardcoded-labels "
هل يمكن لأي شخص مساعدتي في حل هذه المشكلة
بالنسبة إلى كل من يقوم بتشغيل هذه المشكلة مع npm link
لأنك تحتاج إلى إضافة ميزات إلى مكونك (مكوناتك) ولكنك لا ترغب في npm publish
قبل الاختبار ، فأنا مندهش من عدم اقتراح أي شخص باستخدام yalc
(https://www.npmjs.com/package/yalc)
بالنسبة إلى كل من يقوم بتشغيل هذه المشكلة مع
npm link
لأنك تحتاج إلى إضافة ميزات إلى مكونك (مكوناتك) ولكنك لا ترغب فيnpm publish
قبل الاختبار ، فأنا مندهش من عدم اقتراح أي شخص باستخدامyalc
(https://www.npmjs.com/package/yalc)
لقد فعلت ذلك بالفعل العام الماضي: https://github.com/facebook/react/issues/13991#issuecomment -535150839
لقد استخدمناه منذ ما يقرب من عام الآن دون أي مشاكل.
واحد آخر هنا باستخدام lerna ؛ لإصلاح ذلك ، قمت بنقل التبعيات react
و react-dom
إلى الجذر الخاص بي package.json
.
واجهت نفس المشكلة وقمت بحلها بإضافة:
alias: { react: path.resolve('./node_modules/react') }
إلى
resolve
في تهيئة webpack لتطبيقي الرئيسي.من الواضح أنه كان خطئي في استخدام نسختين من React لكنني أوافق على أنه سيكون من الرائع أن تكون رسالة الخطأ أفضل. أعتقد أن هذا ربما يشبه: # 2402
بالنسبة لأولئك الذين يستخدمون الطريقة أعلاه ولكن لا يزالون يحصلون على الأخطاء عند تشغيل الدعابة ، أضف هذه إلى moduleNameMapper
في تهيئة jest (احذف رد فعل دوم إذا لم يكن ضروريًا):
moduleNameMapper: {
...
"^react$": "<rootDir>/node_modules/react",
"^react-dom$": "<rootDir>/node_modules/react-dom",
...
}
أنا في حيرة. أحصل على هذا ولكن تطبيقي لا يستخدم أي خطافات ولا توجد نسخ مكررة أو تفاعلية. أنا أستخدم next.js. يمكن أن يكون لديك شيء لتفعله حيال ذلك؟
npm ls react
npm ls react-dom
maapteh هل هذا بالنسبة لي؟ لقد قمت بتشغيل هذه الأوامر ولم أجد أي نسخ مكررة. كلا المكتبتين في الإصدار 16.13.1
dancro أنا أستخدم Next.js أيضًا ولست قادرًا على إصلاح هذا.
يقوم كل npm ls react
و npm ls react-dom
بإرجاع إدخال واحد فقط. لكني لست متأكدًا من صحة ذلك. واجهت هذا الخطأ عند الربط بحزمة محلية من أجل التنمية. يُرجع npm ls
إدخالًا واحدًا فقط حتى عندما لا أقوم بربط رد الفعل في التبعية بالرجوع إلى الريبو الرئيسي. ولكن حتى عندما أتفاعل مع الارتباط بشكل صحيح ، ما زلت أتلقى الخطأ.
justincy ليس لدي أي روابط حزمة في مشروعي. أراهن أنه مرتبط بـ Next.js. تختفي المشكلة إذا وضعت المكون الرئيسي داخل typeof document !== 'undefined'
، مما يقوض بشكل فعال الغرض من Next.js
تمكنت من حل مشكلتي عن طريق حذف رد فعل ورد فعل دوم من node_modules في التبعية. إنه ليس مثاليًا ، لكن على الأقل يمكنني مواصلة العمل.
@ dancancro أنا متشكك في أن سبب مشكلتك هو Next.js. إذا كان الأمر كذلك ، فسيواجه الكثير من الأشخاص الآخرين المشكلة. أنا أواجهها فقط بسبب الحزم المرتبطة. لا أرى الخطأ بدون الحزم المرتبطة.
تختفي المشكلة إذا قمت بإزالة خمسة من المكونات السبعة في المكون الرئيسي. لا أرى أي شيء مميز حول هذه المكونات. التفاف هذه المكونات في typeof document !== 'undefined'
s يعمل أيضًا.
مرحبًا يا فريق ، أحاول ترقية إصدار React من 16.2.0 إلى 16.13.1 ، كما فعلت الشيء نفسه بالنسبة لـ response-dom.
لدي الآن مكون غلاف يتم استدعاؤه في "/ test"
class TestWrapper extends React.Component {
render() {
return (
<React.Fragment>
<TestComponent />
</React.Fragment>
)
}
}
في غلاف الاختبار ، قمت باستيراد مكون وظيفي به خطاف
function TestComponent(props) {
useEffect(() => {
console.log("TEST COMPONENT");
});
return (
<div>
Hello world!
</div>
)
}
ولكن عندما تعرض الصفحة خطاف UseEffect لا يعمل ويحدث خطأ ، مثل تحذير استدعاء ربط غير صالح
ملاحظة. :
هذا ما لدي
أنا فقط ...
@ @
أستخدم nextJS لذلك لا يحتاج إلى استيراد React. وقد جربته - لا تساعد.
تعمل جميع الصفحات والوظائف الأخرى بشكل مثالي
Brotipok ما هو إصدار next.js؟ (مشاهدة مشاكل متشابهة ، ولكن فقط عند الانتقال إلى 9.5 من 9.4.X)
أهلا!
لقد واجهت نفس الخطأ ، حزمة واحدة فقط للتفاعل والتفاعل dom عندما أفعل npm ls.
إصدار رد الفعل: 16.13.1
إصدار React-dom: 16.13.1
أنا أستخدم الكتابة المطبوعة وقمت بتهيئة المشروع باستخدام تطبيق إنشاء التطبيق الخاص بي - نص قالب مطبوع.
المكون الوظيفي يعمل فقط إذا لم أستخدم الخطافات بداخله.
Package.json
{
"الاسم": "blablamovie"،
"الإصدار": "0.1.0"،
"خاص": صحيح ،
"التبعيات": {
"@ testing-library / jest-dom": "^ 4.2.4"،
"@ testing-library / رد فعل": "^ 9.5.0"،
"@ testing-library / user-event": "^ 7.2.1"،
"@ types / jest": "^ 24.9.1"،
"@ types / node": "^ 12.12.53"،
"@ أنواع / رد فعل": "^ 16.9.43"،
"@ types / reaction-dom": "^ 16.9.8"،
"@ types / reaction-router-dom": "^ 5.1.5"،
"رموز التفاعل": "^ 3.10.0"،
"نصوص تفاعلية": "3.4.1"،
"typecript": "^ 3.7.5"،
"محلل حزمة حزمة الويب": "^ 3.8.0"
} ،
"نصوص": {
"بدء": "بدء البرامج النصية للتفاعل"،
"بناء": "بناء البرامج النصية التفاعلية" ،
"اختبار": "اختبار البرامج النصية للتفاعل"،
"إخراج": "إخراج البرامج النصية التفاعلية" ،
"تحليل": "source-map-explorer 'build / static / js / *. js'"
} ،
"eslintConfig": {
"يمتد": "رد فعل التطبيق"
} ،
"قائمة المتصفحات": {
"إنتاج": [
"> 0.2٪" ،
"ليس ميت"،
"not op_mini all"
] ،
"تطوير": [
"آخر إصدار كروم واحد"،
"آخر إصدار واحد من Firefox" ،
"آخر إصدار من رحلات السفاري"
]
}
}
أنا لست مشروعًا مهمًا وهذا يجعلني مجنونًا بعض الشيء.
إذا كان شخص ما يمكن أن يساعد فسيكون ذلك رائعا.
شكرا.
Brotipok ما هو إصدار next.js؟ (مشاهدة مشاكل متشابهة ، ولكن فقط عند الانتقال إلى 9.5 من 9.4.X)
ها هي التبعيات
"التبعيات": {
"التالي": "9.4.4"،
"الصور التالية": "^ 1.4.0"،
"node-sass": "^ 4.14.1"،
"رد فعل": "16.13.1"،
"تفاعل-مستند-ميتا": "^ 3.0.0-بيتا.2"،
"رد فعل دوم": "16.13.1"،
"تفاعل-أفقي-التسلسل الزمني": "^ 1.5.3"،
"تفاعل-العلامات الوصفية": "^ 0.7.4"،
"رد فعل onclickoutside": "^ 6.9.0"
} ،
"devDependencies": {
"@ types / node": "^ 14.0.23"،
"@ أنواع / رد فعل": "^ 16.9.43"،
"typecript": "^ 3.9.7"
}
أواجه هذه المشكلة نفسها عند استيراد مكونات material-ui/core/Dialog
، لقد قمت بتعيين package.json
الخاص بي لاستخدام رد فعل 16.8.0
على وجه التحديد لكل من react
و react-dom
واردات
لقد قمت بتشغيل npm ls react
و npm ls react-dom
باستيراد واحد فقط لقد جربت أيضًا الاختبار الموضح في صفحة الخطأ:
// Add this in node_modules/react-dom/index.js
window.React1 = require('react');
// Add this in your component file
require('react-dom');
window.React2 = require('react');
console.log(window.React1 === window.React2);
الذي يُرجع false
، ولكن كيف يمكنني تعقب إصدار التفاعل "المختلف" الذي يتم استيراده بواسطة تبعية ؟، يبدو أنه يحدث فقط عندما أقوم باستيراد مكون حوار واجهة المستخدم المادية ، ويحدث بمجرد النقر زر يقوم بتشغيله للعرض. يمكنني استخدام مكونات أخرى مثل List
و ListItems
، إلخ.
حاولت فرض قرارات ولم يتم إصلاحها أيضًا.
أنا لا أستخدم حزمة الويب (مشروع صغير حقًا) ، لذا فإن الإنشاء يحدث react-scripts build
إذا كان ذلك يحدث فرقًا.
إعادة الكتابة: سأقوم فقط باستبدال سؤالي بمرجع حل (وربما طلب لمزيد من الوضوح في المستندات ، بالنسبة لنا الدمى؟ :))
خلفية:
كنت أحاول تجميع حزمة الويب مكونًا وظيفيًا باستخدام خطافات في أحد الأصول حيث يمكن استدعاء هذا المكون من Vanilla JS في المتصفح.
علي سبيل المثال،
function Example() {
const [count, setCount] = React.useState(0);
return <button onClick={() => setCount(count + 1)}>
You clicked {count} times
</button>;
}
export default Example;
... الذي أردت تصديره كوحدة في حد ذاته ، وبعد تحميل هذا الأصل ، استخدمه مباشرةً من HTML ، على غرار:
<script defer>
ReactDOM.render(
ExportedCompiledExample.default(props),
document.getElementById("my_element")
);
</script>
لقد حصلت على هذا العمل منذ فترة طويلة _ طالما أن المكون لا يحتوي على خطافات_. ولكن عند استخدام الخطافات ، ظللت أجري في رسالة الخطأ هذه.
الحل البسيط للطاولة
لقد اتبعت _ الكثير _ من عمليات الرنجة الحمراء الأكثر تعقيدًا (إصدارات / مثيلات / تفاعلات / رد فعل متعددة ، وواردات npm والاعتمادات الثانوية المخفية ، ومحمل رد الفعل الساخن ، وإعداد حزمة الويب ، والعناصر الخارجية ، واتفاقيات الحزمة / الوحدة / المكتبة المختلفة ، وهيكل ما بعد التجميع .. .) قبل تجربة هذا ، والتي نجحت:
export default () => <Example />;
(أو export default props => <Example {...props} />
عند الاقتضاء).
بأثر رجعي 20/20 فمن المنطقي ، على ما أعتقد.
ولكن فقط لتحديد مصدر الارتباك في حالة احتياج شخص آخر إليه: تقول مستندات قواعد الخطاف _اتصل بهم على المستوى الأعلى في جسم مكون الوظيفة_. وهو ما اعتقدت أنني فعلت ذلك ، لأنني قمت بالفعل بلصق المثال مباشرة في هيكلي.
تفسيري هو أن هذا من الأمثلة ...
function Example() {
// Declare a new state variable, which we'll call "count"
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
... ليس عنصر وظيفة في حد ذاته؟ يصبح الأمر كذلك في سياق الاستدعاء الصحيح (لذلك ، ليس Example()
ولكن <Example />
).
أعتقد أنني ربما فاتني ذلك في مكان آخر في المستندات ، ولكن في حالة عدم وجوده: كان سيوفر لي الكثير من الوقت إذا تم تضمين / ذكر / ربط جزء من سياق الاستخدام (أو مجرد إعداد وحدة ES). :) خاصة وأن إصدار export default Example
المباشر يعمل بدون خطافات.
شكرا لحل العملapieceofbart! كانت مشكلتي متعلقة بوصلة npm.
إليك كيفية العمل مع تطبيق Create React ، حيث يتم إخفاء Webpack config حسب التصميم. قد يكون الحل الخاص بك أيضاflorianzemma؟
npm install -D react-app-rewired
// config-overrides.js
module.exports = function override(config, env) {
const path = require('path');
return {
...config,
resolve: {
...config.resolve,
alias: {
...config.resolve.alias,
react: path.resolve('./node_modules/react')
}
}
};
}
react-scripts ...
ذات الصلة في package.json بـ react-app-rewired ...
.اتمني ان يكون مفيدا
حصلت على هذا الخطأ لأنني قمت بتحميل الحزم مرتين.
في حالتي ، حدث ذلك لأن قالب nunjucks حيث تم عرض علامات البرنامج النصي قد تم استخدامه مرتين - في التخطيط نفسه ، وفي قالب عام لمحتوى علامة الرأس ،
أنا أستخدم Yarn ، وقد أصلحت هذا عن طريق فرض الحل في
package.json
:"resolutions": { "**/react": "16.7.0-alpha.2", "**/react-dom": "16.7.0-alpha.2" },
إلى جانب إضافة الدقة في التطبيق الأصل (المكتبة المستهلكة) ، قمت بتحديث تبعيات المكتبة بالأوامر التالية:
yarn add link:/path/to/parent-app/node_modules/react
yarn add link:/path/to/parent-app/node_modules/react-dom
بعد ذلك ، أعدت ربط المكتبة في التطبيق الأصلي بـ yarn add link:/path/to/library
أهلا
أواجه نفس المشكلة مع مساحات عمل الغزل.
لدي تخطيط مثل هذا:
مساحة العمل /
├── مكتبة /
├── التطبيق 1 /
├── التطبيق 2 /
app1 و app2 لهما تبعيات مباشرة للتفاعل مع الإصدار 16.9.0 ، و response-dom v16.9.0 و "المكتبة".
تعتمد "المكتبة" على الأقران لتتفاعل مع الإصدار 16.9.0 ولكنها أيضًا تعتمد على المطورين في القصص القصيرة.
يبدو أن المشكلة تأتي من القصص القصيرة التي تعتمد على رد الفعل v16.13.1.
ومع ذلك ، عندما أقوم بتشغيل تثبيت الغزل ، انتهى بي الأمر مع رد فعل 16.13.1 في وحدات node_modules ذات المستوى الأعلى وأتفاعل 16.9.0 في node_modules المحلية من app1 و app2.
عندما أقوم بتشغيل التطبيق 1 (الذي تم إنشاؤه باستخدام CRA) ، فإنه يستخدم تفاعله المحلي v16.9.0 ، لكن المكونات من "المكتبة" تستخدم React v16.13.1
يبدو لي أن هذا يمثل مشكلة في منطق رفع الغزل أو تعريف حزمة الويب الخاصة بإنشاء تطبيقات تفاعلية أو كليهما؟
أي شخص لديه أي فكرة عن حل بديل لهذا السيناريو؟
أهلا
أواجه نفس المشكلة مع مساحات عمل الغزل.
لدي تخطيط مثل هذا:مساحة العمل /
├── مكتبة /
├── التطبيق 1 /
├── التطبيق 2 /app1 و app2 لهما تبعيات مباشرة للتفاعل مع الإصدار 16.9.0 ، و response-dom v16.9.0 و "المكتبة".
تعتمد "المكتبة" على الأقران لتتفاعل مع الإصدار 16.9.0 ولكنها أيضًا تعتمد على المطورين في القصص القصيرة.
يبدو أن المشكلة تأتي من القصص القصيرة التي تعتمد على رد الفعل v16.13.1.
ومع ذلك ، عندما أقوم بتشغيل تثبيت الغزل ، انتهى بي الأمر مع رد فعل 16.13.1 في وحدات node_modules ذات المستوى الأعلى وأتفاعل 16.9.0 في node_modules المحلية من app1 و app2.عندما أقوم بتشغيل التطبيق 1 (الذي تم إنشاؤه باستخدام CRA) ، فإنه يستخدم تفاعله المحلي v16.9.0 ، لكن المكونات من "المكتبة" تستخدم React v16.13.1
يبدو لي أن هذا يمثل مشكلة في منطق رفع الغزل أو تعريف حزمة الويب الخاصة بإنشاء تطبيقات تفاعلية أو كليهما؟
أي شخص لديه أي فكرة عن حل بديل لهذا السيناريو؟
الحل الوحيد الذي وجدته لهذا هو yarn run eject
تطبيق CRA وتبديل ترتيب قسم resolve
من:
`` جافا سكريبت
الوحدات النمطية: ['node_modules'، paths.appNodeModules] .concat (
modules.additionalModulePaths || []
) ،
""
ل
`` جافا سكريبت
الوحدات النمطية: [paths.appNodeModules، 'node_modules']. concat (
modules.additionalModulePaths || []
) ،
""
يبدو غريباً بالنسبة لي أن "appNodeModules" ليس أولوية قصوى - بالتأكيد يجب تأجيل التطبيق الفعلي المعني عندما يتعلق الأمر بحل التبعيات؟
واجهت مشكلة "الخطافات" في إعداد يتضمن Webpack و Electron. يعتمد مشروعي على الوحدة "أ" المجمعة نفسها بواسطة Webpack (والتي قمت بتأليفها بنفسي). لقد أخرجت React من A (معلنة أنها وحدة commonjs2). هذا يستثني ملفات React من حزمة المكتبة.
برنامجي الرئيسي ، الذي يعمل في عملية Electron Renderer ، يستخدم React أيضًا. كان لدي Webpack يتضمن React في الحزمة (بدون تكوين خاص).
ومع ذلك ، نتج عن هذا مشكلة "الخطافات" بسبب وجود مثيلين من React في بيئة وقت التشغيل.
هذا بسبب هذه الحقائق:
كان الحل هو إخراج React من البرنامج الرئيسي أيضًا. بهذه الطريقة ، يحصل كل من البرنامج الرئيسي والوحدة A على React من Electron - مثيل واحد في الذاكرة.
لقد جربت أي عدد من الأسماء المستعارة ، لكن هذا لا يحل المشكلة لأن اسمًا مستعارًا يرشد Webpack فقط إلى مكان العثور على رمز الوحدة النمطية. إنه لا يفعل شيئًا فيما يتعلق بمشكلة مخابئ الوحدات المتعددة!
إذا واجهت هذه المشكلة مع وحدة لا يمكنك التحكم فيها ، اكتشف ما إذا كان يتم تخريج React وكيف يتم ذلك. إذا لم يتم تخريجها ، أعتقد أنه لا يمكنك حل هذه المشكلة في سياق الإلكترون. إذا تم تخريجها فقط على أنها عالمية ، فضع React في ملف html الخاص بك واجعل برنامجك الرئيسي يعتمد على ذلك أيضًا.
أخيرا...
//webpack.config.js
module.exports = {
...
externals: {
react: 'react',
},
}
Vue3 لديه نفس المشكلة
لقد قمت بحل هذه المشكلة بوضع react
و react-dom
كـ peerDependencies
في الحزمة الخاصة بي. json من مكتبتي الخارجية ، التي تستخدم React.
"peerDependencies": {
"react": "^16.13.1",
"react-dom": "^16.13.1"
},
أعتقد أنني ربما فاتني ذلك في مكان آخر في المستندات ، ولكن في حالة عدم وجوده: كان سيوفر لي الكثير من الوقت إذا تم تضمين / ذكر / ربط جزء من سياق الاستخدام (أو مجرد إعداد وحدة ES). :) خاصة وأن إصدار
export default Example
المباشر يعمل بدون خطافات.
مرحبًا @ espen42 ،
كنت آمل حقًا أن يساعدنا الحل الخاص بك. لقد حاولنا حرفياً _ كل شيء _ ، تمامًا كما ذكرت.
لسوء الحظ ، لا يبدو أن الحل الخاص بك يساعد أيضًا. أتساءل ربما فاتني شيء ما؟
لذلك ، في الحزمة (سأسميها @ bla / bla) ، لدينا index.js
الذي يحتوي على مكون به خطافات ، مثل
function Bla = ({...props]) => {
const [bla, setBla] = useState(false);
return bla ? <div {...props} /> : 'no luck';
}
نقوم بتجميع الحزمة باستخدام npx babel
.
نربط هذه الحزمة بـ npm link
ثم ندرجها في المشروع مثل npm link @bla/bla
.
تستخدم كل من الحزمة والمشروع نفس الإصدار من React و response-dom.
في المشروع ، نقوم بتضمين الحزمة مثل هذا:
import Bla from `@bla/bla`
const RenderBla = ({...props}) => <Bla {...props} />
export default RenderBla
لسوء الحظ ، لا يزال الخطأ قائما.
Invalid hook call. Hooks can only be called inside of the body of a function component.
ما الذي يمكن أن نفتقده؟
"externals": { "react": "react", "react-dom": "react-dom" }
هذا واحد أصلح المشكلة بالنسبة لي ، شكرًا جزيلاً لك يا رجل ❤️
خطأ في تخصيص الحقل عند الوصول إليه عبر رابط خارجي (Sharepoint Online)
امتداد مخصص لمجال spfx مع عدد قليل من مكونات واجهة المستخدم النسيجية ، عند الوصول إليه عبر رابط ، الحصول على أحد هذه الأخطاء اعتمادًا على إصدار fabricUI:
https://reactjs.org/docs/error-decoder.html/؟invariant=321 ،
https://reactjs.org/docs/error-decoder.html/؟invariant=290&args [] = A.٪ 20General
عندما يتم تحديث الصفحة ، كل شيء يعمل بشكل صحيح.
لم أستخدم أي خطافات React في الكود ، فقط مكونات React.
لم تستخدم أي حكام أيضًا.
أعتقد أنه قد يكون بسبب سبب واجهة Fabric ui عند إزالة جميع مكونات واجهة المستخدم النسيجية ، لا يحدث أي خطأ.
لقد جربت إصدارات مختلفة من fabic ui و 6.189.2 و 6.214.0 و 7.114.1 وحاولت أيضًا استبدال جميع مراجع واجهة المستخدم النسيجية بواجهة مستخدم بطلاقة ، ولا تزال المشكلة قائمة
فحص إصدارات التفاعل ، وهنا الإخراج
رد فعل npm ls
+ - @ microsoft / [email protected]
| + - @ microsoft / [email protected]
| | -- [email protected] deduped
| +-- @microsoft/[email protected]
| |
- رد فعل @ 16.8.5 محسوم
| + - @ microsoft / [email protected]
| | -- [email protected] deduped
|
- رد فعل @ 16.8.5 محسوم
"- رد @ 16.8.5
أهلا بكم،
لقد عثرت أيضًا على هذا الخطأ المزعج. في حالتي ، كان هذا أيضًا تكوينًا خاطئًا لبناء webpack الخاص بي في النهاية. لكن أيا من الأشياء المقترحة في هذه المسألة لم تنجح معي. لذلك أريد أن أشارك تجربتي أيضًا.
تتضمن صفحتي نقاط دخول متعددة ، ويمكن لـ SplitChunkPlugin إنشاء أجزاء وقت تشغيل. نظرًا لأننا نستخدم جوهرة rails-webpacker ، فقد تم تكوينه افتراضيًا لإنشاء وقت تشغيل لكل جزء. لكن webpack يفعل شيئًا مشابهًا افتراضيًا ، فهو يتضمن وقت التشغيل داخل الأجزاء.
بالطبع الوثائق تحذر من هذه القضية ، لكن عليك أن تجدها. سيؤدي تعيين optimization.runtimeChunk
إلى single
إلى إنشاء وقت تشغيل منفصل. سيؤدي هذا إلى منع البناء الخاص بك من إنشاء نسخ متعددة من التفاعل ، عند استخدام رد فعل من نقاط دخول متعددة.
راجع https://webpack.js.org/configuration/optimization/#optimizationruntimechunk
مرحبا جميعا،
لدي مشكلة أنني أريد استخدام lib خارجي يأتي من CDN ومضمن مع علامة <script>
، لذلك لا يمكنني فعل الكثير مع الكود نفسه. يستخدم lib التفاعل والخطافات ، لذلك أحصل على ملف
خطأ 3. You might have more than one copy of React in the same app
.
للأسف لا توجد حزمة NPM للمكتبة: https://github.com/Anyline/anyline-ocr-anylinejs-module
أنا باستخدام CRA ولا يتم إخراج المشروع.
إنشاء مثال صغير Sandbox .
إنه يلقي نفس الخطأ لأن الحزمة الأخرى تستخدم الخطافات أيضًا ولكن مع React الخاصة بها. اضطررت إلى نشر الحزمة الخاصة بي على NPM ثم استيرادها مباشرة من NPM. الذي - التي
لقد جئت إلى هذه القضية مؤخرًا وأتساءل لماذا.
لقد قمت بحلها عن طريق تحميلها على GitLab وتثبيتها حسب العنوان.
ما الفرق بين الباقة والحزمة المحلية؟
لقد اكتشفت أنني تلقيت "مكالمة ربط غير صالحة". عندما أقوم بتحميل المكون الذي يستدعي الخطاف ديناميكيًا.
ينجح الاختبار الذي يقوم بتحميل "التطبيق" بشكل ثابت. الاختباران اللذان يقومان بتحميله ديناميكيًا (أحدهما يستخدم require
، والآخر يستخدم import
كدالة) كلاهما يعطي الخطأ.
لماذا أهتم حتى: أحاول كتابة بعض الاختبارات حيث أستخدم jest.doMock للسخرية من بعض الأشياء ثم تحميل الوحدة التي أرغب في اختبارها ديناميكيًا ، وفقًا للوثائق . أنا أستخدم doMock بدلاً من Mock لأنني بحاجة إلى أن أكون قادرًا على السخرية من الأشياء بشكل مختلف في وظائف مختلفة. ستلاحظ أن الخطأ يحدث دون أي سخرية.
إنه يلقي نفس الخطأ لأن الحزمة الأخرى تستخدم الخطافات أيضًا ولكن مع React الخاصة بها. اضطررت إلى نشر الحزمة الخاصة بي على NPM ثم استيرادها مباشرة من NPM. الذي - التي
لقد جئت إلى هذه القضية مؤخرًا وأتساءل لماذا.
لقد قمت بحلها عن طريق تحميلها على GitLab وتثبيتها حسب العنوان.
ما الفرق بين الباقة والحزمة المحلية؟
catsheue كان React1 === React2
true
بالنسبة لك؟
لم أقم بنشر كتابتي في npm ولكني أردت معرفة ما إذا كان هذا هو السبب
يبدو أن لي React1 === React2 = true
ولم أجد حلًا لسبب حدوث ذلك عند استيراد مكتبة تفاعلاتي إلى مشروع
واجهت نفس المشكلة باستخدام yarn link
لاختبار مكتبة محلية. كان خطئي هو إدراج react
و react-dom
على أنها تبعيات مطوّرة وليست نظيرة.
لذلك كان يجب أن أفعل yarn add --peer react react-dom
. أخيرًا ، نظرًا لأنني ارتكبت خطأ بالفعل في تنفيذ React كاعتمادية مطورة ، فقد احتجت إلى حذف node_modules من مكتبتي. أصلح لي rm -rf node_modules; yarn
المشكلة.
أنا أيضا واجهت هذه المشكلة. في حالتي ، كان السبب في ذلك هو رد فعل مكرر من Storybook (v6.0.28). أعتقد أنه يمكنك العثور على مزيد من المعلومات هنا .
قمت بإلغاء تثبيت تبعيات Storybook ، وحذفت node_modules
وأعدت تشغيل yarn install
مرة أخرى. هذا عمل لي. آمل أن يساعد شخصًا ما على تجنب البكاء وساعات ضائعة على هذا.
هذا الحل يعمل بالنسبة لي أيضًا. أنا أستخدم وظائف Firebase ولدي مجلد node_modules
في كل من جذر مشروعي وضمن الدليل /functions/
. إذا قمت بحذف /functions/node_modules
، فإن تطبيقي يعمل بشكل جيد. هذا حل بديل ، لكنه مزعج إلى حد ما. هل وجد أي شخص حلاً يسمح بوجود كلا المجلدين node_modules
في نفس الوقت؟
للأجيال القادمة وأي شخص قد يواجه هذه المشكلة عند استخدام mdbootstrap في تطبيق تم إنشاؤه باستخدام create-react-app
.
لقد رأيت هذا الخطأ عند إضافة مكونات mdbootstrap المختلفة مثل الأزرار وصور البطاقة. تمت إضافة إخراج وحدة التحكم إلى index.js لاستكشاف الأخطاء وإصلاحها وفقًا لمقالة دعم React ، حيث تم إرجاع true
عند مقارنة الإصدارات. لذلك كان علي أن أجرب شيئًا آخر.
كان الإصلاح هو تشغيل npm dedupe
npm ls react
+-- [email protected]
| `-- [email protected]
`-- [email protected]
npm dedupe
npm ls react
+-- [email protected]
| `-- [email protected] deduped
`-- [email protected]
بعد ذلك ، عملت جميع المكونات بشكل جيد. ايام سعيدة.
لقد اكتشفت أنني تلقيت "مكالمة ربط غير صالحة". عندما أقوم بتحميل المكون الذي يستدعي الخطاف ديناميكيًا.
ينجح الاختبار الذي يقوم بتحميل "التطبيق" بشكل ثابت. الاختباران اللذان يقومان بتحميله ديناميكيًا (أحدهما يستخدم
require
، والآخر يستخدمimport
كدالة) كلاهما يعطي الخطأ.لماذا أهتم حتى: أحاول كتابة بعض الاختبارات حيث أستخدم jest.doMock للسخرية من بعض الأشياء ثم تحميل الوحدة التي أرغب في اختبارها ديناميكيًا ، وفقًا للوثائق . أنا أستخدم doMock بدلاً من Mock لأنني بحاجة إلى أن أكون قادرًا على السخرية من الأشياء بشكل مختلف في وظائف مختلفة. ستلاحظ أن الخطأ يحدث دون أي سخرية.
@ miket01 بالضبط ما أحاول القيام به (ولكن بدون السخرية). هل وجدت أي حل؟
واجهت هذا القيام:
function HeadedSection (props) {
if (!ReactDOMServer.renderToStaticMarkup(props.children))
return null;
const [hidden, set_hidden] = useState(props.hidden);
تم الإصلاح من خلال استدعاء useState
أولاً:
function HeadedSection (props) {
const [hidden, set_hidden] = useState(props.hidden);
if (!ReactDOMServer.renderToStaticMarkup(props.children))
return null;
ما زلت أتلقى هذا الخطأ بعد وضعه جانبًا لعدة أشهر.
أستخدم صفر خطافات في برنامجي. هناك نسخة واحدة بالضبط من react
ونسخة واحدة من react-dom
وهما من نفس الإصدار. لا توجد روابط.
لقد نجحت جزئيًا قبل أن أحاول مؤخرًا تحديث بعض الحزم لإصلاح مشكلات الأمان. أنا أستخدم next.js وكان الإصلاح هو استبعاد بعض المكونات الفرعية من مكون المستوى الأعلى عن طريق تغليفها بـ {typeof window !== 'undefined'
ولكن هذا لا يعمل الآن أيضًا.
[18:50:42] (master) questions
// ♥ npm ls react
[email protected] /Users/Dan/work/b/questions
└── [email protected]
[22:46:34] (master) questions
// ♥ npm ls react-dom
[email protected] /Users/Dan/work/b/questions
└── [email protected]
[22:46:55] (master) questions
// ♥ npm dedupe
removed 55 packages, moved 46 packages and audited 1712 packages in 65.449s
33 packages are looking for funding
run `npm fund` for details
found 26 vulnerabilities (15 low, 3 moderate, 8 high)
run `npm audit fix` to fix them, or `npm audit` for details
تم طرح الخطأ لأن ReactCurrentDispatcher.current === null
ولكن لا يمكنني العثور على أي مكان في /node_modules/react/cjs/react.development.js
حيث تم تعيين هذا على شيء ما.
هل يمكن لأحد أن يخبرني من أين يجب أن تحصل على قيمة ReactCurrentDispatcher.current
؟
https://github.com/facebook/react/search؟p=2&q=٪22ReactCurrentDispatcher.current+٪3D٪22&type=code
يبدو هذا كمرشح ، لكن هذا الرمز غير موجود في react-development.js
بي. هل يجب أن تكون؟
const prevPartialRenderer = currentPartialRenderer;
setCurrentPartialRenderer(this);
const prevDispatcher = ReactCurrentDispatcher.current;
ReactCurrentDispatcher.current = Dispatcher;
لقد تلقيت هذا الخطأ مع العرض من جانب الخادم بمقدار next.js
وهذا الرمز موجود في مصدر التفاعل تحت react-dom/server
. كيف يمكنني تحديد ما إذا كان /node_modules/react/cjs/react-development.js
صحيحًا؟
تحديث: كانت هذه هي المشكلة. لقد قمت بتحرير webpack.config.externals
في ملف next.config.js
الخاص بي
https://github.com/vercel/next.js/issues/17592#issuecomment -712443172
يلقي تطبيقي خطأً فادحًا (اتصال غير صالح) في أي وقت أحاول فيه دمج واجهة المستخدم المادية فيه. أنا جديد تمامًا على React لذا أحتاج إلى المساعدة.
التعليق الأكثر فائدة
واجهت نفس المشكلة وقمت بحلها بإضافة:
إلى
resolve
في تهيئة webpack لتطبيقي الرئيسي.من الواضح أنه كان خطئي في استخدام نسختين من React لكنني أوافق على أنه سيكون من الرائع أن تكون رسالة الخطأ أفضل. أعتقد أن هذا ربما يشبه: https://github.com/facebook/react/issues/2402