Сборка Rollup JS с использованием подключаемого модуля rollup-plugin-modify не заменяет все экземпляры строк в файлах сборки (вместо этого используется подключаемый модуль replace-in-file)

Я хотел заняться обновлением кеша файлов в приложении Svelte и хотел эту часть сборки накопительного пакета. Я решаю добавить параметр строки запроса к ссылкам на файлы (например, index.html? V = 0.1) в сценариях распределенной сборки. Я создал константу «__cVersion__» в моем сценарии rollup.config.js и попытался использовать «rollup-plugin-modify», но это обновило только мой код main.js и App.svelte (файлы, которые компилируются). Я также попробовал плагин @ rollup / plugin-replace с теми же результатами. Мне нужны были файлы, которые я также копировал (а не строил) из src в public, чтобы также были заменены экземпляры '__cVersion__' в скриптах.

Следующее было моей начальной функцией экспорта rollup.config.js (замена строки, которая не сработала):

export default {
    input: 'src/main.js',
    output: {
        sourcemap: true,
        format: 'iife',
        name: 'app',
        file: 'public/build/bundle.js'
    },
    plugins: [

        // this only seems to work on the main.js and .svelte files
        modify({ 
            '__cVersion__': 'c0.1.19'
         }),

        svelte({
            dev: !production,
            css: css => {
                css.write('public/build/bundle.css');
            }
        }),

        copy({
            targets: [{ 
                src: 'src/bs4.4.1.css', 
                dest: 'public/' 
            },
            { 
                src: 'src/sw.js',
                dest: 'public/' 
            },
            { 
                src: 'src/index.html',
                dest: 'public/' 
            },
            { 
                src: 'src/manifest.json', 
                dest: 'public/' 
            },
            { 
                src: 'src/images/*', 
                dest: 'public/images/'
            }
            ]
        }),

        resolve({
            browser: true,
            dedupe: ['svelte']
        }),
        commonjs(),
        // cache files
        workbox({
            mode: 'injectManifest',
            options: {
                swSrc: 'src/sw.js',
                swDest: 'public/sw.js',
                globDirectory: 'public',
                globPatterns: [
                '**/*.{html,json,js,css,png,map}',
                './manifest.json',
                './images/**',
                './bs4.4.1.css',
                './index.html'
                ]
            }
            }),

        !production && serve(),
        !production && livereload('public'),
        production && terser()

    ],
    watch: {
        clearScreen: false
    }
};

person w. Patrick Gale    schedule 02.04.2020    source источник


Ответы (2)


Я решил использовать другой подход, так как понял, что процесс сборки необходимо завершить, прежде чем я попытался заменить «__cVersion__» в файлах. После некоторых проб и ошибок я остановился на этом коде: https://github.com/kuhlaid/svelte2/releases/tag/v0.1.7

Если вы выполните поиск «__cVersion__» в исходном коде, вы увидите, где я добавляю строку версии файла, чтобы попытаться принудительно обновить кеш файла ... однако это не решило проблему полностью.

Затем я посмотрел на сервис-воркера (sw.js) и понял, что Workbox injectManifest на самом деле обрабатывает версии файлов. Единственная проблема с моей текущей настройкой заключалась в том, что я добавил константы «__cVersion__» в свои сценарии, но Workbox никогда не видел замен, так как Workbox обработал сервис-воркера до того, как я заменил константы.

Что мне, вероятно, нужно сделать, так это скопировать файлы src в «промежуточный каталог», где я могу заменить константы «кеша» в сценариях, а затем запустить накопительный пакет сборки из промежуточных файлов. Это «должно» заставить Workbox обрабатывать файлы как обновленные и, таким образом, назначать им разные номера ревизий в файле сервис-воркера. Я постараюсь обновить эту ветку, когда у меня будет эта проблема.

person w. Patrick Gale    schedule 02.04.2020

По умолчанию плагин rollup-plugin-copy срабатывает по ловушке buildEnd свертки.
Установка ловушки на writeBundle устранила эту проблему для меня, например:

copy({
  targets: [
    { 
      src: ..., 
      dest: ... 
    },
    ...
  ],
  hook: "writeBundle",
}),
person jaunt    schedule 11.04.2021