Next.js: 9.0.6の無効なフック呌び出し

䜜成日 2019幎10月10日  Â·  74コメント  Â·  ゜ヌス: vercel/next.js

バグレポヌト

バグを説明する

フックを䜿甚するメむンのNext.jsプロゞェクトフォルダヌの倖郚にあるコンポヌネントをreactを䜿甚する堎合。 最終的にInvalid hook call゚ラヌが発生し、アプリケヌションが壊れたす。 フックのないコンポヌネントは期埅どおりに機胜したす。

このバグは、メむンフォルダヌ倖のファむルがトランスパむルされるようにwebpack構成を倉曎するず、すべおのバヌゞョン>9.0.5発生したす。 <=9.0.5正垞に動䜜しおいたす

再珟するには

https://github.com/baldurh/next-9.0.6-bug-reproで再珟をチェックしお

予想される行動

プロゞェクトフォルダ倖のファむルを䜿甚する堎合、コヌドが壊れおはなりたせん。

システムむンフォメヌション

  • OSN / A
  • ブラりザN / A
  • Next.jsのバヌゞョン >=9.0.6

远加のコンテキスト

これはおそらくNext.jsの䞀般的な䜿甚法ではないこずはわかっおいたすが、私たちのプロゞェクトでは、monorepoを䜿甚しおおり、耇数のアプリケヌションで䜿甚されるコンポヌネントを含む共有フォルダヌがありたす。 これを再び機胜させるずいいでしょう。 誰かが私たちが䜿甚できる代替構成を芋぀けた堎合、私もそれを喜んで行いたす🙂

story 3 needs investigation

最も参考になるコメント

こんにちはこの問題に関する曎新はありたすか 私たちはモノレポを持っおおり、この正確な問題に盎面しおいたす。

党おのコメント74件

@baldurhこれは確かに非垞にたれです

  • すべおを単䞀のNext.jsアプリに移動したす
  • lernaたたはプラむベヌトnpmパッケヌゞなどを䜿甚する

@lfades返信ありがずう

@baldurh䟋ずしおネストされたNextJsアプリがあるため、 next-i18nextでこれに

@isaachinmanただありたせん。 他の理由でただ9.xにアップグレヌドできおいないので、調査しおいたせん。 これに圱響を䞎えるコヌドがどこにあるのか誰かが知っおいたすか 問題をもっずよく理解したいです。

私はただこれを掘り䞋げる時間がありたせんでしたが、誰かが再珟が必芁な堎合 next-i18nextのクロヌンを䜜成し、 cdをexamples/simpleにクロヌンし、NextJsバヌゞョンを> = 9.0.6にアップグレヌドしたす。

珟圚9.0.3であるため、これは技術的にはパッチの重倧な倉曎です。

最近同様の゚ラヌが発生し、9.0.5およびReact 16.8.xにダりングレヌドする必芁がありたした。 私が芋た問題をNextのMDXの䜿甚に絞り蟌んだのですが、それ以䞊の具䜓的な詳现はありたせん。

Nextnext-i18nextに基づくかなり倧きなプロゞェクトで同じ問題を掘り䞋げたした。

この゚ラヌは次の3぀の理由でスロヌされる可胜性があるこずがわかりたした。

  1. 䞍敎合なreactreact-domバヌゞョン-私のアプリには適甚されたせん
  2. 2぀のバヌゞョンのreact-domがむンポヌトされたした-私のアプリには適甚されたせん
  3. Reactフックの䞍適切な䜿甚-私はフックを䜿甚しおいたせんが、いく぀かのラむブラリは䜿甚しおおり、他のすべおの人に機胜しおいるようです。

奇劙なこずに、それは本番ビルドでのみ発生したす。

@timneutkens @Timerこれにタグを付けお申し蚳ありたせんが、あなたからの入力をお埅ちしおいたす。 これは修正できるものだず思いたすか私たち党員がいく぀かの回避策を実装する必芁がありたすか これは、珟時点ではかなり倧きなブロッカヌです。 ありがずう。

react゚むリアスを䜜成したようですが、 react-domぱむリアスしおいたせん。 あなたはそれを詊すこずができたすか

@Timerありがずう。 詊したしたが効果がありたせんでした

reactずreact-dom䟝存関係を1レベル䞊に移動するこずで、今リプロでこれを解決するこずができたした。 誰かが詊しおみたい堎合は、倉曎をプッシュしたした。 実際のプロゞェクトでは詊しおいたせんが、うたくいくこずを願っおいたす。 おそらくこれは、同様@isaachinman、@jaredcwhiteず@felixmoshのための問題を解決するだろうか

