Description
System Info
System:
OS: macOS 14.0
CPU: (8) arm64 Apple M1
Memory: 82.00 MB / 16.00 GB
Shell: 5.9 - /bin/zsh
Binaries:
Node: 20.12.2 - ~/.nvm/versions/node/v20.12.2/bin/node
npm: 10.5.0 - ~/.nvm/versions/node/v20.12.2/bin/npm
pnpm: 9.15.0 - /opt/homebrew/bin/pnpm
Browsers:
Chrome: 138.0.7204.93
Safari: 17.0
npmPackages:
@rspack/cli: 1.3.11 => 1.3.11
@rspack/core: 1.3.11 => 1.3.11
@rspack/dev-server: 1.1.3 => 1.1.3
@rspack/plugin-react-refresh: 1.4.3 => 1.4.3
Details
After upgrading to 1.3.11, the application started crashing during prod builds. Here's the original example that contains the issue (minor code has been removed for clarity):
// completeYourTrip/ui/organisms/HotelsWidgetOrder/HotelsWidgetOrder.tsx
import { completeYourTripModel } from 'src/widgets/order/completeYourTrip';
type Props = {
className?: string;
};
export const HotelsWidgetOrder = ({ className }: Props) => {
const { orderData } = completeYourTripModel.useHotelsWidgetDataSelector();
return null;
};
// src/widgets/order/completeYourTrip
export * as completeYourTripModel from './model';
export { HotelsWidgetOrder } from './ui/organisms';
// src/widgets/order/completeYourTrip/model
export { useHotelsWidgetDataSelector } from './selectors/hotelsCrossSale';
// src/widgets/order/completeYourTrip/model/selectors/hotelsCrossSale.ts
import { createSelector } from '@reduxjs/toolkit';
export const hotelsWidgetDataSelector = createSelector(
// some code
);
// no matter what inside of const
export const useHotelsWidgetDataSelector = () => {}
In this case, we get a strange error TypeError: (void 0) is not a function
pointing to the line const { orderData } = completeYourTripModel.useHotelsWidgetDataSelector();
What's even stranger is that if I add a console.log or debugger before this line, the error doesn't occur.
I tried to narrow down the possible causes and moved export const useHotelsWidgetDataSelector = () => {}
to model/temp.ts
, so now it looks like this:
// src/widgets/order/completeYourTrip/model/selectors/temp.ts
export const useHotelsWidgetDataSelector = () => {};
// src/widgets/order/completeYourTrip/model
export { useHotelsWidgetDataSelector } from './selectors/temp';
After this change, I started getting a panic during build:
Panic occurred at runtime. Please file an issue on GitHub with the backtrace below: https://github.com/web-infra-dev/rspack/issues
Message: Target module of reexport is not part of the concatenation (export 'Some("useHotelsWidgetDataSelector")')
Location: crates/rspack_core/src/concatenated_module.rs:2156
Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1: _blake3_compress_in_place_portable
at <unknown source file>
2: _napi_register_module_v1
at <unknown source file>
3: _napi_register_module_v1
at <unknown source file>
4: _napi_register_module_v1
at <unknown source file>
5: _napi_register_module_v1
at <unknown source file>
6: _wasmer_eh_personality
at <unknown source file>
7: _napi_register_module_v1
at <unknown source file>
8: _napi_register_module_v1
at <unknown source file>
9: _napi_register_module_v1
at <unknown source file>
10: _napi_register_module_v1
at <unknown source file>
11: _napi_register_module_v1
at <unknown source file>
12: _napi_register_module_v1
at <unknown source file>
13: _napi_register_module_v1
at <unknown source file>
14: _napi_register_module_v1
at <unknown source file>
15: _napi_register_module_v1
at <unknown source file>
16: _napi_register_module_v1
at <unknown source file>
17: _napi_register_module_v1
at <unknown source file>
18: _napi_register_module_v1
at <unknown source file>
19: __pthread_joiner_wake
at <unknown source file>
Unfortunately, I cannot provide a repository for reproduction at the moment, but if it's required to solve this issue, I'll try to create one in the near future.
Our config is large and modular, so I can't share all of it. Here are the loaders:
export function configureLoaderRules(options, paths) {
const cssModulesPrefix = options.cssModulesPrefix;
const swcPlugins = [];
if (shouldHideTestAttributes) {
swcPlugins.push([swcPluginTransformDataLocatorPath, { build_id: BUILD_ID }]);
}
if (isServerSideRender) {
swcPlugins.push([swcLoadableComponentsPath, {}]);
}
const swcLoaderConfig = {
loader: 'builtin:swc-loader',
options: {
module: {
type: checkIsOptimized(options.optimizationStrategy, OPTIMIZATION_STRATEGIES.OUTPUT_ES6)
? 'es6'
: 'commonjs',
ignoreDynamic: true,
noInterop: false,
},
isModule: 'unknown',
jsc: {
experimental: {
plugins: swcPlugins,
},
externalHelpers: true,
parser: {
syntax: 'typescript',
tsx: true,
decorators: true,
dynamicImport: true,
},
transform: {
legacyDecorator: true,
react: {
runtime: 'automatic',
development: !isProduction,
refresh: !isProduction && !isServerSideRender,
},
},
},
env: {
targets: browserslistConfig,
},
},
};
return [
{
test: /\.(jsx?|tsx?|cjs)$/,
exclude: [builtModulesRegexp, 'src/dicts/**/*.js', 'src/dictionary/**/*'],
use: [swcLoaderConfig],
},
{
test: /\.css$/,
use: configureStyleLoaders({ preprocess: 'external', cssModulesPrefix, getIdentName: options.getIdentName }),
},
{
test: /\.(scss|scss)$/,
include: [paths.dirs.src, paths.dirs.ottModules],
use: configureStyleLoaders({
preprocess: 'sass',
cssModulesPrefix,
getIdentName: options.getIdentName,
}),
},
{
test: /\.scss\.external$/,
include: [paths.dirs.src, paths.dirs.ottModules],
use: configureStyleLoaders({
preprocess: 'external',
cssModulesPrefix,
getIdentName: options.getIdentName,
}),
},
{
test: /\.svg$/,
resourceQuery: { not: [/inline/] }, // By default, SVGs are imported as components
use: ({ resource }) => {
return [
{
loader: svgrWebpackPath,
options: {
svgoConfig: {
plugins: [
{
name: 'preset-default',
params: {
overrides: {
removeViewBox: false,
},
},
},
{
name: 'prefixIds',
params: {
delim: '',
prefix: (_, { path: filepath }) => {
const filename = path.basename(filepath, '.svg');
const hash = createHash('md5').update(filepath).digest('hex').substr(0, 8);
return `${filename}-${hash}-`;
},
},
},
],
},
},
},
];
},
},
{
test: /\.(png|mp4|jpg)$/,
type: 'asset/resource',
},
].filter(Boolean);
}
Experiments don't affect the result in any way.
There might be a circular dependency, but on version 1.3.10 everything works correctly.
Reproduce link
No response
Reproduce Steps
Currently no reproduce steps