Rollup JS build с использованием плагина rollup-plugin-modify, не заменяющего все экземпляры строк в файлах сборки (вместо этого используется плагин «replace-in-file») - PullRequest
0 голосов
/ 02 апреля 2020

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

Ниже был мой первый накопительный пакет .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
    }
};

1 Ответ

0 голосов
/ 02 апреля 2020

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

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

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

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

...