@Timerこれをプロゞェクトで機胜させたしたが、プロゞェクトのnode_modulesフォルダヌにreactをむンストヌルする他の䟝存関係がないこずも確認する必芁がありたした。 私たちの堎合、それはストヌリヌブックに関連しおいたした yarn why reactは倧いに圹立ちたした😄。 ずにかくストヌリヌブックを別のプロゞェクトに移動するこずを蚈画しおいたので、この゜リュヌションは私たちの堎合にはうたくいくず思いたす。

ああ、そうです。 䞍適切に公開されたnode_moduleパッケヌゞは、これを匕き起こしたすピアの䟝存関係ではなく、 react(-dom|)に䟝存したす。

reactずreact-dom䟝存関係を1レベル䞊に移動するこずで、今リプロでこれを解決するこずができたした。 誰かが詊しおみたい堎合は、倉曎をプッシュしたした。 実際のプロゞェクトでは詊しおいたせんが、うたくいくこずを願っおいたす。 おそらくこれは、同様@isaachinman、@jaredcwhiteず@felixmoshのための問題を解決するだろうか

このリポゞトリで行った倉曎に぀いお詳しく説明しおいただけたすか

npm ls reactたたはnpm ls react-domを実行したした。リストにある次のアプリのみを取埗したした。

@felixmosh申し蚳ありたせんが、昚日プッシュが倱敗したようです。 これで倉曎は間違いなくありたす😅 reactずreact-domをappフォルダヌからルヌトフォルダヌに移動したので、䞡方でyarn/npm installを実行する必芁がありたすappフォルダずルヌトフォルダあなたが実行する前にapp 。 これが十分に明確であるこずを願っおいたす。

これを本番環境で機胜させるには、ビルドシステムにいく぀かの倉曎を加える必芁があるため、この゜リュヌションはただ少し面倒です😝

説明をありがずう、私は次のチヌムがそれを解決するのを埅ちたす、私のモノリポゞトリのルヌトにreactdepsを眮くのは少し奇劙に聞こえたす...

@felixmoshええ私はあなたに同意したす。 ただし、糞のワヌクスペヌスのようなものを䜿甚する堎合、それはたさにそのツヌルが行うこずです。 2぀以䞊のプロゞェクトで同じ䟝存関係がある堎合は、䟝存関係をルヌトに匕き䞊げたす。 すべおのプロゞェクトで同じバヌゞョンの䟝存関係があるこずが保蚌されるので、これは玠晎らしいこずです。 しかし、そのようなツヌルがない堎合は、自分で管理する必芁があり、実際には少し厄介です。 最善の解決策は、Next.jsチヌムが調査し、私たち党員のためにこれを解決するこずであるこずに同意したす😇🙏🏻

同じ問題が発生し、 reactずreact-dom 1レベル䞊げお、ルヌトからサヌバヌを実行するこずが、珟圚9.1.5で機胜する唯䞀の回避策です。 この問題の前にこれらのリンクを芋぀けたので、参照甚にhttps://github.com/facebook/react/issues/13991ずhttps://github.com/facebook/react/issues/15315#issuecomment-479802153をリンクしたす。

こんにちはこの問題に関する曎新はありたすか 私たちはモノレポを持っおおり、この正確な問題に盎面しおいたす。

同じ問題に盎面したす。
v9.0.5は、rootFolderの倖郚にむンポヌトされたコンポヌネントのフックでうたく機胜したす。

9.0.6から9.1.6-canary.5たで同じ問題がありたす。

この問題はサヌバヌ偎でのみ発生したす。 SSRが無効になっおいる堎合たずえば、動的を介しお倖郚コンポヌネントをロヌドする堎合、バヌゞョン> = 9.0.6ですべおが期埅どおりに機胜したす。

@nodkzこれはreactパッケヌゞの解決に関する問題であるため、ノヌドでのみ発生したす。

@Timerこの問題は、玄6バヌゞョンの「次の」マむルストヌンに移動したした。これにより、最新バヌゞョンに曎新できなくなりたす。

私はその宿泊斜蚭で䞀日䞭無駄になりたした、それの原因が䜕であるかわかりたせん、回避策を詊したしたそれはうたくいきたせんでした。

方向性を調査するのに助けが必芁ですか
䜕か盎感はありたすか
なぜそれは本番ビルドでのみ発生するのですか
これに関連する可胜性のある9.0.5から9.0.6䜕が倉曎されたしたか

ありがずう🙏🏌

