Подключить свою библиотеку React-компонентов к приложению Next
Есть библиотека с компонентами написанными на TypeScript+SASS. Сборка выполняется вебпаком (конфиг ниже). Подключаем в основной проект на Next через npm link. Всё работает хорошо, пока не подключаю лоадеры вебпака для стилей. Обычный style-loader провоциорует ошибку Reference Error: document is undefined по причине того, что приложение Next рендерит страницу дважды и на первом этапе это проиходит на сервере. Использовал плагин MiniExtractCssPlugin, но как готовый main.css подключить к проекту я не понял. Поскольку он в выходной директории сборки, пытался в основном проекте import 'ui-lib/main.css', но оно его не нашло. В процессе решение проблемы путём гуглежа натыкался на ошибки типа window is undefined и publicPath is not supported by this browser.
Примерная струкутра бибилиотеки:
- src/
components/ - папка со всеми компонентами
button/
- index.tsx - компонент
- index.module.scss - модуль со стилями
index.ts - файл с импортов всех компонентов их экспортом обьекта с ними.
- конфиги
Как можно реализовать корректное подключение библиотеки компонентов к Next-приложению со всеми стилями и, желательно, не сломать возможность подключения к обычным CRA/React-приложениям?
Конфиг вебпака:
const path = require('path');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
mode: 'production',
target: 'web',
entry: './src/index.ts',
output: {
filename: 'index.js',
path: path.resolve(__dirname, 'dist'),
clean: true,
libraryTarget: 'umd',
umdNamedDefine: true,
globalObject: 'this',
},
resolve: {
extensions: ['.ts', '.tsx'],
},
externals: {
react: 'react',
//next: 'next',
},
plugins: [new MiniCssExtractPlugin({ // Не разобрался как его выхлоп подключить в основной проект
filename: "[name].css",
chunkFilename: "[id].css",
})],
module: {
rules: [
{
test: /\.scss/,
use: ['style-loader', { loader: "css-loader", options: { modules: true } }, 'sass-loader'],
exclude: /node_modules/,
},
{
test: /\.(ts|tsx)?$/,
use: ['ts-loader'],
exclude: /node_modules/,
}
],
},
};