#javascript #html #webpack #gzip #html-framework-7
Вопрос:
В проекте используются framework7 и webpack. В конфигурации webpack я использую плагин «сжатие-webpack-плагин».
Проблема в том, что после сборки все необходимые файлы создаются в каталоге www: index.html, ap. cs, app.js, app.css.gz, app.js.gz и др. Открываюсь index.html браузер не может найти сжатые файлы*. gz в папке…. /www /.
Помоги мне разобраться, в чем проблема.
Файл webpack.config.js
const webpack = require('webpack');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const CompressionPlugin = require("compression-webpack-plugin");
const zlib = require("zlib");
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const path = require('path');
function resolvePath(dir) {
return path.join(__dirname, '..', dir);
}
const env = process.env.NODE_ENV || 'development';
const target = process.env.TARGET || 'web';
module.exports = {
mode: env,
target: env === "development" ? "web" : "browserslist",
entry: {
app: './src/js/app.js',
},
output: {
path: resolvePath('www'),
filename: '[name].js', // 'js/[name].js'
chunkFilename: '[name].js', // 'js/[name].js'
publicPath: '',
hotUpdateChunkFilename: 'hot/hot-update.js',
hotUpdateMainFilename: 'hot/hot-update.json',
},
resolve: {
extensions: ['.mjs', '.js', '.svelte', '.json'],
alias: {
'@': resolvePath('src'),
},
mainFields: ['svelte', 'browser', 'module', 'main']
},
devtool: env === 'production' ? false : 'eval',
devServer: {
hot: true,
open: true,
compress: true,
contentBase: '/www/',
disableHostCheck: true,
historyApiFallback: true,
},
optimization: {
concatenateModules: true,
minimizer: [new TerserPlugin()],
},
module: {
rules: [
{
test: /.(mjs|js|jsx)$/,
include: [
resolvePath('src'),
resolvePath('node_modules/svelte'),
],
use: [
{
loader: require.resolve('babel-loader'),
},
]
},
{
test: /.svelte$/,
use: {
loader: 'svelte-loader',
options: {
emitCss: true,
},
},
},
{
test: /.css$/,
use: [
(env === 'development' ? 'style-loader' : {
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '../'
}
}),
'css-loader',
'postcss-loader',
],
},
{
test: /.styl(us)?$/,
use: [
(env === 'development' ? 'style-loader' : {
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '../'
}
}),
'css-loader',
'postcss-loader',
'stylus-loader',
],
},
{
test: /.less$/,
use: [
(env === 'development' ? 'style-loader' : {
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '../'
}
}),
'css-loader',
'postcss-loader',
'less-loader',
],
},
{
test: /.(sa|sc)ss$/,
use: [
(env === 'development' ? 'style-loader' : {
loader: MiniCssExtractPlugin.loader,
options: {
publicPath: '../'
}
}),
'css-loader',
'postcss-loader',
'sass-loader',
],
},
{
test: /.(png|jpe?g|gif|svg)(?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: '[name].[ext]', // 'images/[name].[ext]'
},
type: 'javascript/auto'
},
{
test: /.(mp4|webm|ogg|mp3|wav|flac|aac|m4a)(?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'media/[name].[ext]',
},
type: 'javascript/auto'
},
{
test: /.(woff?|woff2?|eot|ttf|otf)(?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'www/[name].[ext]', // 'fonts/[name].[ext]'
},
type: 'javascript/auto'
},
],
},
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(env),
'process.env.TARGET': JSON.stringify(target),
}),
...(env === 'production' ? [
new CssMinimizerPlugin(),
//new BundleAnalyzerPlugin()
new CompressionPlugin({
algorithm: "gzip",
test: /.(js|css)$/,
threshold: 300000,
minRatio: 0.8,
deleteOriginalAssets: false,
})
] : [
// Development only plugins
new webpack.HotModuleReplacementPlugin(),
]),
new HtmlWebpackPlugin({
filename: './index.html',
template: './src/index.html',
inject: true,
minify: env === 'production' ? {
collapseWhitespace: true,
removeComments: true,
removeRedundantAttributes: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
useShortDoctype: true
} : false,
}),
new MiniCssExtractPlugin({
filename: '[name].css',// 'css/[name].css'
}),
new CopyWebpackPlugin({
patterns: [
{
noErrorOnMissing: true,
from: resolvePath('src/static'),
to: resolvePath('www/'), //'www/static'
},
],
}),
],
};
Файл index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src * 'self' 'unsafe-inline' 'unsafe-eval' data: gap: content:">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, viewport-fit=cover">
<!-- <meta name=apple-mobile-web-app-status-bar-style content=black> -->
<meta name="theme-color" content="#007aff">
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<title>Title</title>
<!-- built styles file will be auto injected -->
</head>
<body>
<div id="app"></div>
<!-- built script files will be auto injected -->
</body>
</html>
После сборки index.html:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src * 'self' 'unsafe-inline' 'unsafe-eval' data: gap: content:">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no,viewport-fit=cover">
<meta name="theme-color" content="#007aff"><meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<title>Title</title>
<link href="app.css" rel="stylesheet">
</head>
<body><div id="app"></div>
<script src="app.js"></script>
</body>
</html>