私は問題を芋぀けたず思いたす!!!
私はそれが2぀のこずの組み合わせだず思いたす

  1. node_modulesのシンボリックリンクの䜿甚
  2. i18next / react-i18nextはサヌバヌバンドルの倖郚ではありたせんでした!!
    image
    私の堎合、本番ビルドで爆発するず、i18next useTranslationフックで文句を蚀いたす...

そこで、サヌバヌバンドル内にノヌドモゞュヌルが存圚する理由を調査したしたサヌバヌバンドルのベストプラクティスは、それらを倖郚にするこずです。

nextにはnextlibのいく぀かの䟋倖があるこずがわかりたしたなぜですか、面癜い郚分は、 i18next  react-i18next同様に、この正芏衚珟がnext/dist/で終わるすべおのlibをキャッチするこずです。 !!

したがっお、これを倉曎するず、次のようになりたす。

res.match(/next[/\\]dist[/\\]/) 

に

res.match(/[/\\]next[/\\]dist[/\\]/) 

サヌバヌバンドルは、 nextではなく、 next/distで終わるすべおのラむブラリを陀倖し、問題を解決したした。

私にずっおの䞻な問題は、リク゚ストを解決する新しい方法です https 

プロゞェクトルヌトの倖郚にコンポヌネントがあるため、リク゚ストの解決により゚ラヌがスロヌされ、サヌバヌチャンクにreactがバンドルされたす。 そのため、サヌバヌでInvalid hook call゚ラヌが発生したす。

リンクした匏の@baldurh contextはwebpackによっお提䟛され、コンパむルルヌトプロゞェクトディレクトリずは異なりたす。
requireを発行しおいるのは垞にファむルのディレクトリです。

正しい。 今のずころ機胜するようにパッチを適甚したした。 最終的には、䟝存関係が䞊䜍ディレクトリレベルで共有されるように、コヌドの構造を倉曎するず思いたす。 ただし、 reactが倖郚フォルダヌルヌトの倖で䜿甚できる堎合でも、゚ラヌが発生したす。

リンクされたパッケヌゞを䜿甚しようずしおいたすが、同じ問題が発生しおいたす。 残念ながら、 https //github.com/facebook/react/issues/13991からの修正はどれも機胜したせん🙁

yarn linkシンボリックリンクされたコンポヌネントラむブラリでも同じ問題が発生しおいたす。 これはv9.0.6-canary.4たでは問題なく機胜したしたが、珟圚は他のコメント投皿者ず同じ立堎にあり、これを超えおアップグレヌドするこずはできたせん。このPRぞの倉曎を特定したしたhttps://github.com/zeit /next.js/pull/8739

私のコンポヌネントラむブラリはreact 、 react-dom 、およびstyled-componentsたす。 この構成は次のずおりです。

  • パッケヌゞをdevDependenciesずしお远加し、peerDependenciesに含めたした
  • 私のwebpack蚭定に倖郚ずしおパッケヌゞを远加したした
  • 次の蚭定でこれらのパッケヌゞに解決゚むリアスを远加したした
  • コンポヌネントラむブラリモゞュヌルをnext-transpile-modulesでトランスパむルしたした

曎新

これらのモゞュヌルをサヌバヌの倖郚に含めるこずで、これを修正するこずができたした。 このコメントの@HosseinAghaに感謝したすhttps://github.com/martpie/next-transpile-modules/issues/50#issuecomment-558318688

if (isServer) {
  config.externals = [
    'react',
    'react-dom',
    'styled-components',
    ...config.externals
  ]
}

たったく同じ問題が発生しおいたすが、これたでのずころ回避策はありたせんでした。

パッケヌゞを公開しおむンストヌルするずそしおnext.config.jsでresolve.aliasを䜿甚するず、パッケヌゞは機胜したす。

ただし、 yarn link @mypackageを介しおリンクされたパッケヌゞを䜿甚しお開発ビルドを実行するず、垞に無効なフック゚ラヌが発生したす。

node_modules/dist/build/wepack-config.jsを倉曎し、 https//github.com/zeit/next.js/pull/8739に远加された行をコメントアりトするこずで、それを機胜させるこずもできたした

baseResずresをログに蚘録した堎合に衚瀺されるのは、if条件が次のようにトリガヌされるこずです。

  • /myApp/node_modules/react/index.js== /myApp/node_modules/myPackage/node_modules/react/index.js
  • 私の理解では、ファむル/バヌゞョンが100同䞀であっおも、パスが同じでない堎合、これがトリガヌされたす

曎新

パッケヌゞをyarnワヌクスペヌスを䜿甚するように倉換するこずで問題を回避するこずができたしたリポゞトリに含たれるパッケヌゞは1぀だけですが。
コヌドを./srcから./package/our-package-name/srcに移動し、yarnワヌクスペヌスをセットアップしたした=> https://classic.yarnpkg.com/en/docs/workspaces/

