Skip to content

[Bug]: Unexpected behaviour after upgrading to 1.3.11 and later #10935

Open
@StaRenn

Description

@StaRenn

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions