Workbox service worker + manifest.json настройка webpack 4

Я пытаюсь создать конструктор веб-пакетов с рабочим ящиком, так как вижу, что Vue CLI 3 использует. В моем файле package.json я сделал «сборку» для сборки и компиляции файлов и «разработчика» для ее запуска.

"build": "webpack --mode development",
"dev": "nodemon --inspect --watch webpack.config.js main.js"

Я использую InjectManifest от workbox-webpack-plugin для обработки сборки в моем файле webpack.config.js. Я пробовал разные варианты, чтобы увидеть, что они сделали.

webpack.config.js

const path = require('path')
const webpack = require('webpack')
const HTMLWebpackPlugin = require('html-webpack-plugin')
const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin')
const {GenerateSW, InjectManifest} = require('workbox-webpack-plugin')


module.exports = {
    mode: 'production',
    entry: {
        app: [
            '@babel/polyfill',
            './src/main.js'
        ]
    },
    output: {
        path: path.resolve(__dirname, 'dist/'),
        filename: '[name]-[hash].js',
        publicPath: '/'
    },
    devServer: {
        inline: false,
        contentBase: "./dist",
        overlay: true,
        hot: true,
        stats: {
            colors: true
        }
    },
    module: {
        rules: [
            {
                test: /\.html$/,
                use: {
                    loader: 'html-loader'
                }
            },
            {
                test: /\.js?$/,
                exclude: /node_modules/,
                loader: 'babel-loader',
                query: {
                    presets: ['@babel/preset-env']
                }
            },
            {
                test: /\.css$/,
                loader: [
                    'style-loader',
                    'css-loader'
                ]
            },
            {
                test: /\.scss$/,
                use: [
                    {
                        loader: "style-loader"
                    },
                    {
                        loader: "css-loader", options: {
                            sourceMap: true
                        }
                    },
                    {
                        loader: "sass-loader", options: {
                            sourceMap: true
                        }
                    }
                ]
            }
        ]
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin(),
        new HTMLWebpackPlugin({
            template: './public/index.html'
        }),
        // new GenerateSW({
        //     include: [/\.html$/, /\.js$/, /\.css$/],
        //     exclude: '/node_modules'
        // }),
        new InjectManifest({
            swSrc: './src/js/registerServiceWorker.js',
            swDest: '/serviceworker.js',
            exclude: '/node_modules'
          })
        // service worker caching
        // new SWPrecacheWebpackPlugin(
        //     {
        //         cacheId: 'webpack-project',
        //         filename: 'service-worker.js',
        //         staticFileGlobs: [
        //             'dist/**/*.{js,css}',
        //             '/'
        //         ],
        //         minify: true,
        //         stripPrefix: 'dist/',
        //         dontCacheBustUrlsMatching: /\.\w{6}\./
        //     }
        // )
    ]
}

Когда я создаю проект, я создаю следующие файлы:

app-e8dd91....js
index.html
precache-manifest.d92js8....js
serviceworker.js

index.html добавляет только файл app-e8d91 .... js в качестве сценария, оставляя предварительно кэшированный файл манифеста и служебный воркер не используемыми, в результате чего на моем локальном хосте нет служебного воркера.

У меня есть файл registerServiceWorker.js, на который есть ссылка в плагине injectManifest.

registerServiceWorker.js

 import { register } from "register-service-worker";
const path = require('path')

register(path.resolve(__dirname, 'service-worker.js'), {
    ready() {
        console.info(
        "App is being served from cache by a service worker."
        );
    },
    cached() {
        console.info("Content has been cached for offline use.");
    },
    updated() {
        console.info("New content is available; please refresh.");
    },
    offline() {
        console.info(
        "No internet connection found. App is running in offline mode."
        );
    },
    error(error) {
        console.error("Error during service worker registration:", error);
    }
});

Как заставить мою сборку создать и добавить файл service worker + manifest.json, чтобы он работал на локальном хосте, а также работал в автономном режиме?

Файловая структура:

webpack.config.js
server.js (handle server + webpackHotMiddleware + express)
dist (builded folder)
src (folder)
     main.js
     js (folder)
         registerServiceWorker.js
public (folder)
    index.html
    manifest.json
    favicon.ico

чтобы загрузить ПО, index.html должен загрузить js, который регистрирует ПО. для ввода в injectManifest запустите generateSW (только один раз), чтобы создать ввод для шага инъекции

Robert Rowntree 28.10.2018 17:00

Спасибо за ответ, @ Роберт Раунтри! Если я запустил generateSW, он сделает то же самое с созданием файлов, но не добавит сервис-воркера и манифест в index.html. Мне не следует вручную добавлять сервис-воркера и манифест в свой индекс, верно? Если я добавлю его, путь к файлам не будет соответствовать, когда обслуживается только папка dist. Нравиться. если я добавлю <script src = "./../ src / js / registerServiceWorker.js, этот маршрут не существует при запуске папки dist. Как мне одновременно использовать GenereateSW и InjectManifest?

Jonas Christensen 28.10.2018 18:52

Раздел "плагин injectmanifest" здесь: developers.google.com/web/tools/workbox/modules/… использует sw.js .. ИМО, если вы запустите webpack один раз, чтобы создать файл sw.js, затем запустите webpack с injectManifest u, и вы получите то, что хотите.

Robert Rowntree 28.10.2018 21:24

Вы можете показать мне, как? Я не совсем понимаю

Jonas Christensen 28.10.2018 21:28

дополнительный фон в этой теме: github.com/GoogleChrome/workbox/issues/1260 может помочь вам

Robert Rowntree 28.10.2018 21:52

Я все еще не могу понять, как правильно его настроить в соответствии с этим

Jonas Christensen 28.10.2018 22:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
1 697
0

Другие вопросы по теме