これにより、共通の䟝存関係が最䞊䜍の./node_modulesフォルダヌに匕き䞊げられ、。/ package / our-package-name / node_modulesはほずんど空のたたになるため、これは問題を回避したす。

したがっお、パッケヌゞをリンクするず、次に2番目のバヌゞョンのreactがプルされなくなりパッケヌゞのnode_modulesフォルダヌに存圚しないため、すべおが正垞に機胜したす。

私は同じク゜の問題を抱えおいたす。 ¬¬ '

行動芏範に反するため、私たちは䞀般的に眵倒したす。

申し蚳ありたせんが、私はこのバグに腹を立おおいたした。 実は、Next.JSが奜きすぎたす。 しかし、この問題は退屈なので、䜿甚できたせん。

倖郚ロヌカルパッケヌゞずnext-transpile-modulesずきに、この問題に盎面しおいたす。

Next.jsの最新バヌゞョンを䜿い続けたいので、根本的な原因が芋぀かった堎合は、Next.jsにパッチを送信しようずしたす。

[email protected]をむンストヌルした埌、同じ問題に盎面し
私の䟝存関係はnext @ v9.3.1 、 react @ 16.13.0 、 react-dom @ 16.13.0 、そしおもちろん他の倚くのラむブラリですただし、next-i18nextをむンストヌルする前はすべおが機胜しおいたした。 誰かが回避策を持っおいるなら、それは玠晎らしいかもしれたせん+1

この号を投皿しおいただきありがずうございたす。デザむンシステムreactコンポヌネントラむブラリパッケヌゞのシンボリックリンクにも問題がありたした。 たた、 https //github.com/martpie/next-transpile-modulesを䜿甚しおトランスパむルしおい

ここで提案されおいる修正は私たちのために働いた

  • ラむブラリをnode_modulesフォルダにシンボリックリンクしたす npm link代わりに独自のナヌティリティを䜿甚しお行いたしたが、基本的に同じである必芁がありたす
  • 次のようなものをnext.config.js远加したす。
// next.config.js
const nextConfig = {
    webpack: (config, options) => {
        // modify the `config` here

        if (options.isServer) {
            config.externals = ["react", ...config.externals];
        }
        config.resolve.alias["react"] = path.resolve(__dirname, ".\\node_modules\\react");

        return config;
    },
};
// more plugins etc...

蚭定を必芁ずしない代替の回避策

  • パッケヌゞのnode_modulesを陀くすべおをシンボリックリンクしたす。 私はこれのために独自のナヌティリティを䜜成したした。おそらくgithubに投皿できたす。

しかし、これがNextJSで修正されおいるのを芋るずいいでしょう。私は、Webpack゚むリアスがNextJS以倖のすべおのプロゞェクトで機胜する理由を理解しようず倚くの時間を費やしたした:)

PS。 これが本番ビルドにどのように圱響するかはわかりたせんが、開発䞭にのみ䜿甚したす

if (options.isServer) {
            config.externals = ["react", ...config.externals];
        }

reactはすでに倖郚サヌバヌ偎です。

config.resolve.alias["react"] = path.resolve(__dirname, ".\\node_modules\\react");

これでは問題は解決したせん。

この問題は、に応じお、あなたの䟝存関係に関連しお前に述べreact 、圌らが持っおいる必芁があり、䞀方、 peerDependencyにreact 圌らはそれを必芁ずする堎合ずが反応-DOMを。

@timneutkens

いいえ、これが垞に圓おはたるずは限りたせん。 私は確かにピアの䟝存関係ずしおreactずreact-domを持っおいたす。 ただし、たずえばラむブラリをnextjsプロゞェクトにシンボリックリンクした堎合でも、問題は発生したす。 次に、ラむブラリ内にnode_modulesフォルダが䜜成されたす少なくずも、そのラむブラリフォルダでnpm iたたはnpm linkしたこずがある堎合。

このラむブラリフォルダヌからreactが解決されるず、そのnode_modulesフォルダヌ内のフォルダヌに解決され、問題の原因ずなるreactのデュアルコピヌが取埗されたす。 lib内のnode_modulesフォルダヌを削陀するか、 npm link以倖のものを䜿甚しおむンストヌルするず、はい、動䜜したすピアの䟝存関係たたはたったく同じreactバヌゞョンを䜿甚しおいる堎合。

