我有一个功能齐全的库包。我从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.require
,window.require
和require
都返回了我所期望的。当webpack的require方法被调用时,require
不再返回任何东西(尽管self.require
和window.require
可以。如果我在那时尝试只执行console.log(require)
,我也得到了一个像__webpack_modules__[moduleId]
这样的异常,尽管我找不到require
在地球上的什么地方会被这样覆盖。我想知道require
是否被操纵了一种方式通过Webpack 4,另一种方式通过Webpack 5,冲突导致了我的问题。
1条答案
按热度按时间rlcwz9us1#
这个问题是关于webpack如何覆盖
require
的。在webpack 4应用程序中使用webpack 5捆绑包导致了这些问题。我将我的应用程序切换到Vite专门解决这个问题。