Можно ли запустить плагин накопительный без входного файла (в случае нескольких комплектов)? - PullRequest
1 голос
/ 09 января 2020

У меня есть ситуация, когда я объединяю несколько файлов с помощью накопительного пакета cli. Пример этого доступен в документации.

Я экспортирую массив пакетов следующим образом:

export default [
    {
        input: 'packages/A/index.js',
        output: {
            name: '[name]Bundle',
            file: '[name].umd.js',
            format: 'umd'
        }
    },
    {
        input: 'packages/B/index.js',
        output: {
            name: '[name]Bundle',
            file: '[name].umd.js',
            format: 'umd'
        }
    }
];

И затем у меня есть функция, которая добавляет общую конфигурацию к каждому пакету (например, плагины), что-то вроде:

import path from "path";

import alias from '@rollup/plugin-alias';
import resolve from '@rollup/plugin-node-resolve';


const augment = configs => {

    const generateAlias = (symbol, location) => {
        return {
            find: symbol,
            replacement: path.resolve(process.cwd(), location)
        };
    }

    const entries = [
        generateAlias("@", "src/"),
        generateAlias("~", "src/assets/scss/"),
        generateAlias("#", "src/assets/img/"),
        generateAlias("%", "config/"),
    ];

    const plugins = [
        alias({
            entries
        }),
        resolve({ browser: true }),
    ];

    return configs.map(entry => {
        return {
            ...entry,
            plugins
        }
    });
}

export {
    augment
}

И я оборачиваю вышеупомянутый экспортированный массив в augment например:

const bundles = [/* above example */];

export default augment(bundles);

Теперь все это работает нормально, но у меня есть два плагина, которые я на самом деле не хочу применять к каждому пакету. Я просто хочу запустить их после того, как все пакеты были собраны, эти два плагина находятся; rollup-plugin-serve и rollup-plugin-workbox теперь ни один из них на самом деле не имеет никакого отношения к каким-либо связываемым файлам, и нет смысла создавать экземпляры более одного раза.

То, что я хотел бы сделать как часть функции augment, чтобы добавить их в конец возвращаемого массива, например:

const exportedArray = configs.map(/* function from above */);

exportedArray.push(...[
        {
                plugins: [
                        serve({
                                host,
                                port,
                                contentBase: 'dist/'
                        })
                ]
        }
]);

return exportedArray;

И это не будет содержать input, я попробовал вышеописанное и сваливаю жалобы, альтернативным вариантом было бы добавить эти плагины в окончательный комплект в массиве, я просто предпочитаю создавать их экземпляры без привязки к конкретному комплекту.

1 Ответ

0 голосов
/ 16 января 2020

Для работы накопительного файла необходим входной файл, но это не значит, что вы не можете просто выбросить результат этого файла. Вы можете создать пустой файл empty.js (или, возможно, добавить в него какой-нибудь комментарий) и использовать его в качестве входных данных. Просто пропустите свойства output , чтобы результат нигде не записывался.

--- EDIT ---

примерно так:

export default {
    input: './empty.js',
    plugins: [{
        name: 'test plugin',
        load() {
            console.log('test plugin')
        }
    }]
}

--- EDIT ---

В качестве альтернативы вы можете записать фиктивный файл и удалить его снова

const fs = require('fs')

export default {
    input: './empty.js',
    output: {
        file: './dummy',
    },
    plugins: [{
        name: 'test plugin',
        writeBundle(options) {
            fs.unlinkSync(options.file)
        }
    }]
}
...