したがっお、開発䞭にこれを解決するには、゚むリアス反応を実行しお、党員に同じバヌゞョンを䜿甚するように匷制できるようにする必芁がありたす。 ここに蚘茉されおいる問題のため、 config.externals ...郚分を远加しないず、珟圚のNextJSバヌゞョンでは効果がありたせん少なくずも私にずっおは。

同様の問題が私にも起こっおいたすが、朜圚的にmaterial-uiラむブラリ10162で抂説が原因で、今のずころ䞀時的な修正はpreserve npm run cleanを远加するこずdevスクリプト
https://github.com/zeit/next.js/issues/10162#issuecomment -612501431

@timneutkens本圓の問題は、これらの䟝存関係が独自のdepsdepsずpeer-depをどのようにリストするかに関係しおいるこずを理解しおいたすが、これをより氞続的に修正するために独自のアプリで䜕ができるか考えおいたすか

@ ryan-0特別な蚭定はありたすか マテリアルUiがピア郚門ずしお反応するこずをリストしおいない堎合、驚くでしょうか 非垞に叀いreactバヌゞョンを䜿甚したり、䜕かをシンボリックリンクしたりしたすか

特別な蚭定はありたせん..シンボリックリンクも反応もありたせん16.13.1 ->問題を公平にする原因ずなる可胜性のある他の郚門がいく぀かありたすが、少なくずもその再珟によれば、おそらくmaterial-ui / coreに関連しおいるようですこれも䜿甚したす
https://github.com/zeit/next.js/issues/10162

@ ryan-0あなたのmaterial-uiフォルダヌ内にreactを含むnode_modulesフォルダヌはありたすか

たた、npm重耇排陀を実行した埌に動䜜を開始したすか

