Webpack "OTS parsing error" cargando fuentes


Mi configuración de webpack especifica que las fuentes deben cargarse usando url-loader, y cuando intento ver la página usando Chrome obtengo el siguiente error:

OTS parsing error: invalid version tag
Failed to decode downloaded font: [My local URL]

Las partes relevantes de mi configuración se ven así:

{
  module: {
    loaders: [
      // ...
      {
        test: /\.scss$/,
        loaders: ['style', 'css?sourceMap', 'autoprefixer', 'sass?sourceMap'],
      },
      {
        test: /images\/.*\.(png|jpg|svg|gif)$/,
        loader: 'url-loader?limit=10000&name="[name]-[hash].[ext]"',
      },
      {
        test: /fonts\/.*\.(woff|woff2|eot|ttf|svg)$/,
        loader: 'file-loader?name="[name]-[hash].[ext]"',
      }
    ],
  },
}

No sucede en Safari, y no he probado Firefox.

En desarrollo estoy sirviendo archivos a través de webpack-dev-server, en producción se escriben en disco y se copian en S3; en ambos casos obtengo el mismo comportamiento en Chrome.

Esto también sucede a mayores imágenes (mayor que el límite de 10kB en la configuración del cargador de imágenes).

Author: Will Madden, 2015-12-07

9 answers

TL; DR Use rutas absolutas a sus activos (incluido su nombre de host completo) configurando su output.publicPath como, por ejemplo, " http://example.com/assets/".

El problema

El problema es la forma en que las URL son resueltas por Chrome cuando se analizan desde un blob CSS cargado dinámicamente.

Cuando carga la página, el navegador carga su archivo JavaScript de entrada del paquete Webpack, que (cuando está utilizando style-loader) también contiene una copia codificada en Base64 de su CSS, que se carga en la página.

Captura de pantalla de CSS incrustado en Chrome DevTools Así es como se ve en Chrome DevTools

Eso está bien para todas las imágenes o fuentes que están codificadas en el CSS como URI de datos (es decir, el contenido del archivo está incrustado en el CSS), pero para los activos referenciados por URL, el navegador tiene que buscar y recuperar el archivo.

Ahora, por defecto, el file-loader (que url-loader delega para archivos grandes) usará URLs relativas para hacer referencia activos-y ese es el problema!

Url relativas generadas por Webpack Estas son las URLs generadas por file-loader por defecto-URLs relativas

Cuando usas URLs relativas, Chrome las resolverá en relación con el archivo CSS que contiene. Normalmente eso está bien, pero en este caso el archivo que contiene está en blob://... y cualquier URL relativa se hace referencia de la misma manera. El resultado final es que Chrome intenta cargarlos desde el archivo HTML principal, y termina tratando de analice el archivo HTML como el contenido de la fuente, lo que obviamente no funcionará.

La Solución

Fuerza a file-loader a usar rutas absolutas incluyendo el protocolo ("http" o "https").

Cambie su configuración de webpack para incluir algo equivalente a:

{
  output: {
    publicPath: "http://localhost:8080/", // Development Server
    // publicPath: "http://example.com/", // Production Server
  }
}

Ahora las URLs que genera se verán así:

introduzca la descripción de la imagen aquí URLs absolutas!

Estas URL serán analizadas correctamente por Chrome y todos los demás navegador.

Usando extract-text-webpack-plugin

Vale la pena señalar que si está extrayendo su CSS a un archivo separado, no tendrá este problema porque su CSS estará en un archivo adecuado y las URL se resolverán correctamente.

 126
Author: Will Madden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-14 21:39:54

As asnwered here by @mcortesi si elimina los sourceMaps de la consulta del cargador css, el css se construirá sin el uso de blob y las url de datos se analizarán bien

 13
Author: Nadav SInai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:30

Para mí el problema era mi expresión regex. Lo siguiente hizo el truco para conseguir bootstrap trabajo

        { test: /\.(woff|ttf|eot|svg)(\?v=[a-z0-9]\.[a-z0-9]\.[a-z0-9])?$/, loader: 'url-loader?limit=100000' },
 12
Author: Waihibeachian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-06 02:05:26

Al igual que con @user3006381 anterior, mi problema no era solo las URL relativas, sino que webpack colocaba los archivos como si fueran archivos javascript. Su contenido era básicamente:

