Я пытаюсь создать конструктор веб-пакетов с рабочим ящиком, так как вижу, что 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
Спасибо за ответ, @ Роберт Раунтри! Если я запустил generateSW, он сделает то же самое с созданием файлов, но не добавит сервис-воркера и манифест в index.html. Мне не следует вручную добавлять сервис-воркера и манифест в свой индекс, верно? Если я добавлю его, путь к файлам не будет соответствовать, когда обслуживается только папка dist. Нравиться. если я добавлю <script src = "./../ src / js / registerServiceWorker.js, этот маршрут не существует при запуске папки dist. Как мне одновременно использовать GenereateSW и InjectManifest?
Раздел "плагин injectmanifest" здесь: developers.google.com/web/tools/workbox/modules/… использует sw.js .. ИМО, если вы запустите webpack один раз, чтобы создать файл sw.js, затем запустите webpack с injectManifest u, и вы получите то, что хотите.
Вы можете показать мне, как? Я не совсем понимаю
дополнительный фон в этой теме: github.com/GoogleChrome/workbox/issues/1260 может помочь вам
Я все еще не могу понять, как правильно его настроить в соответствии с этим



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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