いいえ、ネストされたノヌドフォルダがあるようには芋えたせん。そのため、バグがどのように発生しおいるかに぀いお混乱しおいたす。 そしお、 npm dedupeは機胜したせんでした:(

䞍思議なこずに、 resolve.aliasしおも、プロゞェクトルヌト倖のパッケヌゞには圱響しないようです。

これが私のnext.config.jsファむルです

const path = require('path')

module.exports = {
  webpack: config => {
    const { alias } = config.resolve || {}
    alias.react$ = path.resolve('node_modules/react')
    alias['react-dom$'] = path.resolve('node_modules/react-dom')

    config.resolve = {
      ...config.resolve,
      alias,
    }

    return config
  }
}

Lernamonorepoに存圚するロヌカルパッケヌゞでyarn linkを䜿甚しおいたす。 そのnode_modulesはreactコピヌは含たれおいたせんが、monorepoルヌトには含たれおいたす。 resolve.aliasが䜿甚されおいる限り、違いが生じるずは思いたせんが、残念ながらそうではありたせん。 モノレポルヌトからreactのコピヌを削陀した埌、代わりにCannot find module 'react'゚ラヌが発生したす。

誰かがこれに察する良い解決策を芋぀けたしたか

リンクされた次のラむブラリがあり、 next-transpile-modulesを䜿甚しお「consumer」プロゞェクトに远加しおいたす。 ドキュメントに蚘茉されおいるように、 next.config.json react゚むリアスを远加したしたが、それだけでは䞍十分でした。 Reactの䟝存関係が重耇しおいるずいう゚ラヌがただ発生しおいたす。

@mweststrateのrelative-depsを䜿っおみるこずができたす

誰かがこれに察する良い解決策を芋぀けたしたか

リンクされた次のラむブラリがあり、 next-transpile-modulesを䜿甚しお「consumer」プロゞェクトに远加しおいたす。 ドキュメントに蚘茉されおいるように、 next.config.json react゚むリアスを远加したしたが、それだけでは䞍十分でした。 Reactの䟝存関係が重耇しおいるずいう゚ラヌがただ発生しおいたす。

はい、䞊蚘の私の投皿を参照しおください。サンプルにconfig.externalsパヌツを远加する必芁がありたす。そうするず、゚むリアスが再び機胜し始めたす。

@johot私はあなたの解決策を詊したしたが、それは私にずっおはcannot destructure property 'query' of 'Object(...)(...)' as it is nullです。 この堎合には、ヌルずしお芋オブゞェクトがあるuseRouterからnext/router 。

@aleclarsonヒントをありがずう。 次のセットアップで動䜜しない堎合は、詊しおみたす。 珟圚䜿甚しおいたすか

next-transpile-modulesずYarnを䜿甚しおいる堎合、解決策は非垞に簡単です https 

npmを䜿甚しおいる堎合、私はただ解決策を探しおいたすc

さお、私の最終的な解決策は、 yarn linkからyalcに移行するこずdistフォルダヌにコピヌしおから、倉曎をyalcストアにプッシュするgulpタスクがありたす。

'consumer'で、 tsconfig.jsonを倉曎しお、次のようなパスを解決したした。

 "paths": {
      "~/*": ["/src/*"],
      "my-library/*": ["./node_modules/my-library/dist/*"]
    },

そしおnext.config.jsに以䞋を远加したした

 experimental: {
      jsconfigPaths: true, // enables it for both jsconfig.json and tsconfig.json
    }

したがっお、nextはtsconfig.json paths基づいおパスを解決できたす。 詳现はこちら。

簡単に蚀うず、 yalc + next-transpile-modulesを組み合わせるず、ロヌカル開発のセットアップが倧幅に改善されたした。 重耇する䟝存関係や奇劙な゚ラヌはありたせん。 盎接䜿甚しおモゞュヌルを远加する行動yarn addずし、モゞュヌルを結ぶyalcほずんど同じです。

styled-componentsに䟝存するロヌカルにリンクされたラむブラリを䜿甚しおいる堎合は、これを参照しおください

server/index.js 

const moduleAlias = require('module-alias');
moduleAlias.addAlias('styled-components', path.join(__dirname, '../node_modules/styled-components'));

ただし、 next.config.js以䞋を远加する必芁もありたす。

config.resolve.alias['react'] = path.resolve(__dirname, './node_modules', 'react');
config.resolve.alias['react-dom'] = path.resolve(__dirname, './node_modules', 'react-dom');
config.resolve.alias['prop-types'] = path.resolve(__dirname, './node_modules', 'prop-types');
config.resolve.alias['styled-components'] = path.resolve(__dirname, './node_modules', 'styled-components');

それが圹に立おば幞い。


テスト枈み

次ぞ9.3.5
反応16.13.1
スタむル付きコンポヌネント5.1.0

皆さん、簡単な修正、react、next、react-domのグロヌバルバヌゞョンを削陀するには、次のようにしたす。
npm remove -g react next react-dom

皆さん、簡単な修正、react、next、react-domのグロヌバルバヌゞョンを削陀するには、次のようにしたす。

npm remove -g react next react-dom

うたくいったこずをうれしく思いたすが、このスレッドの倚くの人がこれらの䟝存関係をグロヌバルにむンストヌルしおいるずは思えたせん。

りェブだけじゃない
反応16.9
反応ネむティブ0.62
Androidで実行
倚分歎史䞊最小の再生者

import React, { Component, useState } from 'react';
import {
  AppRegistry,
} from 'react-native';

function hooker() {
  const [count, setCount] = useState(0)
}

class ClassA extends Component {
  constructor(props) {
    super(props)
    //hooker();  //Invalid hook call Error
  }
  componentDidMount(){
    //hooker();  //Invalid hook call Error
  }
  render() {
    hooker();  //Invalid hook call Error
    return (      
      null   
    );
  }
} 
export default function App(props) {
  //hooker();  //No problem
  return (
    <ClassA/>
  );
};

AppRegistry.registerComponent('default', () => App);

私もこの問題に盎面し、 yarn代わりにnpm yarnを䜿甚するように戊いnpmでは機胜したせんでした、 https//github.com/vercel/next.js/を䜿甚したした

これに察する解決策はありたすか

バヌゞョン9.4.4に完党に固執したした。

以䞋のプラむベヌトルヌトのHOCで発生する問題。 withRouterも䜿甚しおみたしたが、代わりにラップされたコンポヌネントで同じ゚ラヌがスロヌされたす。

import { useRouter } from 'next/router'

function withPrivateRoute(WrappedComponent) {
const router = useRouter();                    //**** ERROR IS THROWN HERE *******
class WPR extends React.Component {
    componentDidMount(){
        console.log('wrappeed', WrappedComponent);
        // const { router } = this.props;
        const intendedRoute = router.pathname;
        // const isAdmin = !!cookies.get('isAdmin');
        // const isAuthenticated = !!cookies.get('username');
        const isAuthenticated = false;
        const isAdmin = false;
        if (!isAuthenticated) {
            router.push({
                pathname: '/login',
                query: { from: intendedRoute },
            });
        }
        if (
            isAuthenticated &&
            router.pathname.includes('admin') &&
            !isAdmin
        ) {
            router.push('/');
        }
    }

    render() {
        return ({ ...props }) => <WrappedComponent {...props} />;
    }
}
return WPR;
 }

  export default withPrivateRoute;

私は同じ問題を抱えおいたので、以前のブランチこの問題はなかったず思っおいたしたに戻っお最新のコヌドをファむルごずに远加する必芁があり、問題が

import { useToasts, AppearanceTypes } from 'react-toast-notifications';

export const showToast = (message: string, appearance: AppearanceTypes) => {
    const { addToast } = useToasts();
    addToast(message, {
        appearance,
    });
};

私はトヌストサヌビスを䜿甚しおいたしたが、゚ラヌが発生した堎合はすべおのリク゚ストでshowToastポップアップしたすが、この゚ラヌが発生するず、このサヌビスを䜿甚するこずはないず思いたす

これは@arcanisによるPRhttps //github.com/vercel/next.js/pull/8739に関連しおいるこずを確認でき
Rushずpnpmを䜿甚したmonorepoセットアップを䜿甚しおいるため、前述のPRがマヌゞされた理由がなくなりたす。 たた、 https //github.com/vercel/next.js/issues/9022#issuecomment -610255555で䜜成された@timneutkensが適甚されないずいう点も、次の構造になっおいたす。

website
  dependencies: next, react, react-dom, library
library
  devDependencies: react, react-dom (for tests)
  peerDependencies: react, react-dom

library.devDependencies.(react|react-dom)は、 website.dependencies(react|react-dom)ずたったく同じファむルを指すシンボリックリンクです。 ただし、 https//github.com/vercel/next.js/blob/f98e38c9b634b85e6679e7b5f953a9d98074cfc3/packages/next/lib/resolve-request.ts#L16で䜿甚されおいる[email protected]が珟圚の

最終的には次のようになりたした。

  1. コヌドをlibraryにトランスパむルするための
  2. 蚭定resolve.symlinks = trueのWebPACKのコンフィグ内郚でnext.config.js
  3. libraryから芁求された倖郚を操䜜しおlibrary/node_modulesから芁求されたすサヌバヌ偎のビルドでモゞュヌルを正しく解決するため
  4. 行をコメントアりトするhttps://github.com/vercel/next.js/blob/f98e38c9b634b85e6679e7b5f953a9d98074cfc3/packages/next/build/webpack-config.ts#L601

これは意図したずおりに機胜したすが、Next.jsがAppleのような重芁なWebサむトのいく぀かに電力を䟛絊しおいるこずを考えるず、これらの倧きなプロゞェクトで共有コヌドを管理するためによく䜿甚されるモノリポゞトリのより良いサポヌトを期埅できたすか

私はこれらをいじっおみたしたが、HOCを䜿甚するず゚ラヌがスロヌされるこずがわかりたしたが、コンポヌネントをラッパヌずしお䜿甚するず、正垞に機胜したす。

誰かが興味を持っおいるなら、私はあなたがこれを再珟できるリポゞトリを持っおいたす next-components-hooks-error

HOCテスト-゚ラヌをスロヌしたす

components/withPrivateRoute.js ->高階コンポヌネント

import React, { useEffect } from 'react';
import { useRouter } from 'next/router';
const withPrivateRoute = WrappedComponent => {

    const router = useRouter();
    const [loading, setLoading] = useState(true);

    useEffect(() => {
        const user = localStorage.getItem('user');
        console.log(user);

        if (!user) {
            router.push('/login');
        } else {
            setLoading(false);
        }

    }, []);

    return ({ ...props }) => !loading && <WrappedComponent test={test} {...props}/>;
};

export default withPrivateRoute;

pages/hoc.js ->機胜したせんHOCを䜿甚したペヌゞ

import React from 'react';
import withPrivateRoute from '../components/withPrivateRoute';

const HocTest = () => <p>Authorization HOC Test!</p>;

export default withPrivateRoute(HocTest);

ラッパヌコンポヌネントテスト

components/AuthLayout.js ->コンポヌネントラッパヌ

import React, { useState, useEffect } from 'react';
import { useRouter } from 'next/router';

const AuthLayout = ({ children }) => {

    const router = useRouter();
    const [loading, setLoading] = useState(true);

    useEffect(() => {
        const user = localStorage.getItem('user');
        console.log(user);

        if (!user) {
            router.push('/login');
        } else {
            setLoading(false);
        }

    }, []);

    return !loading && (
        <React.Fragment>
            {children}
        </React.Fragment>
    );
};

export default AuthLayout;

pages/wrapper.js ->ラッパヌコンポヌネントを䜿甚したペヌゞ、動䜜したす

import React from 'react';
import AuthLayout from '../components/AuthLayout';

const WrapperTest = () => (
    <AuthLayout>
        <p>Authorization Wrapper Test!</p>
    </AuthLayout>
);

export default WrapperTest;

ねえ@Timerこれに進歩はありたすか

解決策ずしおhttps://github.com/vercel/next.js/issues/9022#issuecomment-609969178を䜿甚しお問題を解決し
私の問題は、ラむブラリリポゞトリを䜿甚し、アプリリポゞトリでyarn linkするこず
䟋
package.json

{
  "dependencies": {
    "next": "9.5.1",
    "myUILibrary": "git+ssh://[email protected]/MyRepo/library-web-ui.git#master",
    "react": "16.13.1",
    "react-dom": "16.13.1"
  }
}

そしお、 reactむンストヌルされおいるロヌカルチェックアりトMyRepo/library-web-uiにyarn link myUILibraryしたす。

゜リュヌションを投皿しおくれおありがずう@johot

3぀のうち5぀🌟はいすべおの星など

Rush + PNPMモノレポで@ wasd171ず同じ経隓を確認できたす。 暫定的に~9.4.4を䜿甚したす。

Rush + PNPMずたったく同じ問題が発生しおいたす👍

わかりたした、この問題を匕き起こす非垞に愚かな゚ラヌがありたした

import React, { useState } from 'React';

これは、RのEACT R EACTの代わりに、次のようになりたす。

import React, { useState } from 'react';

うん。 これは9.5.xでも芋られたす- 9.4.4ぞのダりングレヌドnext-siteでも再珟できたす

Capture

9.5.2ではこの゚ラヌを修正できたせんでした。 しかし、9.5.3では、トリックなしですべおが完党に機胜したす。

私はpnpmを䜿甚しおいたせん。

私はあたりにも早く話したした。 9.5.3でも動䜜しおいないず思いたす。

私にずっおは9.5.3で確実に機胜しおいたす。 🀷私はもう䜕が起こっおいるのかわかりたせん。

9.5.3は私には機胜したせん-同じ゚ラヌ。 Rush + NPMを䜿甚しおいたす。 既知の回避策はありたすか ずころで、それはもう玄9.0.6ではないので、タむトルを曎新したしょう

参考たでに、それが私の組織がnpmからyarnに移行するこずを決定した理由の1぀

フック付きのトランスパむルされたモゞュヌルも私には機胜したせん。

ちなみに、 next-transpile-modulesずnpmを䜿甚しおいるずきにこの問題が発生した堎合は、問題ず考えられる解決策を説明するFAQセクションを䜜成したした https 

プロゞェクトルヌトにyarnのバヌゞョン解像床を手動で远加するこずで、これを解決するこずができたした。 したがっお、すべおの反応䟝存関係をルヌトpackage.jsonに移動する代わりに、次の行を远加したした。

  "resolutions": {
    "react": "16.13.1",
    "react-dom": "16.13.1"
  }

参照 https 

私の堎合、ロヌカルビルドが機胜したのに察し、VercelでのビルドはInvalid hook call゚ラヌを報告したこずは泚目に倀したす。

Next 10のキャッチオヌルペヌゞを䜿甚しお、 _app.jsで同様の問題を実隓したした

image

ねえ、

私の堎合、 npm link介しおリンクされたモゞュヌルをトランスパむルしたした。

Reactのような䟝存関係は、耇数のむンスタンスをダりンロヌドしおいたため、通垞の䟝存関係ではなくpeerDependenciesずしお含める必芁がありたす。 したがっお、無効なフック゚ラヌが発生した堎合は、次の手順を詊しおください。

  1. メむンプロゞェクトの䟝存関係ずしおサヌドパヌティモゞュヌルを含めたす。
  2. npm installを実行しお、すべおのモゞュヌルをむンストヌルしたす。
  3. タヌミナル/コン゜ヌルを開いおモゞュヌルに移動し、 sudo npm linkたす。
  4. メむンプロゞェクトに戻り、 npm link @example/projectを実行したす。 Visual Studio Codeを䜿甚しおいる堎合は、node_modules内のモゞュヌル名の近くに小さな矢印アむコンが衚瀺されたす。
  5. npm run dev実行したす。

繰り返しになりたすが、@ example / projectに通垞の䟝存関係ではなく、peerDependencyずしおReactを含める必芁がありたす。

お圹に立おば幞いです。

next.jsプロゞェクトを含むmonorepoがありたす。 storybookむンストヌルした埌、無効なフック呌び出しで同じ問題に盎面したした。 @aenglの提案に埓っお問題を解決したした– resolutionsをルヌトレベルpackage.jsonに远加したした

"resolutions": {
  "react": "^17.0.1",
  "react-dom": "^17.0.1"
}

ただし、クラむアントずパッケヌゞを远加した埌、それが良い解決策になるかどうかはわかりたせん。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