构建一个服务器端React应用程序,使用Webpack时遇到了Style-Loader的问题。
我正在使用版本"^0.23.1",在运行打包和构建脚本时,Style-Loader出现了问题。
问题是window is not defined
。
webpack:///./node_modules/style-loader/lib/addStyles.js?:23
return window && document && document.all && !window.atob;
有人遇到过这个问题吗?在查看了Stack和style-loader的Github问题后,我没有找到任何解决方案。
这是我的webpack文件:
const path = require('path');
const webpack = require('webpack');
module.exports = {
// webpack to use node
target: 'node',
entry: './src/index.js',
output: {
filename: 'client-build.js',
path: path.resolve(__dirname, 'build/public'),
publicPath: '/build/public'
},
module: {
rules: [
{
test: /\.js$|\.jsx$/,
loader: 'babel-loader',
exclude: '/node_modules/',
options: {
presets: [
'@babel/preset-react'
]
}
},
{
test: /\.(s*)css$/,
loader: ['style-loader', 'css-loader', 'sass-loader']
},
{
test: /\.jpeg$|\.gif$|\.png$|\.svg$|\.woff$|\.ttf$|\.wav$|\.mp3$|\.jpg$|\.pdf$/,
loader: 'file-loader',
query: {
name: 'assets/img/[name].[ext]'
},
},
]
},
plugins: [
new webpack.ProvidePlugin({
"React": "react",
}),
],
}
如果您需要查看其他内容,我可以发布它。
style-loader
并不适用于服务器端渲染。如果您不打算使用SSR,请注意配置文件中的target: node
设置。将其更改为target: web
以针对客户端捆绑而非服务器端。这将防止style-loader
将其代码放入您使用Node.js运行的服务器端文件中。另外,在我的情况下,即使我将web
设为目标,我也有entry: { server: './src/index.js' }
,其中server
属性应改为main
。当我更改它时,一切正常。 - Mattentry
对象内的属性名不必是特定值。server
和main
是我在跟随教程时使用的字符串,但可以是任何您想要的东西。只需注意,您选择的值可以通过使用特殊的[name]
语法在配置文件的其他地方引用。同样,在我的情况下,我已经有另一个webpack配置文件正在使用名为server
的条目,因此使用第二个会导致某种冲突。因此,将其更改为main
(或除server
之外的任何其他名称)就可以解决问题。 - Matt