module.exports = __webpack_public_path__ + "7410dd7fd1616d9a61625679285ff5d4.eot";

En el directorio fonts en lugar de las fuentes reales y los archivos de fuentes estaban en la carpeta de salida bajo códigos hash. Para arreglar esto, tuve que cambiar la prueba en mi url-loader (en mi caso mi procesador de imágenes) para no cargar la carpeta fonts. Todavía tenía que establecer la salida.publicPath en webpack.config.js as @ will-madden señala en su excelente respuesta.

 4
Author: Adam McCormick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-08 22:49:41

Experimenté el mismo problema, pero por diferentes razones.

Después de que la solución de Will Madden no ayudó, probé todas las soluciones alternativas que pude encontrar a través de los Intertubos, también en vano. Explorando más, acabo de abrir uno de los archivos de fuentes en cuestión. El contenido original del archivo de alguna manera había sido sobrescrito por Webpack para incluir algún tipo de información de configuración, probablemente de retoques anteriores con el cargador de archivos. He reemplazado los archivos dañados con el originales, y voilà, los errores desaparecieron (tanto para Chrome y Firefox).

 2
Author: user3006381,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-28 02:10:14

Sé que esto no responde a la pregunta exacta de OPs pero vine aquí con el mismo síntoma pero una causa diferente:

Tuve el.archivos scss de Slider Slick incluidos como este:

@import "../../../node_modules/slick-carousel/slick/slick.scss";

En una inspección más cercana resultó que el it estaba tratando de cargar la fuente desde una ubicación no válida (<host>/assets/css/fonts/slick.woff), la forma en que se hacía referencia desde la hoja de estilos.

Terminé simplemente copiando el /font/ a mi assets/css/ y el problema se resolvió para mí.

 1
Author: bpylearner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-14 12:09:17

Puesto que utiliza url-loader:

El url-loader funciona como el file-loader, pero puede devolver un dataUrl si el archivo es más pequeño que un límite de bytes.

Así que otra solución a este problema sería hacer el límite lo suficientemente alto como para que los archivos de fuente se incluyan como dataUrl, por ejemplo a 100000 que son más o menos 100Kb:

{
  module: {
    loaders: [
      // ...
      {
        test: /\.scss$/,
        loaders: ['style', 'css?sourceMap', 'autoprefixer', 'sass?sourceMap'],
      },
      {
        test: /images\/.*\.(png|jpg|svg|gif)$/,
        loader: 'url-loader?limit=10000&name="[name]-[hash].[ext]"',
      },
      {
        test: /\.woff(\?v=\d+\.\d+\.\d+)?$/,
        use: 'url-loader?limit=100000&mimetype=application/font-woff',
      },
      {
        test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/,
        use: 'url-loader?limit=100000&mimetype=application/font-woff',
      },
      {
        test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
        use: 'url-loader?limit=100000&mimetype=application/octet-stream',
      },
      {
        test: /\.eot(\?v=\d+\.\d+\.\d+)?$/,
        use: 'file-loader',
      },
      {
        test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
        use: 'url-loader?limit=100000&mimetype=image/svg+xml',
      },
    ],
  },
}

Siempre teniendo en cuenta lo que representa el número límite:

Límite de bytes para archivos en línea como datos URL

De esta manera no es necesario especificar la URL completa de los activos. Lo cual puede ser difícil cuando desea que Webpack no solo responda desde localhost.

Solo una última consideración, esta configuración NO SE RECOMIENDA para la producción. Esto es solo para facilitar el desarrollo.

 1
Author: Roc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-04 11:03:19

Si está utilizando Angular debe verificar para asegurarse de que su

<base href="/"> 

La etiqueta viene antes de tu paquete de hojas de estilo. Cambié mi código de esto:

 <script src="~/bundles/style.bundle.js"></script>
 <base href="~/" />

A esto:

 <base href="~/" />
 <script src="~/bundles/style.bundle.js"></script>

Y el problema se solucionó. Gracias a este post por abrir mis ojos.

 0
Author: Patrick Graham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:50

A partir de 2018,

use MiniCssExtractPlugin

Para Webpack (>4.0) resolverá este problema.

Https://github.com/webpack-contrib/mini-css-extract-plugin

Usar extract-text-webpack-pluginen la respuesta aceptada es NO recomendado para Webpack 4.0+.

 0
Author: dsignr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-02 10:07:42