为什么Webpack 5 externals返回一个空对象?

dgtucam1  于 12个月前  发布在  Webpack
关注(0)|答案(1)|浏览(104)

我有一个功能齐全的库包。我从Webpack 4升级到Webpack 5,突然我的外部包返回一个空对象。我完全失去了想法。我的配置已经正确,包括解决方案:
Why webpack returns an empty object when requiring its output?
我的模块现在只导出这个,我仍然有一个问题:

import React from 'react';

const uxp = require('uxp');

export const ExportAsSection = () => {
  console.log("UXP TEST:")
  // empty object, although doing the same from a console shows the expected global object
  console.log(uxp)

  // Renders no issue
  return (
      <div>I am a panel</div>
  );
};

字符串
我的相关配置是这样的:

const path = require('path');
const { merge } = require('webpack-merge');
const baseConfig = require('../../webpack.config');

const config = {
  context: __dirname,
  entry: './src/index.tsx',
  externals: {
    lodash: 'lodash',
    'react-dom': 'react-dom',
    react: 'react',
    uxp: 'commonjs2 uxp'
  },
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: ['style-loader', 'css-loader'],
      },
      {
        test: /\.(svg)$/i,
        use: [
          'babel-loader',
          {
            loader: 'react-svg-loader',
            options: {
              svgo: {
                plugins: [
                  {
                    convertPathData: { noSpaceAfterFlags: false },
                  },
                  {
                    mergePaths: false,
                  },
                  {
                    removeViewBox: false,
                  },
                ],
              },
            },
          },
        ],
      },
    ],
  },
  output: {
    filename: 'example-export.umd.js',
    path: path.resolve(__dirname, 'dist'),
    library: '@example/export',
  },
};

module.exports = merge(baseConfig, config);


基本配置如下:

const webpack = require('webpack');
const path = require('path');
const git = require('git-rev-sync');

const dev = process.env.MODE === 'development' ? '-dev' : '';
const production = process.env.MODE === 'production';

const pluginRev = `${git.short()}${dev}`;

module.exports = {
  entry: './src/index.ts',
  mode: production ? 'production' : 'development',
  devtool: production ? false : 'eval-cheap-module-source-map',
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              configFile: path.resolve(__dirname, './babel.config.json'),
            },
          },
          {
            loader: 'ts-loader',
            options: {
              allowTsInNodeModules: true,
            },
          },
        ],
      },
    ],
  },
  plugins: [
    new webpack.DefinePlugin({
      PLUGIN_REV: JSON.stringify(pluginRev),
    }),
    new webpack.ProvidePlugin({
      Buffer: ['buffer', 'Buffer'],
    }),
  ],
  resolve: {
    extensions: ['.tsx', '.ts', '.js'],
    fallback: {
      buffer: require.resolve('buffer'),
    },
  },
  output: {
    libraryTarget: 'umd',
  },
};


输出的UMD文件也有这个看起来正确的位:

/***/ "uxp":
/*!**********************!*\
  !*** external "uxp" ***!
  \**********************/
/***/ ((module) => {

module.exports = require("uxp");

/***/ }),

更新我还通过降级到Webpack 4进行了合理性检查,并且无法重现问题。然后我回到Webpack 5,使用Webpack 5配置,并制作了devtool: false,以便它可以从一个冲突,破坏性更改和返回的问题中重新构建。所以这里肯定是关于升级的。
更新2我将所有代码都删除,只从React返回一个div,这样UMD编译的JS就非常可读了。我的UMD包是使用Webpack 4导入到一个项目中的。当编译的代码最初导入时,self.requirewindow.requirerequire都返回了我所期望的。当webpack的require方法被调用时,require不再返回任何东西(尽管self.requirewindow.require可以。如果我在那时尝试只执行console.log(require),我也得到了一个像__webpack_modules__[moduleId]这样的异常,尽管我找不到require在地球上的什么地方会被这样覆盖。我想知道require是否被操纵了一种方式通过Webpack 4,另一种方式通过Webpack 5,冲突导致了我的问题。

rlcwz9us

rlcwz9us1#

这个问题是关于webpack如何覆盖require的。在webpack 4应用程序中使用webpack 5捆绑包导致了这些问题。我将我的应用程序切换到Vite专门解决这个问题。

相关问题