Necesito ayuda para depurar el complemento de compresión de Webpack.
RESUMEN DEL PROBLEMA

LO QUE INTENTÉ
config .plugin('brotliCompress') .use(CompressionWebpackPlugin, [{ exclude: /.map$/, cache: true, algorithm: 'brotliCompress', test: /\.(js|css|html|svg)$/, threshold: 10240, minRatio: 0.8, }]) config .plugin('gzip') .use(CompressionWebpackPlugin, [{ algorithm: 'gzip', test: new RegExp('\\.(' + ['js', 'css'].join('|') + ')$'), threshold: 8192, // Assets larger than 8192 bytes are not processed minRatio: 0.8, // Assets compressing worse that this ratio are not processed }]) config .plugin('CompressionPlugin') .use(CompressionWebpackPlugin)vue invoke compression en respuesta a un mensaje de la consola IDE después de ejecutar vue add compression como alternativa al uso de Webpack Chain API para la configuración de compresión. pluginOptions: { compression: { brotli: { filename: '[file].br[query]', algorithm: 'brotliCompress', include: /\.(js|css|html|svg|json)(\?.*)?$/i, minRatio: 0.8, }, gzip: { filename: '[file].gz[query]', algorithm: 'gzip', include: /\.(js|css|html|svg|json)(\?.*)?$/i, minRatio: 0.8 } } },PUNTOS DE SIGNIFICADO
ENLACES/DOCUMENTOS REFERENCIADOS
CÓDIGO
vue.config.js
const path = require('path') const CompressionWebpackPlugin = require('compression-webpack-plugin') function resolve (dir) { return path.join(__dirname, dir) } module.exports = { /* ....shortened for brevity */ // Compress option VI (with vue cli plugin, generator bug when invoked) // pluginOptions: { // compression: { // brotli: { // filename: '[file].br[query]', // algorithm: 'brotliCompress', // include: /\.(js|css|html|svg|json)(\?.*)?$/i, // minRatio: 0.8, // }, // gzip: { // filename: '[file].gz[query]', // algorithm: 'gzip', // include: /\.(js|css|html|svg|json)(\?.*)?$/i, // minRatio: 0.8 // } // } // }, chainWebpack: config => { config .resolve.alias .set('@', resolve('src')) config .plugins.delete('prefetch') config .optimization.splitChunks() config .output .chunkFilename('[id].js') // The below configurations are recommeneded only in prod. // config.when(process.env.NODE_ENV === 'production', config => { config... }) // Compress option VII // config // .plugin('gzip') // .use(CompressionWebpackPlugin, [{ // algorithm: 'gzip', // test: new RegExp('\\.(' + ['js', 'css'].join('|') + ')$'), // threshold: 8192, // Assets larger than 8192 bytes are not processed // minRatio: 0.8, // Assets compressing worse that this ratio are not processed // }]) // Compress option VIII // config // .plugin('CompressionPlugin') // .use(CompressionWebpackPlugin) config .plugin('brotliCompress') .use(CompressionWebpackPlugin, [{ exclude: /.map$/, // deleteOriginalAssets: true, cache: true, algorithm: 'brotliCompress', test: /\.(js|css|html|svg)$/, threshold: 10240, minRatio: 0.8, }]) }, }paquete.json
"dependencies": { "@auth0/auth0-spa-js": "^1.15.0", "audio-recorder-polyfill": "^0.4.1", "compression-webpack-plugin": "^6.0.0", "core-js": "^3.6.5", "dotenv": "^8.2.0", "dotenv-expand": "^5.1.0", "moment": "^2.29.1", "register-service-worker": "^1.7.1", "uuid": "^3.4.0", "vue": "^2.6.11", "vue-loader": "^15.9.8", "vue-router": "^3.5.1", "vuex": "^3.6.2" }, "devDependencies": { "@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-eslint": "~4.5.0", "@vue/cli-plugin-pwa": "~4.5.0", "@vue/cli-service": "~4.5.0", "babel-eslint": "^10.1.0", "eslint": "^6.7.2", "eslint-plugin-vue": "^6.2.2", "vue-cli-plugin-compression": "~1.1.5", "vue-template-compiler": "^2.6.11", "webpack": "^4.46.0" }Agradezco todos los aportes. Gracias.
No está claro qué servidor está sirviendo estos activos. Si es Express, mirando la captura de pantalla con el encabezado X-Powered-By , https://github.com/expressjs/compression/issues/71 muestra que la compatibilidad con Brotli aún no se ha agregado a Express.
Sin embargo, podría haber una manera de especificar el encabezado para content-encoding manualmente.
Parece que el compression-webpack-plugin solo comprime archivos, pero no configura automáticamente el servidor de desarrollo para servir los archivos comprimidos en lugar del archivo original.
Sin embargo, puede configurar manualmente un middleware a través de la opción devServer de devServer vue.config.js transmitida a webpack-dev-server ) para hacer esto:
Vuelva a escribir todas las solicitudes .js que acepten la codificación br para agregar .br a la URL original, que coincida con la configuración de nombre de filename asignada compression-webpack-plugin . Esto obtiene efectivamente el archivo .br comprimido por el complemento.
Configure los encabezados de respuesta para indicar la codificación del contenido br y el tipo de contenido de la application/javascript para que los navegadores puedan entender cómo procesar el archivo.
Utilice devServer.onBeforeSetupMiddleware :
// vue.config.js const CompressionPlugin = require('compression-webpack-plugin') module.exports = { transpileDependencies: true, configureWebpack: { plugins: [ new CompressionPlugin({ 1️⃣ filename: '[path][base].br', algorithm: 'brotliCompress', test: /\.js$/, }) ] }, devServer: { onBeforeSetupMiddleware({ app }) { app.use('*.js', (req, res, next) => { if (req.get('Accept-Encoding')?.includes('br')) { 1️⃣ req.url += '.br' 2️⃣ res.set('Content-Encoding', 'br') res.set('Content-Type', 'application/javascript; charset=utf-8') } next() }) } } } Utilice devServer.before :
Nota: La única diferencia con Webpack 5 es que la app Express se pasa directamente como argumento a devserver.before() .
// vue.config.js ⋮ module.exports = { ⋮ devServer: { before(app) { // same code as Webpack 5 above } } }