使用extract-text-webpack-plugin React时,窗口未定义错误
我正在使用webpack来构build我的反应组件,我试图使用extract-text-webpack-plugin
来从我生成的js文件中分离出我的css。 但是,当我尝试构build组件时出现以下错误: 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') ] }
您可能希望在extract
函数中将style-loader
用作before
参数。
这是本地实现:
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
ExtractTextPlugin.extract([notExtractLoader], loader, [options])
从现有的装载器创build一个解压缩装载器。
notExtractLoader
(可选)当css未被提取时应该使用的加载器(即,当allChunk:false时,在一个>附加块中)
loader
应该用于将资源转换为css导出模块的加载程序。
options
publicPath
覆盖此加载器的publicPath设置。
#extract
方法应该会收到一个输出css
的加载器。 发生了什么事是它正在接收一个style-loader
输出JavaScript代码 ,这是打算注入到一个网页。 这段代码会尝试访问window
。
你不应该把style
的loaderstring传递给#extract
。 但是…如果你设置allChunks=false
,那么它不会为非初始块build立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')
: ExtractTextWebpackPlugin.extract('style-loader', 'css-loader')