概要

Next.js for Drupalのv2.0.0が2025/2/11にリリースされました。

https://next-drupal.org/

https://next-drupal.org/blog/next-drupal-2-0

早速試してみたところ、BASE_PATHの取り扱いについて対応が必要だったので、備忘録です。

環境変数

環境変数のサンプルは以下のようになっています。

##NN#DD#DEERRRSRXXAUURUeeTTuPPePeq__tAAqAuPIhLLuLhiUMe__i_trBAnCCrRteLGtLLeEpdIEiIIdVsC_cEEA:_DaNNfL/DOtTToI/RMi__rDnUAoISAePInDEOTxAN=CnEtL=RR-_-_seEdSdBitTeErAtr=mCuSeiRaRpE.eenEa_evtdTlUxer=.RaiRRoLmteeer=phvvtghliear/teslidt.tieopcfhdvcsoriaes:most//mite/fohns/rniviaositdmremfo.i/rnenaomx/dmeacmnmoi/tpnna-lf/dveicma.gircnniosf/ameicbrgolv/neisfsceiergs//iscceoernsvs/iuccmoeensrs/unmeexrt

この時、NEXT_PUBLIC_DRUPAL_BASE_URLhttps://site.example.com/xxxのようなベースパスを含めた形で指定すると、APIのリクエストはhttps://site.example.com/jsonapi/などに送られ、リソースを正しく取得できませんでした。

原因

エラーが発生しているgetResourceCollectionを確認したところ、問い合わせ先のURLを作成するbuildUrl関数において、new URL(path, this.baseUrl);が使用されていました。

baaussi}y}}y}lnndcc)i}rclps=ci}rco}c}tc}a)crUoo;feoaeofe.p;o)ho)w;oernnsutbcta{npt`stgtwdnlrs;inwnc;ar"ntlsse(ruuahr}s(au$eoeiiesoeessieaieEsu(ttaslrilc)tptr{aStotstcsa.ttxctsrtrpHre.nle=hahnlrtRnheoaordhthprnausacasdP{ltocresArpelucerA:etoojtrenhreuE="aoh=tchisuitnerhbeu:hnrsohladPcarn"rchaPno=taid:cPustoisop,rlahrld",aa&`ilaguhlopeagphposewnt=cer)c;p"ml&/ser(r{:inooTr(o:tp.,hishaho,se$.Sa)czsipya`nitti=oenDm{iS!{bem;etentpmFsooihlnae=rs=neppugsCh:tieseepnoreasrwutgaaimoio::ttsnow.c(p&s(mttlelst=nc=i.swfadhUa&t{ehhdnl.rstohon.IeiePRlrn.}Utewua?ypianecfttsaLJtits`r}ciew.ptnwsxaJcer(synt;l$tt,aleiga.tcshrrapopg=a({ihio,oiw,hoieimaneirtoAtcnrtiennsastAoflthnuasetEgpl)hpfyosi(ttl?sthroi,i(cWsthhe.ohArrnz{Pssai.y,ipuiuoesetaeeltaps!arstrsehraaehpe.=rc.hso.?iarr(i,b=aef,(ujsmcc?"Pumerst.shh/roiosctcohbP)`"eplpoceniaoa;/)ftdtlh(ssbr$)iiEil(c).eja{xonoeeo;dUeml{}ndncnlercso$spstdlsltc{)o?ipee)s=api.oocr;.=la{ndniti=ettenia}h(fotol"`}{af,nio`u:zb:,lt{ejty"(e"Lpjc"oest;co"a$nl{)&et&y:?p"ejgo}sep.ott`nQi);uo;enrsy.Olbojceaclte":inosiedar0c,hParams?searchParams.getQueryObject():searchParams

ChatGPTに質問したところ、以下の回答が得られました。

new URL(path, this.baseUrl) を使用すると、path が絶対パス(/jsonapi など)だった場合、baseUrl のホスト部分のみが適用され、/xxx などのパスプレフィックスが無視されてしまいます。そのため、APIリクエストが /jsonapi/ に送信され、本来の https://site.example.com/xxx/jsonapi/ には届かなくなります。

対策

ChatGPTにより、patch-package を使う方法が提案されました。以下、その回答です。


patch-package を使うと、node_modules 内のファイルにパッチを適用し、変更を維持できます。

手順

  • patch-package をインストール
npminstallpatch-packagepostinstall-postinstall
  • package.jsonscripts に以下を追加
"}sc"rpiopsttsi"n:st{all":"patch-package"
  • node_modules/next-drupal/dist/index.js を直接編集(すでに変更済みの場合、このままでOK)
bui}ldcc)i}rUoo;fernnsutlsse(ru(ttaslrpHre.nausacastrenhreuhladPcar,rlahrl=cer)c;shahenDm{ae=rs=rwuc(p&shUa&tPRlraLJtir(syna"opgm/neisxAof)xpfyxi({"Pssaee+raaarrpmccashhtP)hoa;,brjatemhcsitss=..=b=as"eoUbrjle)c;t"&&"getQueryObject"insearchParams?searchParams.getQueryObject():searchParams
  • パッチを作成
npxpatch-packagenext-drupal

patches/next-drupal+<version>.patch というファイルが作成される。

  • これで、npm install をしても postinstall スクリプトが自動的にパッチを適用してくれる。

まとめ

上記の対策により、Next.js 15のApp RouterとDrupal 11で、やりとりを行うことができました。

他にも良い方法があるかと思いますが、参考になりましたら幸いです。