Estoy usando webpack para construir mis componentes de reacción y estoy tratando de usar extract-text-webpack-pluginpara separar mi css de mi archivo js generado. Sin embargo, cuando se intenta generar el componente me sale el siguiente error:
 Module build failed: ReferenceError: window is not defined.
Mi archivo webpack.config.js se ve así:
var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
module.exports = {
  entry: {
    MainComponent: './src/main.js'
  },
  output: {
    libraryTarget: 'var',
    library: 'MainComponent',
    path: './build',
    filename: '[name].js'
  },
  module: {
    loaders: [{
      test: /\.css$/, loader: ExtractTextPlugin.extract('style-loader!css-loader')
    }]
  },
  plugins: [
    new ExtractTextPlugin('styles.css')
  ]
}
    
ExtractTextPlugin.extract('style-loader!css-loader')tener que escribirExtractTextPlugin.extract('style-loader', 'css-loader')Respuestas:
Es posible que desee utilizarlo
style-loadercomobeforeargumento enextractfunción.Aquí está la implementación nativa:
ExtractTextPlugin.extract = function(before, loader, options) { if(typeof loader === "string") { return [ ExtractTextPlugin.loader(mergeOptions({omit: before.split("!").length, extract: true, remove: true}, options)), before, loader ].join("!"); } else { options = loader; loader = before; return [ ExtractTextPlugin.loader(mergeOptions({remove: true}, options)), loader ].join("!"); } };Entonces, básicamente, lo que debes hacer es:
{ test: /\.sass$/, exclude: /node_modules/, loader: ExtractTextPlugin.extract('style-loader', 'css!sass?indentedSyntax=true&sourceMap=true') },si por ejemplo usa
sass.fuente
No vi una explicación de la causa, así que publiqué esta respuesta aquí.
De https://github.com/webpack/extract-text-webpack-plugin#api
El
#extractmétodo debe recibir un cargador que generecss. Lo que estaba sucediendo era que estaba recibiendo un código destyle-loadersalida JavaScript , que está destinado a ser inyectado en una página web. Este código intentaría accederwindow.No debe pasar una cadena de cargador con
styleto#extract. Sin embargo ... si lo configuraallChunks=false, no generará archivos CSS para fragmentos no iniciales. Por lo tanto, necesita saber qué cargador usar para inyectar en la página.Consejo: Webpack es una herramienta que realmente necesita entenderse en profundidad o puede encontrarse con muchos problemas extraños.
fuente
Webpack 2
Si está utilizando Webpack 2, esta variación funciona:
rules: [{ test: /\.css$/, exclude: '/node_modules/', use: ExtractTextPlugin.extract({ fallback: [{ loader: 'style-loader', }], use: [{ loader: 'css-loader', options: { modules: true, localIdentName: '[name]__[local]--[hash:base64:5]', }, }, { loader: 'postcss-loader', }], }), }]El nuevo método de extracción ya no toma tres argumentos y se muestra como un cambio importante al pasar de V1 a V2.
https://webpack.js.org/guides/migrating/#extracttextwebpackplugin-breaking-change
fuente
Descubrí la solución a mi problema:
En lugar de conectar los cargadores entre sí (
ExtractTextPlugin.extract('style-loader!css-loader')), debe pasar cada cargador como un parámetro separado:ExtractTextWebpackPlugin.extract('style-loader', 'css-loader')fuente
extractfunción toma tres parámetros :(before, loader, options), y esta respuesta lo cubre perfectamente: stackoverflow.com/a/30982133/1346510'style', 'css', 'sass', puede cambiarlo a'style', 'css!sass'- ¡Gracias!