使用 Webpack 构建后未定义窗口

imc*_*cze 8 reactjs webpack babeljs

我正在开发一个 reactJS 应用程序,并且我正在使用WebPack 4.29.6我在这里面临的问题是,当我运行npm run dev命令时,它在本地运行一切正常,而当我想在服务器中部署时我不知道怎么做我正在使用build:production命令构建应用程序然后它生成 /dist 文件夹里面的所有文件现在在这里我尝试运行bundle.js它给了我这个错误:ReferenceError: window is not defined

这些是我用来启动我的应用程序的命令:

"scripts": {
    "dev": "cross-env webpack-dev-server --config ./webpack.config.dev.js --mode development",
"build:production": "cross-env webpack --config webpack.config.production.js --mode production"
}
Run Code Online (Sandbox Code Playgroud)

这是我的 webpack.config.common.js

const path = require('path');
const webpack = require('webpack');

const outputPath = path.join(__dirname, '/dist');

const port = process.env.PORT || 4000;

module.exports = {
  context: __dirname,
  entry: './src/index.jsx',
  resolve: {
    extensions: ['*', '.js', '.jsx'],
  },
  output: {
    path: outputPath,
    publicPath: '/',
    filename: 'bundle.js',
    sourceMapFilename: 'bundle.map',
  },
  devServer: {
    port,
    historyApiFallback: true,
    compress: true,
    contentBase: './dist',
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: ['babel-loader', 'eslint-loader'],
      },
      {
        test: /\.less$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'style-loader',
          },
          {
            loader: 'css-loader',
          },
          {
            loader: 'less-loader',
          },
        ],
      },
      {
        test: /\.css$/,
        use: ['css-loader'],
      },
      {
        test: /\.svg$/,
        loader: 'svg-inline-loader',
      },
      {
        test: /\.(png|jpg|gif|woff(2)?|ttf|eot|svg)$/,
        exclude: [
          /\.(js|jsx|mjs)$/,
          /\.html$/,
          /\.json$/,
          /\.(less|config|variables|overrides)$/,
        ],
        use: [
          {
            loader: 'file-loader',
          },
        ],
      },
    ],
  },
  plugins: [
    new webpack.ProvidePlugin({
      Promise: 'es6-promise-promise',
    }),
  ],
};

Run Code Online (Sandbox Code Playgroud)

这是我的 webpack.config.dev.js

const webpack = require('webpack');
const merge = require('webpack-merge');
const path = require('path');

const HtmlWebpackPlugin = require('html-webpack-plugin');
const webpackCommonConfig = require('./webpack.config.common');

module.exports = merge(webpackCommonConfig, {
  mode: 'development',
  plugins: [
    new HtmlWebpackPlugin({
      template: path.join(__dirname, '/index.html'),
    }),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.EnvironmentPlugin({ NODE_ENV: 'development' }),
  ],
  devtool: 'inline-source-map',
  devServer: {
    hot: true,
    open: true,
  },
  externals: {
    // global app config object
    config: JSON.stringify({
      apiUrl: 'http://localhost:3000',
    }),
  },
});

Run Code Online (Sandbox Code Playgroud)

这是我的 webpack.config.production.js

const webpack = require('webpack');
const merge = require('webpack-merge');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

const webpackCommonConfig = require('./webpack.config.common');

module.exports = merge(webpackCommonConfig, {
  mode: 'production',
  plugins: [new webpack.EnvironmentPlugin({ NODE_ENV: 'production' })],
  optimization: {
    minimizer: [
      // we specify a custom UglifyJsPlugin here to get source maps in production
      new UglifyJsPlugin({
        cache: true,
        parallel: true,
        uglifyOptions: {
          compress: false,
          ecma: 6,
          mangle: true,
        },
        sourceMap: true,
      }),
    ],
  },
  devtool: 'source-map',
  devServer: {
    compress: true,
  },
});

Run Code Online (Sandbox Code Playgroud)

Ork*_*zel 12

回答可能晚了,但可能会帮助其他人。我也遇到了ReferenceError: window is not defined.Webpack 4的问题,发现在 webpack 配置文件中globalObject: 'this'output部分添加行修复了我的问题:

  output: {
    globalObject: "this",
    filename: "[name].js",
    path: path.join(__dirname, "build/package"),
    publicPath: "/resources/",
  }
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看该问题的讨论 以及有关globalObject设置的 Webpack 文档此处