■前提
React用の公式ドキュメント(https://fullcalendar.io/docs/react)通りに構築しようとすると、
Global CSS cannot be imported from within node_modules.
というエラーが生じて、ハマってしまう。
エラーの理由はNext.jsでは、node_modules内のファイルからcssをimportすることは禁止されているにもかかわらず、下図のようにimportされてしまっているため。(参考:https://github.com/vercel/next.js/blob/master/errors/css-npm.md)
node_modules > @fullcalendar > common > main.js
import './main.css';
import { __assign, __spreadArrays, __extends } from 'tslib';
import { createContext, Component, createRef, createElement, Fragment } from './vdom.js';
export * from './vdom.js';
・・・
■手順
上記前提を踏まえた上で、下記手順で実装していく
・プロジェクトの作成
npx create next-app --text-app
・フルカレンダーのライブラリをインストール
npm install @fullcalendar/react @fullcalendar/daygrid
・カレンダー用のコンポーネントを作成(Calendar.jsx)
import FullCalendar from "@fullcalendar/react"; import dayGridPlugin from "@fullcalendar/daygrid"; const Calendar = () => ( <FullCalendar plugins={[dayGridPlugin]} initialEvents={[{ title: "initial event", start: new Date() }]} /> ); export default Calendar;
・next-transpile-modulesを使ってESMで書かれているFullCalendarをトランスパイルできるようにする
npm install next-transpile-modules@^4.1.0
・next.config.jsを作成する(中身は以下)
const withTM = require("next-transpile-modules")(["@fullcalendar"]);
module.exports = withTM({});
・babel-plugin-transform-require-ignoreをインストールしbabel.config.jsを作成する(中身は以下)
ざっくりとした内容としては、
.node_modules"
内のファイルから .css
をインポートしている部分を削除するための記述です
module.exports = {
presets: ["next/babel"],
overrides: [
{
include: ["./node_modules"],
plugins: [
[
"babel-plugin-transform-require-ignore",
{
extensions: [".css"],
},
],
],
},
],
};
・カレンダー用のコンポーネントを作成(Calendar.jsx)にcssを読み込ませる
import FullCalendar from "@fullcalendar/react";
import dayGridPlugin from "@fullcalendar/daygrid";
import '@fullcalendar/common/main.css' import '@fullcalendar/daygrid/main.css'const Calendar = () => (
<FullCalendar
plugins={[dayGridPlugin]}
initialEvents={[{ title: "initial event", start: new Date() }]}
/>
);
・ビルド
npm run dev
・うまく表示されます

参考:https://qiita.com/yk2220s/items/8ed4d781412f6c4e9c45
コメント