#javascript #webpack #next.js #module.exports
#javascript #webpack #next.js
Вопрос:
Когда я добавляю загрузчик «next-videos» в загрузчик next.config.js
, он работает отлично, пока module.exports
идет последний:
module.exports = withVideos()
С другой стороны, это нарушает другой экземпляр module.exports
того, что находится выше:
module.exports = {
images: {
domains: ['cdn.shopify.com'],
},
};
По сути, он перезаписывает все предыдущие module.exports
. Каковы правила объединения этих экспортных товаров? Я думаю, мне нужно поместить их в один модуль, но каковы правила для этого? Я путаюсь с синтаксисом, и каждая попытка переместить его под один module.exports
заканчивается новыми ошибками
Просто чтобы подвести итог вопросам:
- Каковы правила объединения модулей внутри единого экспорта и как я могу объединить его со всеми моими предыдущими module.exports?
- Действительно ли мне нужно оставить часть «webpack (config)», которая дублирует идентичную часть выше внутри next.config?Я собрал его из разных источников и теперь пытаюсь выяснить, как это действительно работает
webpack(config) {
config.module.rules.push(
Содержание
next.config.js:
const withPlugins = require('next-compose-plugins');
const withSass = require('@zeit/next-sass');
const withCSS = require('@zeit/next-css');
const withImages = require('next-images');
const withVideos = require('next-videos');
const withBundleAnalyzer = require('@next/bundle-analyzer')({
enabled: process.env.ANALYZE === 'true',
});
// next.config.js
module.exports = withPlugins(
[[withImages], [withSass], [withCSS], [withVideos]],
{
plugins: ['postcss-import', 'tailwindcss', 'autoprefixer'],
serverRuntimeConfig: {
mySecret: 'secret',
secondSecret: process.env.SECOND_SECRET, // Pass through env variables
},
publicRuntimeConfig: {
// Will be available on both server and client
staticFolder: '/public',
},
module: {
loaders: [
{
test: /.jsx?$/,
loader: 'babel-loader',
exclude: /node_modules/,
},
{
test: /.css$/,
loader: 'style-loader!css-loader',
},
{
test: /.jsx?$/,
use: ['babel-loader', 'astroturf/loader'],
},
{
test: /.(jpe?g|png|gif|woff|woff2|eot|ttf|svg)(?[a-z0-9=.] )?$/,
loader: 'url-loader?limit=100000',
},
{
test: /.(eot|woff|woff2|otf|ttf|svg|png|jpg|gif|webm)$/,
use: {
loader: 'url-loader',
options: {
limit: 100000,
name: '[name].[ext]',
},
},
},
{
test: /.mp4$/,
use: 'file-loader?name=videos/[name].[ext]',
},
{
test: /.style.js$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: { importLoaders: 1 },
},
{
loader: 'postcss-loader',
options: { parser: 'sugarss', exec: true },
},
],
},
],
},
webpack(config) {
config.module.rules.push(
{
test: /.(eot|woff|woff2|otf|ttf|svg|png|jpg|gif)$/,
use: {
loader: 'url-loader',
options: {
limit: 100000,
name: '[name].[ext]',
},
},
},
{
test: /.style.js$/,
use: [
'style-loader',
'css-loader',
{
loader: 'css-loader',
options: { importLoaders: 1 },
},
{
loader: 'postcss-loader',
options: { parser: 'sugarss', exec: true },
},
],
},
{
test: /.(js|jsx)$/,
exclude: /node_modules/,
use: ['babel-loader', 'eslint-loader'],
},
);
withBundleAnalyzer({});
return config;
},
},
{
images: {
domains: ['cdn.shopify.com'],
},
},
withVideos(),
);
module.exports = {
extends: 'airbnb-base',
rules: {
'arrow-body-style': 0,
},
};
module.exports = {
images: {
domains: ['cdn.shopify.com'],
},
};
module.exports = withVideos();
Ответ №1:
Похоже, вы неправильно смешиваете несколько конфигураций в свой Next.js конфигурационный файл.
С next-compose-plugins
Для начала у вас next.config.js
должен быть только один module.exports
, и, поскольку вы используете next-compose-plugins
, он должен примерно соответствовать этой структуре:
// next.config.js
// Omitting requires for simplicity
module.exports = withPlugins(
[withImages, withSass, withCSS, withVideos, withBundleAnalyzer], // All next plugins go here
// Below is the main Next.js config object
{
images: {
domains: ['cdn.shopify.com']
},
serverRuntimeConfig: {
mySecret: "secret",
secondSecret: process.env.SECOND_SECRET
},
publicRuntimeConfig: {
staticFolder: "/public"
},
// From here everything that's Webpack-related
webpack(config) {
// Add your custom Webpack configs
return config;
}
}
);
Без next-compose-plugins
То же самое может быть достигнуто без использования next-compose-plugins
, путем объединения плагинов в цепочку.
// next.config.js
// Omitting requires for simplicity
module.exports = withImages(
withSass(
withCSS(
withVideos(
withBundleAnalyzer({
images: {
domains: ['cdn.shopify.com']
},
serverRuntimeConfig: {
mySecret: "secret",
secondSecret: process.env.SECOND_SECRET
},
publicRuntimeConfig: {
staticFolder: "/public"
},
// From here everything that's Webpack-related
webpack(config) {
// Add your custom Webpack configs
return config;
}
})
)
)
)
);
Наконец, следующая конфигурация принадлежит вашему конфигурационному файлу ESLint, а не Next.js конфигурация.
// .eslintrc.js
module.exports = {
extends: 'airbnb-base',
rules: {
'arrow-body-style': 0,
},
};
Ответ №2:
Я столкнулся с аналогичной проблемой, когда пытался получить доступ к глобальным css-файлам из пакетов узлов на следующей странице JS, после многих попыток я решил, изменив следующее:
Когда необходимо использовать несколько плагинов или обычную JSON
конфигурацию с плагином, вам нужно обернуть исходную конфигурацию в плагин.
В вашем случае,
module.exports = withVideos(
images: {
domains: ['cdn.shopify.com'],
},
)