Я использую webpack для создания своих реагирующих компонентов, и я пытаюсь использовать его, extract-text-webpack-plugin
чтобы отделить свой css от сгенерированного файла js. Однако, когда я пытаюсь построить компонент я получаю следующее сообщение об ошибке:
Module build failed: ReferenceError: window is not defined
.
Мой файл webpack.config.js выглядит так:
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')
того, чтобы писать,ExtractTextPlugin.extract('style-loader', 'css-loader')
Ответы:
Вы можете использовать
style-loader
в качествеbefore
аргумента вextract
функции.Вот собственная реализация:
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("!"); } };
Итак, что вам нужно сделать, это:
{ test: /\.sass$/, exclude: /node_modules/, loader: ExtractTextPlugin.extract('style-loader', 'css!sass?indentedSyntax=true&sourceMap=true') },
если вы например используете
sass
.источник
Не видел объяснения причины, поэтому разместил этот ответ здесь.
С https://github.com/webpack/extract-text-webpack-plugin#api
#extract
Метод должен получить загрузчик , который выводитcss
. Что происходило, так это то, что он получал,style-loader
который выводит код javascript , который предназначен для внедрения на веб-страницу. Этот код попытается получить доступwindow
.Вы не должны передавать строку загрузчика с помощью
style
to#extract
. Однако ... если вы установитеallChunks=false
, тогда он не будет создавать файлы CSS для не начальных фрагментов. Поэтому ему необходимо знать, какой загрузчик использовать для вставки на страницу.Совет: Webpack - это инструмент, который действительно требует глубокого понимания, иначе вы можете столкнуться с множеством странных проблем.
источник
Webpack 2
Если вы используете Webpack 2, этот вариант работает:
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', }], }), }]
Новый метод извлечения больше не принимает три аргумента и отображается как критическое изменение при переходе от V1 к V2.
https://webpack.js.org/guides/migrating/#extracttextwebpackplugin-breaking-change
источник
Я нашел решение своей проблемы:
Вместо того, чтобы соединять загрузчики друг с другом (
ExtractTextPlugin.extract('style-loader!css-loader')
), вы должны передать каждый загрузчик как отдельный параметр:ExtractTextWebpackPlugin.extract('style-loader', 'css-loader')
источник
extract
Функция принимает три параметра:(before, loader, options)
и этот ответ крышки , которые идеально: stackoverflow.com/a/30982133/1346510'style', 'css', 'sass'
вы можете просто изменить его на'style', 'css!sass'
- Спасибо!