Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

712
Visualizações
El complemento de compresión Vuejs Webpack no se comprime

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

RESUMEN DEL PROBLEMA

  • El objetivo es habilitar la compresión de activos y reducir el tamaño del paquete de mi aplicación. Usar el algoritmo Brotli como predeterminado y gzip como respaldo para navegadores no compatibles.
  • Esperaba un campo de codificación de contenido dentro de los encabezados de respuesta de un recurso. En cambio, se cargan sin el campo. Utilicé la pestaña de red de las herramientas de desarrollo de Chrome para confirmar esto. Para el contexto, vea el siguiente fragmento: ejemplo de solicitud de activos
  • No se muestran errores en mi navegador o IDE cuando se ejecuta localmente.

LO QUE INTENTÉ

  • Usando diferentes implementaciones para el complemento de compresión. Consulte la siguiente lista de enfoques:
    1. (Con la API de la cadena Webpack)
 config .plugin('brotliCompress') .use(CompressionWebpackPlugin, [{ exclude: /.map$/, cache: true, algorithm: 'brotliCompress', test: /\.(js|css|html|svg)$/, threshold: 10240, minRatio: 0.8, }])
  1. (Con la API de la cadena Webpack)
 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 }])
  1. (Con la API de la cadena Webpack)
 config .plugin('CompressionPlugin') .use(CompressionWebpackPlugin)
  1. (Usando vue-cli-plugin: compresión) Esto falla debido a un error de generador faltante cuando uso 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 } } },
  1. Por último, intenté establecer el campo de umbral en 0 y aumentarlo a más de 10k bytes.

PUNTOS DE SIGNIFICADO

  • Los intentos anteriores no lograron el objetivo que establecí en la primera viñeta de resumen y se usaron en lugar de los enfoques probados anteriormente.
  • Prioricé mis esfuerzos con Webpack Chain API ya que no produjo errores al reconstruir y ejecutar la aplicación.

ENLACES/DOCUMENTOS REFERENCIADOS

  • https://webpack.js.org/plugins/compression-webpack-plugin/
  • https://github.com/neutrinojs/webpack-chain/tree/main
  • https://neutrinojs.org/webpack-chain/#config-plugins-adding
  • https://github.com/nklayman/vue-cli-plugin-electron-builder/issues/500 (problema de generador similar con otro complemento)
  • https://webpack.js.org/plugins/compression-webpack-plugin/
  • Use webpack-chain para hacer la configuración de webpack en vue.config.js, entonces, ¿cómo usar el complemento speed-measure-webpack-plugin? (no es una respuesta válida, pero no obstante se hace referencia a la sintaxis)
  • https://github.com/vuejs/vue-cli/issues/6091#issuecomment-738536334
  • Webpack prerender-spa-plugin con compresión-webpack-plugin. index.html no comprimido

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.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

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.

over 4 years ago · Santiago Trujillo Relatório

0

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:

  1. 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.

  2. 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.

Vue CLI 5 (paquete web 5)

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() }) } } }

Vue CLI 4 (paquete web 4)

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 } } }

demostración de GitHub

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda