#reactjs #next.js #semantic-ui-react
#reactjs #next.js #семантический-пользовательский интерфейс-реагировать
Вопрос:
Я использую Next.js и хочу добавить react-semantic-ui, чтобы использовать один из их компонентов для входа.
Во внешнем интерфейсе я получаю эту ошибку: Не удалось скомпилировать
./node_modules/semantic-ui-css/semantic.min.css
ModuleParseError: Module parse failed: Unexpected character '' (1:0)
You may need an appropriate loader to handle this file type.
(Source code omitted for this binary file)
Это компонент входа в систему:
import React from 'react'
import { Button, Form, Grid, Header, Image, Message, Segment } from 'semantic-ui-react'
const Login = () => (
/* login JSX markup */
)
export default Login
Это мой next.config.js
module.exports = {
webpack: (config, { dev }) => {
config.module.rules.push(
{
test: /.css$/,
loader: 'style-loader!css-loader'
},
{
test: /.s[a|c]ss$/,
loader: 'sass-loader!style-loader!css-loader'
},
{
test: /.(png|svg|eot|otf|ttf|woff|woff2)$/,
use: {
loader: "url-loader",
options: {
limit: 100000,
publicPath: "./",
outputPath: "static/",
name: "[name].[ext]"
}
}
},
{
test: [/.eot$/, /.ttf$/, /.svg$/, /.woff$/, /.woff2$/],
loader: require.resolve('file-loader'),
options: {
name: '/static/media/[name].[hash:8].[ext]'
}
}
)
return config
}
}
const withCSS = require('@zeit/next-css')
module.exports = withCSS()
Это мой package.js
{
"name": "create-next-example-app",
"scripts": {
"dev": "nodemon server/index.js",
"build": "next build",
"start": "NODE_ENV=production node server/index.js"
},
"dependencies": {
"@zeit/next-css": "^1.0.1",
"body-parser": "^1.18.3",
"cors": "^2.8.5",
"express": "^4.16.4",
"mongoose": "^5.4.19",
"morgan": "^1.9.1",
"next": "^8.0.3",
"react": "^16.8.4",
"react-dom": "^16.8.4",
"semantic-ui-css": "^2.4.1",
"semantic-ui-react": "^0.86.0"
},
"devDependencies": {
"css-loader": "^2.1.1",
"file-loader": "^3.0.1",
"node-sass": "^4.11.0",
"nodemon": "^1.18.10",
"sass-loader": "^7.1.0",
"url-loader": "^1.1.2"
}
}
Я где-то читал, что вы должны включить _document.js
в каталог pages.
// _document is only rendered on the server side and not on the client side
// Event handlers like onClick can't be added to this file
// ./pages/_document.js
import Document, { Html, Head, Main, NextScript } from 'next/document';
class MyDocument extends Document {
static async getInitialProps(ctx) {
const initialProps = await Document.getInitialProps(ctx);
return { ...initialProps };
}
render() {
return (
<Html>
<Head>
<link rel='stylesheet'
href='//cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css'
/>
</Head>
<body className="custom_class">
<Main />
<NextScript />
</body>
</Html>
);
}
}
export default MyDocument;
Это действительно так сложно?
Обновить
Существует альтернативный способ заставить это работать. При запуске вашего следующего приложения вы получаете папку компонентов, которая включает в себя head.js
и nav.js
файл.
The head.js в конечном счете файл аналогичен <head></head>
тегу в HTML
. Или я должен сказать, что это то, для чего head.js
компилируется. В любом случае, вы можете просто добавить это туда:
<link
rel="stylesheet"
href="//cdn.jsdelivr.net/npm/semantic-ui@2.4.2/dist/semantic.min.css"
/>
и это сработает.
Но, как я уже сказал, вы все еще не можете импортировать модули следующим образом:
import 'semantic-ui-css/semantic.min.css'
Комментарии:
1. Ваше приложение обычно компилируется с использованием CSS, в котором нет
@import
инструкций?2. @NinoFiliu Он вообще не компилируется….
3. Ошибка может исходить из Webpack. Ознакомьтесь с этой статьей , в которой отлично объясняются загрузчики webpack — что это такое, зачем они нужны и как их использовать. В вашем случае ваша ошибка выглядит так, как будто Webpack обнаружил файл CSS, но у него не было необходимых загрузчиков конфигурации, чтобы «понять» его.
4. @NinoFiliu Спасибо, мой друг, я посмотрю. Бьюсь об заклад, где-то есть место, где вам нужно явно настроить Webpack.
Ответ №1:
На случай, если кто-то использует next-compose-plugins
и получает вышеуказанную ошибку, вот исправление:
const withCSS = require('@zeit/next-css');
const withImages = require('next-images');
const withPlugins = require('next-compose-plugins');
// fix: prevents error when .css files are required by node
if (typeof require !== 'undefined') {
require.extensions['.css'] = (file) => {};
}
const nextConfig = {
target: 'server',
webpack: (config, { dev }) => {
config.module.rules.push({
test: /.(raw)(?v=[0-9].[0-9].[0-9])?$/,
use: 'raw-loader'
});
return config;
}
};
module.exports = withPlugins([withImages, withCSS({target: 'serverless',
webpack (config) {
config.module.rules.push({
test: /.(png|svg|eot|otf|ttf|woff|woff2)$/,
use: {
loader: 'url-loader',
options: {
limit: 8192,
publicPath: '/_next/static/',
outputPath: 'static/',
name: '[name].[ext]'
}
}
})
return config
}})], nextConfig);
Ответ №2:
Похоже, мне пришлось сделать следующее, чтобы заставить это работать:
Меняю мой next.config.js
файл на:
const withCSS = require('@zeit/next-css')
module.exports = withCSS({
webpack: function (config) {
config.module.rules.push({
test: /.(eot|woff|woff2|ttf|svg|png|jpg|gif)$/,
use: {
loader: 'url-loader',
options: {
limit: 100000,
name: '[name].[ext]'
}
}
})
return config
}
})
И выполнение npm i css-loader file-loader url-loader -D
сделало свое дело.
Однако я озадачен тем, зачем css-loader file-loader
нужны? Я привык к конфигурациям webpack, где вы явно добавляете загрузчики (как мы добавляем url-loader
выше)… Мне не нужно было этого делать!