🍇
日本語を綺麗に表示できるBudouXをNextJS 14で使ってみた
NextJS / Typescript環境で長い日本語文字列をうまく改行して表示したくてBudouXを導入した
環境
- NextJS: 14.1.0
- budoux: ^0.6.2
install
pnpm i budoux
usage
BudouXで日本語文字列をparseすると、フレーズのArrayが返ってくる
const parser = loadDefaultJapaneseParser();
console.log(parser.parse('今日は天気です。'));
// ['今日は', '天気です。']
なので、日本語文字列をうまくフレーズで改行して表示したければ、適当なタグで囲ってdisplay: inline-block
にすると良い
'use client';
import { useEffect, useState } from "react";
import { loadDefaultJapaneseParser } from "budoux";
export const BudouXText: React.FC<{ text: string }> = ({ text }) => {
const [segments, setSegments] = useState<string[]>([]);
useEffect(() => {
const parser = loadDefaultJapaneseParser();
const parsedSegments = parser.parse(text);
setSegments(parsedSegments);
}, [text]);
return segments.map((s, index) => (
<span className="inline-block" key={index}>
{s}
</span>
));
};
sample
const Page = () => {
return (
<div className="p-2.5 font-sans">
<BudouXText text={text} />
</div>
)
}
useStateやuseEffectで管理しないとwindow is not definedになる
この例のような実装を行うと、internal server errorが発生する
'use client';
import { loadDefaultJapaneseParser } from "budoux";
const parser = loadDefaultJapaneseParser();
export const useBudouX = () => {
const parse = (text: string) => {
return parser.parse(text).map((s, index) => (
<span className="inline-block" key={index}>
{s}
</span>
));
};
return {
parse,
};
};
const {parse} = useBuoudX
return (<div>parse("sampleLongText")</div>)
⨯ ../node_modules/budoux/module/win.js (19:19) @ window
⨯ ReferenceError: window is not defined
どうやらBudouXが内部的にwindowオブジェクトを参照しているようだ
‘use client’を指定するだけでは解決しなかったので面倒になってコンポーネント化した。
他の方法で使えないの?
BudouXにはWebコンポーネントとして使う方法や、word-break: “auto-phrase”を使う方法など様々な方法で適用することができる。
NextJSで使うとなった時にword-break: “auto-phrase”(2023/10リリース)を指定できればベストだったのだが、NextJSはまだサポートしていなさそうだったので断念
Discussion