Как объединить несколько плагинов внутри next.config.js файл?

#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 заканчивается новыми ошибками

Просто чтобы подвести итог вопросам:

  1. Каковы правила объединения модулей внутри единого экспорта и как я могу объединить его со всеми моими предыдущими module.exports?
  2. Действительно ли мне нужно оставить часть «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'],
   },
)