在Webpack中使用样式加载器时出现“未定义窗口”错误

T. *_*ans 10 reactjs webpack webpack-style-loader

构建服务器端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;
Run Code Online (Sandbox Code Playgroud)

有没有人遇到这个问题?在查看了有关样式加载程序的Stack和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",
    }),
  ],
}
Run Code Online (Sandbox Code Playgroud)

如果还有其他任何需要,我可以张贴。

Rou*_*uby 11

style-loader尝试将样式注入head网站 ( window/ document) 中,在渲染/执行时,您的服务器上将不存在样式。

你需要从你的服务器配置中删除这个加载器并用其他东西替换它(例如ExtractTextPluginMiniCSSExtractplugin,取决于你的 webpack 版本)


Jan*_*ees 6

我认为您的问题是,window在节点服务器上运行js代码时没有对象。这也很有意义,因为您的服务器没有呈现代码的窗口。您可以global改为将该对象用于全局引用,请参见此处的相关文章:node.js是否等效于浏览器中的window对象

  • 是的,你是对的。问题在于OP的配置通过为target属性提供的node值来定向服务器端绑定。`style-loader`加载器不是为服务器端绑定而设计的,如果包含在这里,则由于`style-loader`引用了`窗口。正如您所说的,“ window”不是服务器上的东西,只有在客户端代码中才是。所以有两个选择:(1)将target更改为web(而不是node),或者(2)删除样式加载器,并使用为服务器端渲染设计的加载器。 (2认同)