Adobe Fontsで日本語フォントをWebフォントとして使おうとすると、
<script> (function(d) { var config = { kitId: 'XXXXXXX', scriptTimeout: 3000, async: true }, h=d.documentElement,t=setTimeout(function(){h.className=h.className.replace(/\bwf-loading\b/g,"")+" wf-inactive";},config.scriptTimeout),tk=d.createElement("script"),f=false,s=d.getElementsByTagName("script")[0],a;h.className+=" wf-loading";tk.src='https://use.typekit.net/'+config.kitId+'.js';tk.async=true;tk.onload=tk.onreadystatechange=function(){a=this.readyState;if(f||a&&a!="complete"&&a!="loaded")return;f=true;clearTimeout(t);try{Typekit.load(config)}catch(e){}};s.parentNode.insertBefore(tk,s) })(document); </script>
というscriptを埋め込むように指示されます。
Next.jsで使う場合、いろいろ方法はありますが、
dangerouslySetInnerHTMLとnext/headを使い、
<Head> <script dangerouslySetInnerHTML={{ __html: ` (function(d) { var config = { kitId: 'XXXXXXX', scriptTimeout: 3000, async: true }, h=d.documentElement,t=setTimeout(function(){h.className=h.className.replace(/\bwf-loading\b/g,"")+" wf-inactive";},config.scriptTimeout),tk=d.createElement("script"),f=false,s=d.getElementsByTagName("script")[0],a;h.className+=" wf-loading";tk.src='https://use.typekit.net/'+config.kitId+'.js';tk.async=true;tk.onload=tk.onreadystatechange=function(){a=this.readyState;if(f||a&&a!="complete"&&a!="loaded")return;f=true;clearTimeout(t);try{Typekit.load(config)}catch(e){}};s.parentNode.insertBefore(tk,s) })(document); ` }} /> </Head>
という感じで埋め込むのが簡単だと思いました。
追記
3年半ぶりに、Next.js(14.2.4)のAppRouterでAdobe Fontsを使おうと思ったのですが、next/headを使うとうまくいかず、
<head> <script dangerouslySetInnerHTML={{ __html: ` (function(d) { var config = { kitId: 'XXXXXXX', scriptTimeout: 3000, async: true }, h=d.documentElement,t=setTimeout(function(){h.className=h.className.replace(/\bwf-loading\b/g,"")+" wf-inactive";},config.scriptTimeout),tk=d.createElement("script"),f=false,s=d.getElementsByTagName("script")[0],a;h.className+=" wf-loading";tk.src='https://use.typekit.net/'+config.kitId+'.js';tk.async=true;tk.onload=tk.onreadystatechange=function(){a=this.readyState;if(f||a&&a!="complete"&&a!="loaded")return;f=true;clearTimeout(t);try{Typekit.load(config)}catch(e){}};s.parentNode.insertBefore(tk,s) })(document); ` }} /> </head>
headを使って対応したところ、うまくいきました。
また、それでもうまくいかない場合は、
'use client'; import { useEffect } from 'react'; declare global { interface Window { Typekit: { load: (config: { kitId: string }) => void; }; } } export function AdobeFont() { useEffect(() => { ((d: Document) => { const config = { kitId: `${process.env.NEXT_PUBLIC_KIT_ID}`, scriptTimeout: 3000, async: true, }; const h = d.documentElement; const t = setTimeout(() => { h.className = `${h.className.replace(/\bwf-loading\b/g, '')} wf-inactive`; }, config.scriptTimeout); const tk = d.createElement('script'); h.className += 'wf-loading'; tk.src = `https://use.typekit.net/${config.kitId}.js`; tk.async = true; tk.onload = () => { clearTimeout(t); try { (window as Window).Typekit.load(config); } catch (e) {} }; tk.onerror = () => { clearTimeout(t); }; const s = d.getElementsByTagName('script')[0]; if (s.parentNode) { s.parentNode.insertBefore(tk, s); } })(document); }, []); return null; }
と、クライアントコンポーネントを作って読み込めばうまくいきました。