Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ChunkLoadError > Loading chunk cypress-support-file failed #28644

Open
bene-starzengruber opened this issue Jan 5, 2024 · 100 comments
Open

ChunkLoadError > Loading chunk cypress-support-file failed #28644

bene-starzengruber opened this issue Jan 5, 2024 · 100 comments
Assignees
Labels
CT Issue related to component testing experimental: just-in-time-compile stage: awaiting response Potential fix was proposed; awaiting response

Comments

@bene-starzengruber
Copy link

Current behavior

After updating from [email protected] to [email protected], we are seeing this error occasionally on our CI runs.

ChunkLoadError: The following error originated from your test code, not from Cypress.
> Loading chunk cypress-support-file failed.
[(error: http://localhost:8080/__cypress/src/cypress-support-file.js)]
When Cypress detects uncaught errors originating from your test code it will automatically fail the current test.
Cypress could not associate this error to any specific test.
We dynamically generated a new test to display this failure.
[at __webpack_require__.f.j (http://localhost:8080/__cypress/src/runtime.js:272:29)]
[at <unknown> (http://localhost:8080/__cypress/src/runtime.js:126:40)]
at Array.reduce (<anonymous>)
[at __webpack_require__.e (http://localhost:8080/__cypress/src/runtime.js:125:67)]
[at Object.load (http://localhost:8080/__cypress/src/cypress-entry.js:33:192)]
[at <unknown> (http://localhost:8080/__cypress/runner/cypress_runner.js:110819:21)]
[at tryCatcher (http://localhost:8080/__cypress/runner/cypress_runner.js:1807:23)]
[at Object.gotValue (http://localhost:8080/__cypress/runner/cypress_runner.js:6476:18)]
[at Object.gotAccum (http://localhost:8080/__cypress/runner/cypress_runner.js:6465:25)]
[at Object.tryCatcher (http://localhost:8080/__cypress/runner/cypress_runner.js:1807:23)]

Unfortunately it is not reproducable locally, so I can not give you a repository to check.
I know that this might make it hard to investigate but maybe somebody already fell over the same issue or others are experiencing it as well.

The test fails around 30% of the time.

Desired behavior

No response

Test code to reproduce

no reproduction repository

Cypress Version

13.6.2

Node version

18.19.0

Operating System

Ubuntu 22.04.3

Debug Logs

No response

Other

No response

@jennifer-shehane
Copy link
Member

We made an update from webpack 4 to webpack 5 in 12.17.4, I wonder if it has anything to do with that upgrade. https://docs.cypress.io/guides/references/changelog#12-17-4

@jennifer-shehane jennifer-shehane added the stage: needs information Not enough info to reproduce the issue label Jan 5, 2024
@cubanx
Copy link

cubanx commented Jan 5, 2024

We are getting the same error also intermittently. I don't think we had it as far back as 12.17.4 but I can't say that for certain.

It only seems to happen toward the end of our Component Test runs. We have 1500+ component tests that we are running.

The following error originated from your test code, not from Cypress.

  > Loading chunk cypress-support-file failed.
(error: http://localhost:8080/__cypress/src/cypress-support-file.js)

When Cypress detects uncaught errors originating from your test code it will automatically fail the current test.

Cypress could not associate this error to any specific test.

We dynamically generated a new test to display this failure.
ChunkLoadError: The following error originated from your test code, not from Cypress.
  > Loading chunk cypress-support-file failed.
(error: http://localhost:8080/__cypress/src/cypress-support-file.js
When Cypress detects uncaught errors originating from your test code it will automatically fail the current test.
Cypress could not associate this error to any specific test.
We dynamically generated a new test to display this failure.
    at __webpack_require__.f.j (http://localhost:8080/__cypress/src/main.js:8702:29
    at <unknown> (http://localhost:8080/__cypress/src/main.js:8552:40
    at Array.reduce (<anonymous>)
    at __webpack_require__.e (http://localhost:8080/__cypress/src/main.js:8551:67
    at Object.load (http://localhost:8080/__cypress/src/main.js:1510:582
    at <unknown> (http://localhost:8080/__cypress/runner/cypress_runner.js:110819:21
    at tryCatcher (http://localhost:8080/__cypress/runner/cypress_runner.js:1807:23
    at Object.gotValue (http://localhost:8080/__cypress/runner/cypress_runner.js:6476:18
    at Object.gotAccum (http://localhost:8080/__cypress/runner/cypress_runner.js:6465:25
    at Object.tryCatcher (http://localhost:8080/__cypress/runner/cypress_runner.js:1807:23
[Open in build log](https://teamcity.haivision.com/buildConfiguration/CineNet4x_Projects_CypressComponents/690401?hideProblemsFromDependencies=false&expandBuildTestsSection=true&hideTestsFromDependencies=false&expandBuildChangesSection=true&showLog=690401_2000000247_2000000247&logFilter=debug)

@werge2121
Copy link

Same for us too

@amir1218
Copy link

amir1218 commented Jan 9, 2024

We have been running into this sporadically when Component testing after migrating from CY 12.x to 13.6.2. Similarly to cases above, it happens towards the end of running a batch of suites (files) together.

Screenshot 2024-01-08 at 5 44 43 PM

Resorted to running cypress with DEBUG='cypress:*'. This is an instance of a crash:

 cypress: server: reporter got mocha event 'test'
with args: [u {
    title: 'An uncaught error was detected outside of a test',
    fn: [Function: o] {
        toString: [Function(anonymous)]
    },
    body: '() => {\n        throw err;\n      }',
    async: undefined,
    sync: undefined,
    _timeout: 2000,
    _slow: 250,
    _enableTimeouts: true,
    timedOut: undefined,
    _retries: -1,
    _currentRetry: 0,
    pending: false,
    type: 'test',
    duration: undefined,
    state: 'skipped',
    parent: p {
        title: '',
        ctx: {},
        suites: [],
        tests: [Array],
        pending: false,
        _beforeEach: [],
        _beforeAll: [],
        _afterEach: [],
        _afterAll: [],
        root: true,
        _timeout: 2000,
        _enableTimeouts: true,
        _slow: 250,
        _bail: false,
        _retries: -1,
        _onlyTests: [],
        _onlySuites: [],
        delayed: false,
        _events: [Object: null prototype],
        _eventsCount: 1,
        file: 'VALID_PATH_TO_FILE_DEDACTED',
        id: 'r1',
        type: 'suite'
    },
    id: 'r2',
    _testConfig: {
        testConfigList: [],
        unverifiedTestConfig: {}
    },
    order: 1,
    invocationDetails: {
        function: 'Object.getInvocationDetails',
        fileUrl: 'http://localhost:8080/__cypress/runner/cypress_runner.js',
        originalFile: 'http://localhost:8080/__cypress/runner/cypress_runner.js',
        line: 97377,
        column: 17,
        whitespace: '    ',
        stack: 'Error\n' + '    at Object.getInvocationDetails 
(http://localhost:8080/__cypress/runner/cypress_runner.js:97377:17)\n' + '    at Suite.addTest 
(http://localhost:8080/__cypress/runner/cypress_runner.js:145737:85)\n' + '    at Object.createRootTest 
(http://localhost:8080/__cypress/runner/cypress_runner.js:145872:21)\n' + '    at Object.normalizeAll 
(http://localhost:8080/__cypress/runner/cypress_runner.js:163115:17)\n' + '    at CDPBrowserSocket.<anonymous> 
(http://localhost:8080/__/assets/index-caf2649c.js:146264:46)\n' + '    at CDPBrowserSocket.on2 
(http://localhost:8080/__/assets/index-caf2649c.js:34575:11)\n' + '    at Emitter2.emit 
(http://localhost:8080/__/assets/index-caf2649c.js:34616:24)\n' + '    at http://localhost:8080/__/assets/index-caf2649c.js:37709:15'

    }
}] + 9 ms

There is a lot in the logs that makes it hard to share but please do let us know if we should be looking for or can share anything useful to help unraveling this.

@cubanx
Copy link

cubanx commented Jan 10, 2024

Does anyone know of a way to suppress this error until we can get a resolution?

@rbecheras
Copy link

We have a very similar issue with another file: node_modules_core-js_modules_es_array_concat_js-node_modules_babel_runtime_helpers_esm_define-ec4858

1) An uncaught error was detected outside of a test

  0 passing (433ms)
  1 failing

  1) An uncaught error was detected outside of a test:
     ChunkLoadError: The following error originated from your test code, not from Cypress.

  > Loading chunk node_modules_core-js_modules_es_array_concat_js-node_modules_babel_runtime_helpers_esm_define-ec4858 failed.
(error: http://localhost:8080/__cypress/src/node_modules_core-js_modules_es_array_concat_js-node_modules_babel_runtime_helpers_esm_define-ec4858.js)

When Cypress detects uncaught errors originating from your test code it will automatically fail the current test.

Cypress could not associate this error to any specific test.

It makes our test suite pass sometimes but fail randomly and frequently, on a component or another, randomly.

@jennifer-shehane jennifer-shehane added the CT Issue related to component testing label Jan 17, 2024
@benpatterson
Copy link
Member

I'm leaving behind some notes after digging into this further.

We are experiencing this error on ~9% of our component test builds. (I can't remember offhand how many tests that entails.)

Indeed error messages above are consistent with what we see, here's an excerpt (with a slight edit on chunk name tbh):

  1) An uncaught error was detected outside of a test:
     ChunkLoadError: The following error originated from your test code, not from Cypress.

  > Loading chunk name1-name2-file~spec-11~spec-14~spec-15~spec-17~spec-22~spec-23~spec-25~spec-27~spec-28~43d59dbf failed.

It includes the localhost path as well on the next line (which I left out here).

Noteworthy...going up a few lines in the build, we are seeing something like this (I changed more file names out of caution):

  Running:  dir/myComponentSpec.spec.tsx                                                  
  Estimated: 1 second


ℹ 「wdm」: Compiling...
  (Attempt 1 of 3) An uncaught error was detected outside of a test
ℹ 「wdm」: wait until bundle finished: /<root+directory>/related-file~spec-34.js
ℹ 「wdm」: wait until bundle finished: /<root+directory>/related-file.js
  (Attempt 2 of 3) An uncaught error was detected outside of a test
  1) An uncaught error was detected outside of a test

It appears to me that the ChunkLoadError occurs because the next test is running before webpack compilation is completed on the devserver. I think this includes related CSS compilations, but honestly I don't know if that's all the time or a subset of examples.

Ultimately I'm convinced the next test needs to wait until compilation completes and the devserver has updated the cache. I attempted to set devserver settings around hot reload, etc, but those didn't work -- likely because the test is still trying to serve the page and is not waiting for the devserver to signal it's up to date.

When it comes to waiting for compilation to complete, we do have logic around this in CypressCTWebpackPlugin in this function. As-written, it's awaiting specs, and this is why I'm wondering if we need something to wait for related assets, too. Regardless, I think we need a way of ensuring all compilation completes, including any styling, before proceeding to the next test.

There had been a previous PR that leveraged the webpack devserver's index HTML file, which I believe would yield the result I'm thinking of (change here). That PR was intended to fix a situation specific to MacOS version, but I'm optimistic it could resolve the ChunkLoadError. The PR was merged but the code in the file today is older than the PR, so I don't know if it was rolled back at a later time.

@hogatejon
Copy link

Just commenting to say I am also experiencing this issue. Have traced it down to being introduced by 12.17.4, any version below this seems to be completely fine on our CI runs.

@jennifer-shehane
Copy link
Member

Found this in our own tests: https://cloud.cypress.io/projects/ypt4pf/runs/53776/overview/c7135bc3-5fcb-4555-8497-c7b93658a628?roarHideRunsWithDiffGroupsAndTags=1

@jennifer-shehane
Copy link
Member

We're spiking into this to see if we can find what's causing this.

@jennifer-shehane jennifer-shehane added stage: investigating Someone from Cypress is looking into this and removed stage: needs information Not enough info to reproduce the issue labels Feb 5, 2024
@TomaszG
Copy link
Contributor

TomaszG commented Feb 6, 2024

Same here. Since the v12 upgrade (I don't recall what the version was, though), we have gotten this on GitHub Actions CI sometimes. My initial thought was that it was caused by the first spec in our test suite. However, changing the order of suites didn't help. It's just that the first spec fails.

My workaround for this was to amend the run script:
cypress run --component --spec './**/OurFirstSpec.cy.js' || true && cypress run --component
So, the first attempt could fail, but the second run was 100% successful. Since upgrading from 13.6.3 to 13.6.4, the second run also fails for around 30% of runs.

Cypress 13.6.4
Node.js 21.6.1
NextJS 14.1.0

BTW, this seems to be related or even the same: #16421

@AtofStryker
Copy link
Contributor

AtofStryker commented Feb 7, 2024

Hey all. Sorry for the delay on an update here. I've been investigating the issue heads down for about a week now. I'm able to reproduce the error on my end but only at the start of the run and sparingly in the middle of the run. I think there are two issues possibly going on here

At the start of the run

At the end of webpack compilation, the dev-server:compile:success event is emitted by the cypress webpack dev server, but nothing is actively listening to this event. The only exception is watchForChanges being enabled inside the SocketCT handler inside the Cypress server, which is unset in run mode and isn't applicable here.

In other words, we can get ourselves into a race condition where webpack takes a long time to build all assets, but the cypress run has begun and is able to resolve the index.html chunk, but not other chunks in the test because they are not present in the output directory. That is what is happening in this example:

support_file_fallover_with_retries

In the middle of a run

Adding to what @benpatterson mentioned and a bit more complicated to reproduce, but does happen, is webpack-dev-server recompiling in the middle of a test. We can see something like this here with some logging I added in this diagnostic binary.

Test starts. Something triggers webpack-dev-server to recompile. test fails with chunk error

1

Just in time recompile (just by chance) while the browser is relaunching for the second test to run. second test passes

2

For this, it seems like the dev-server is watching assets and recompiling. What I need to further investigate is

  • what is being compiled here and does it need to be compiled? Maybe something configuration-wise changed in the webpack.config from version 4 to 5.

Waiting for the dev server to compile is a bit tricky as it can trigger a compilation at any time, but if we can answer the above question, it puts us in a better position to solve the problem correctly.

Some questions that might be helpful for us in fixing the issue

  • Does the error happen at the beggining of the cypress run or in the middle? It sounds like the first case for @TomaszG where compilation fails in the beginning of the test and the second case for @benpatterson where the test fails in the middle. I am curious with others running into this issue where it is happening for you.
  • What are the stats on your webpack build? Any idea how long it is taking for webpack to recompile?
  • if willing, we have a diagnostic binary build here (this is not a fix) that you can install and run with the following flags CYPRESS_INTERNAL_BROWSER_CONNECT_TIMEOUT=120000 DEBUG='cypress:server:open_project,cypress:webpack-dev-server:CypressCTWebpackPlugin npx cypress run --component ... which might give us an idea what webpack is doing under your test.

I will give more updates as soon as I have them. I appreciate everyones patience with the issue resolution.

@TomaszG
Copy link
Contributor

TomaszG commented Feb 8, 2024

@AtofStryker, great investigation and summary. I can confirm that the error happens only at the beginning of the run for me; I haven't noticed it in the middle. I also haven't noticed any webpack re-compilation in the middle of the run.

The compilation times on CI are around 19 seconds for the first run (which is allowed to fail) and 14 seconds for the second run.

@AtofStryker
Copy link
Contributor

@bene-starzengruber @cubanx @werge2121 @amir1218 @rbecheras @TomaszG what version of webpack-dev-server are you all using? It should be pretty easy to tell with either in your package.json or from debugging with cypress via DEBUG=cypress:webpack-dev-server:devServer npx cypress run --component ...

I think the recompiling in the middle is related to either a bug or a misconfiguration within webpack-dev-server@3 . The documentation is difficult to find since v3 hasn't been released or maintained for about 3 years, but from what I can see everything looks configured correctly on our end. Updating to webpack-dev-server@4 seems to resolve the issue of the mid run recompilation. Cypress ships with webpack-dev-server@4 with @cypress/webpack-dev-server unless you explicitly install v3

@TomaszG I would be curious if using the diagnostic binary while setting CYPRESS_INTERNAL_BROWSER_CONNECT_TIMEOUT=120000 resolves your issue of the initial chunk load error failure if you have a chance to use it.

@werge2121
Copy link

werge2121 commented Feb 9, 2024

We should just be using the default devserver that comes with cypress, so 4. For us its happening in the middle of the run usually. It takes around 5-6 seconds for the webpack to compile usually.

@cwillsea-mtg
Copy link

My team is using the default dev server that comes with cypress:

  component: {
    devServer: {
      bundler: 'webpack',
      framework: 'next',
    },
  },

The errors seem to always happen at the start of a test file, but pop up in random places in our test suite. For example, here is a recent failure in the 73th test file out of a suite of 90 where the other 89 runs all passed (edited to remove component/file names):

  Running:  components/COMPONENT_NAME.cy.tsx                          (73 of 90)


  1) An uncaught error was detected outside of a test

  0 passing (665ms)
  1 failing

  1) An uncaught error was detected outside of a test:
     ChunkLoadError: The following error originated from your test code, not from Cypress.

  > Loading chunk vendors-node_modules_SOME_STRING.js failed.
(error: http://localhost:8080/__cypress/src/vendors-SOME_STRING.js)

When Cypress detects uncaught errors originating from your test code it will automatically fail the current test.

Cypress could not associate this error to any specific test.

We dynamically generated a new test to display this failure.
      at __webpack_require__.f.j (http://localhost:8080/__cypress/src/webpack.js:340:29)
      at <unknown> (http://localhost:8080/__cypress/src/webpack.js:137:40)
      at Array.reduce (<anonymous>)
      at __webpack_require__.e (http://localhost:8080/__cypress/src/webpack.js:136:67)
      at Object.load (http://localhost:8080/__cypress/src/main.js:485:577)
      at <unknown> (http://localhost:8080/__cypress/runner/cypress_runner.js:110819:21)
      at tryCatcher (http://localhost:8080/__cypress/runner/cypress_runner.js:1807:23)
      at Object.gotValue (http://localhost:8080/__cypress/runner/cypress_runner.js:6476:18)
      at Object.gotAccum (http://localhost:8080/__cypress/runner/cypress_runner.js:6465:25)
      at Object.tryCatcher (http://localhost:8080/__cypress/runner/cypress_runner.js:1807:23)


  (Results)

  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ Tests:        1                                                                                │
  │ Passing:      0                                                                                │
  │ Failing:      1                                                                                │
  │ Pending:      0                                                                                │
  │ Skipped:      0                                                                                │
  │ Screenshots:  1                                                                                │
  │ Video:        false                                                                            │
  │ Duration:     0 seconds                                                                        │
  │ Spec Ran:     components/COMPONENT_NAME.cy.tsx                             │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘

The frequency with which these errors occur has been increasing as we add more test files. If there's any debug/diagnostic config we can set to get more info happy to try as this issue is happening frequently in our CI

@anilanar
Copy link

anilanar commented Feb 13, 2024

@AtofStryker

It would be great if cypress team would develop a pre-bundle option for runs in the CI. We had similar issues with MSW in our component tests. Browser stops trying when a service worker script takes more than ~60 seconds to load. We had to slightly modify the default dev server to "prebuild" service worker file so that when it's actually needed, it's already built and is ready to serve by the dev server:

    devServer: async ({ specs, cypressConfig, devServerEvents }) => {
      const result = await devServer({
        specs,
        cypressConfig,
        devServerEvents,
        webpackConfig,
      });
      // trigger a build for MSW so that it doesn't time out
      // in CI when trying to initialize msw
      await fetch('http://localhost:8080/mockServiceWorker.js');
      return result;
    },

So if there were an option to pre-bundle everything, flaky tests due to middle of the run builds taking too long would be long gone.

In user land, this can be achieved by manually pre-bundling and then by creating a custom dev-server that serves pre-bundled files. But it's not very elegant, Cypress team can do better by introducing a new config for pre-bundling.

@AtofStryker
Copy link
Contributor

Hey all. Just a few updates.

Mid recompilation with webpack-dev-server has stopped with the update from v3 to v4, which is great! However, we are still hitting ChunkLoadErrors 🙁 .

This issue has been extremely challenging to reproduce, but we have a few theories. My guess is that there are chunk loading issues associated with the main bundle mainly due to us bundling every component test, regardless of what is used under test. The only exception to this is if the --spec option is leveraged to pass in specs. For example:

  • if cypress open is used to to develop a single component test and there are 39 other component tests, ALL 40 component tests are compiled when the app is launched.
  • If cypress run is used to test all specs, ALL component tests are compiled before the tests are initialized.
  • If cypress run is used to test multiple specs via the --parallel flag in CI, ALL component tests are compiled before the tests are initialized, regardless of what tests are run.
  • If cypress run is used to test a single spec via the spec argument, ONE single spec is compiled before the test is run.
  • If cypress run is used to test multiple specs via the spec argument, ONLY THE SPECS PASSED IN are compiled before the test is run.

The larger N is in this case (our example above was 40), the worse the dev server scales as far as building is concerned. Each spec is considered its own entry point in webpack. We don't have proof that reducing the bundle size would fix the chunk errors, but I think this is in large part of the problem as this seems to happen mostly in projects where there are dozens of CT tests.

In most cases, even if the build takes minutes, cypress waits for the dev server to return a response before executing tests. @anilanar In other words, we are pre-bundling everything needed under test already but the assets are not loaded into the browser all at once, which might explain the service worker issue you are running into and I'm glad you were able to find a solution! Something is causing the chunk to fail to load meaning it either doesn't exist, or it timed out loading. Since the assets are held in memory, it is difficult to figure out which has occurred. Either way, I am not convinced flaky tests are due to builds taking too long.

What we are trying internally with one of our projects where this error happens frequently, is to leverage the --spec option to group our tests under execution and use circleci to split the tests per container (@cwillsea-mtg this might be something you can try depending on your setup and would be great feedback for us if it lessens or resolve the issue for you). This will only bundle the assets needed under test, reducing the chunk and bundle sizes under test and likely the stress to load them into memory. This could give us direction on if we need to change some aspects of the dev server depending on whether ChunkLoadErrors continue to surface or not and our ability to tune them. I will report back when I gather more data/information.

@cubanx
Copy link

cubanx commented Feb 14, 2024

@AtofStryker We are using whatever webpack-dev-server comes with Cypress, so I assume it is version 4.

I concur that it seems large tests suites seem to cause this issue. To both speed up our test runs and reduce the frequency of this error, I have some PowerShell scripts that use the --spec parameter to split up the test suite and run a subset of our component tests in parallel.

This reduced the number of test per run from ~1500 to ~400 per run, and the error seems to have abated.

If this helps at all, even running interactively, if we load all our Component tests and then try to run them, there is a significant delay between update/reloads or if you switch test files.

I use another PowerShell script to modify the specPattern inside the cypress.config.ts to limit the number of tests I'm running interactively to just a handful. It's helpful both for speed ups of test reloading and to reduce the test clutter since we have so many.

We also tried switching the Component Server in the past to vite. The interactive tests became too slow to use. We are currently running in a bifurcated fashion, with the full up dev server running vite, but the Component Tests running webpack.

I am actually about to leave the current position I'm in, but if there's any diagnostics or info that would help you, I'll be here until March 1st.

Thanks for your work on this!

@anilanar
Copy link

anilanar commented Feb 14, 2024

@AtofStryker Webpack supports lazy loading with async chunks (code splitting) therefore it is definitely possible to make a test suite start downloading and bundling stuff in the middle of the run. Webpack dev server doesn't initiate building an async chunk unless that chunk is requested by the client with an async import.

This issue can be solved with pre-bundling. It can probably be solved without pre-bundling too, if there is a way for webpack dev server to report any async chunks it finds during a build. Then those async chunks can be requested manually (like I did with the service worker) to manually trigger a build for them before running a test. Keep in mind that this needs to be done recursively, until no async chunks are left.

Another idea is to disable code splitting, e.g. https://webpack.js.org/plugins/limit-chunk-count-plugin/

I'm not really sure if this has anything to do with your ChunkLoadErrors though. What I know is, if an async import fails, it will reject with a ChunkLoadError.


A simple test that downloads an async chunk in the middle of the run:

export const Example = () => {
    const [done, setDone] = useState(false);
    return (
        <button
            onClick={async () => {
                await import("./path-to-something-very-slow-to-bundle");
                setDone(true);
            }}
        >
            {done ? "DONE" : "Click me to download async chunk"}
        </button>
    );
};
it('will download async chunk', () => {
  cy.mount(<Example />);
  cy.get('button').click();
  cy.contains('DONE').should('be.visible');
});

Edit: I still think it's better to pre-bundle and run cypress without a dev server and without a file watcher and without no recompiles for CI use cases; instead of trying to fight file watcher/unnecessary rebuilds that can be caused by myriads of webpack plugins (and potentially unintentional bugs in them). I think using dev-server on CI is picking a wrong fight. Consider this: no build tool or no test tool runs in watch mode on CI. So cypress is opening a can of worms by running in watch mode.

@amir1218
Copy link

@AtofStryker We are on webpack-dev-server 4.15.1

@werge2121
Copy link

Any updates?

@anilanar
Copy link

anilanar commented Feb 22, 2024

Try this workaround, as I previously suggested:

// cypress.config.js

const { defineConfig } = require('cypress');
const { devServer } = require('@cypress/webpack-dev-server');

module.exports = defineConfig({
    ...
    devServer: async ({ specs, cypressConfig, devServerEvents }) => {
      const result = await devServer({
        specs,
        cypressConfig,
        devServerEvents,
        webpackConfig,
      });
      // prebuild files that can cause test failures when they take too long
      // during runs
      await Promise.all([
        fetch('http://localhost:8080/__cypress/src/cypress-support-file.js'),
        // prebuild any other file, such as service workers here 
      ]);
      return result;
    },
});

If other async chunks are causing middle-of-the-run builds, then try using https://webpack.js.org/plugins/limit-chunk-count-plugin/ and limit your chunk count to 1. Or try turning off chunk splitting, see https://webpack.js.org/plugins/split-chunks-plugin/#optimizationsplitchunks .

Again, I doubt this is a misconfiguration in webpack dev server. Async chunks are normal things that optimize initial bundle size by lazy loading things later. They are usually caused by async imports, but if you don't have an async import on your side or if you don't know what that even means, then it must be used by one of the libraries you use.

This is a problem with async chunks triggering builds and those builds not finishing before test times out.

The solution is one of:

  1. disable all async chunks (see https://webpack.js.org/plugins/split-chunks-plugin/#optimizationsplitchunks). Do a build with the same webpack config and make sure webpack produces a single js file.
  2. cypress's dev server integration reads async chunks found by webpack dev server and trigger a build for them (with webpack compiler api or simply by triggering a fetch). Webpack dev server might find new async chunks in those async chunks, so they must be prebuilt too until no async chunk is left.
  3. cypress allows us to prebundle everything (e.g. do a build for all components) and use those prebuilt assets, e.g. by replacing webpack dev server with a simple http server that serves those static files.

Edit: typo

@TomaszG
Copy link
Contributor

TomaszG commented Feb 22, 2024

@AtofStryker I've tried what you've recommended, so I've set CYPRESS_INTERNAL_BROWSER_CONNECT_TIMEOUT=120000 and also used your diagnostic binary based on 13.6.5 and after a couple of runs, it seems that there are no failures. Here's the log output from the tests:

    cypress:webpack-dev-server:start using webpack-dev-server v4 +0ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin beforeCompile +0ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin beforeCompile projectRoot: /home/runner/work/<REDACTED>/apps/client +0ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin beforeCompile supportFile: /home/runner/work/<REDACTED>/apps/client/cypress/support/component.js +0ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin beforeCompile indexHtmlFile: cypress/support/component-index.html +0ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin beforeCompile: compile hooks not registered. Invoking callback. +0ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin addCompilationHooks +45ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin addCompilationHooks: Webpack 5 detected +5ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin beforeCompile +25ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin beforeCompile projectRoot: /home/runner/work/<REDACTED>/apps/client +14ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin beforeCompile supportFile: /home/runner/work/<REDACTED>/apps/client/cypress/support/component.js +0ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin beforeCompile indexHtmlFile: cypress/support/component-index.html +0ms
  <i> [webpack-dev-server] Project is running at:
  <i> [webpack-dev-server] Loopback: http://127.0.0.1:8080/
  <i> [webpack-dev-server] Content not from webpack is served from '/home/runner/work/<REDACTED>/apps/client/public' directory
    cypress:webpack-dev-server:devServer Component testing webpack server 4 started on port 8080 +0ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin beforeCompile: compile hooks registered, filtering out files that have been removed by the file system but not yet detected by the onSpecsChange handler +53ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin invoking callback +0ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin addCompilationHooks +7ms
    cypress:webpack-dev-server:CypressCTWebpackPlugin addCompilationHooks: Webpack 5 detected +0ms
  We detected that you have versions of dependencies that are not officially supported:
  
   - `next`. Expected ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0, found 14.1.0.
  
  If you're experiencing problems, downgrade dependencies and restart Cypress.
  
    cypress:webpack-dev-server:webpack projectRoot: /home/runner/work/<REDACTED>/apps/client, files: <REDACTED> +0ms
  
  ====================================================================================================
  
    (Run Starting)
  
  tput: No value for $TERM and no -T specified
    ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
    │ Cypress:        13.6.5                                                                         │
    │ Browser:        Electron 114 (headless)                                                        │
    │ Node Version:   v21.6.2 (/opt/hostedtoolcache/node/21.6.2/x64/bin/node)                        │
    │ Specs:          34 found (<REDACTED>)                                                          │
    │ Searched:       **/*.cy.{js,jsx,ts,tsx}                                                        │
    │ Experiments:    experimentalWebKitSupport=true                                                 │
    └────────────────────────────────────────────────────────────────────────────────────────────────┘
  
  
  ────────────────────────────────────────────────────────────────────────────────────────────────────
                                                                                                      
    Running:  <REDACTED>.cy.js                                                               (1 of 34)
    cypress:webpack-dev-server:CypressCTWebpackPlugin compiler hooks done. emitting "dev-server:compile:success" to start the runner +37s
  98 assets
  5238 modules
  client (webpack 5.86.0) compiled successfully in 37206 ms

I wonder if it's OK that compiler hooks done is logged after the run starts...

@eblocha
Copy link

eblocha commented Sep 25, 2024

Another data point: we updated and enabled the JIT feature, but it didn't resolve the ChunkLoadError problem.

We were able to get tests to run reliably using anilanar's solution. Here's an example config for Angular:

Before:

module.exports = {
  component: {
    devServer: {
      framework: 'angular',
      bundler: 'webpack',
      options: {
        projectConfig: { /* ... */ }
      },
    },
  },
};

After:

const { devServer } = require('@cypress/webpack-dev-server');

module.exports = {
  component: {
    devServer: async ({ specs, cypressConfig, devServerEvents }) => {
      const result = await devServer({
        framework: 'angular',
        specs,
        cypressConfig,
        devServerEvents,
        options: {
          projectConfig: { /* ... */ },
        },
      });
      await Promise.all([
        fetch('http://localhost:8080/__cypress/src/cypress-support-file.js'),
      ]);
      return result;
    },
  },
};

@jennifer-shehane
Copy link
Member

@eblocha Please ensure the flag is taking effect by checking your resolved configuration. We haven't had any reports of this flag not fixing the chunk load errors and would love to investigate further if you're seeing it with the experimental flag. https://docs.cypress.io/guides/references/configuration#Resolved-Configuration

@rgala
Copy link

rgala commented Sep 30, 2024

For me this happens only on Azure pipelines. I have the flag set and I can see it's being used:

2024-09-30T06:57:45.2191181Z (Run Starting)
2024-09-30T06:57:45.2193951Z
2024-09-30T06:57:45.2390679Z
2024-09-30T06:57:45.2406839Z │ Cypress: 13.15.0
2024-09-30T06:57:45.2410207Z │ Browser: Edge 129 (headless)
2024-09-30T06:57:45.2414079Z │ Node Version: v20.17.0 (/opt/hostedtoolcache/node/20.17.0/x64/bin/node)
2024-09-30T06:57:45.2416069Z │ Specs: 2 found (core/layout/containers/layout-section/layout-section-component.cy.ts,
2024-09-30T06:57:45.2417979Z │ features/profile/containers/profile-page/profile-page.component.cy.ts)
2024-09-30T06:57:45.2419747Z │ Searched: src/**/*.cy.ts
2024-09-30T06:57:45.2421458Z │ Experiments: experimentalJustInTimeCompile=true

I have attached logs from successful and unsuccessful runs with net and http enabled in Node. Hope this helps.

In case of an error, there is no http request logged for http://localhost:8080/__cypress/src/cypress-support-file.js url that would come from referer of value http://localhost:8080/__cypress/iframes/index.html?specPath=/home/vsts/work/1/s/src/app/core/layout/containers/layout-section/layout-section-component.cy.ts. Looks like it is failing on creating a connection and does not even try to make a http request.

ok.txt
error.txt

@AtofStryker
Copy link
Contributor

For me this happens only on Azure pipelines. I have the flag set and I can see it's being used:

2024-09-30T06:57:45.2191181Z (Run Starting)
2024-09-30T06:57:45.2193951Z
2024-09-30T06:57:45.2390679Z
2024-09-30T06:57:45.2406839Z │ Cypress: 13.15.0
2024-09-30T06:57:45.2410207Z │ Browser: Edge 129 (headless)
2024-09-30T06:57:45.2414079Z │ Node Version: v20.17.0 (/opt/hostedtoolcache/node/20.17.0/x64/bin/node)
2024-09-30T06:57:45.2416069Z │ Specs: 2 found (core/layout/containers/layout-section/layout-section-component.cy.ts,
2024-09-30T06:57:45.2417979Z │ features/profile/containers/profile-page/profile-page.component.cy.ts)
2024-09-30T06:57:45.2419747Z │ Searched: src/**/*.cy.ts
2024-09-30T06:57:45.2421458Z │ Experiments: experimentalJustInTimeCompile=true

I have attached logs from successful and unsuccessful runs with net and http enabled in Node. Hope this helps.

In case of an error, there is no http request logged for http://localhost:8080/__cypress/src/cypress-support-file.js url that would come from referer of value http://localhost:8080/__cypress/iframes/index.html?specPath=/home/vsts/work/1/s/src/app/core/layout/containers/layout-section/layout-section-component.cy.ts. Looks like it is failing on creating a connection and does not even try to make a http request.

ok.txt error.txt

@rgala are you able to share the contents of your support file? Either the support file bundle must be very large, or the machine in azure pipelines is running out of resources. Are you able to share the resource consumption as well?

@rgala
Copy link

rgala commented Sep 30, 2024

Hi @AtofStryker. The cypress-support-file.js is almost 23MB. I'd rather not share it in public. Is there any way I can provide it to you privately?

Lack of resources on Azure VM was my first suspicion, so I ran a free command in a loop with 100ms intervals while executing the Cypress tests and the memory was fine I think. There was some swapping but very small (I have attached the output).

In overall, it takes very long to execute Cypress tests on Azure compared to Ubuntu running on WSL2 (16 seconds vs 120).

Let me know if you need any additional info.

free.txt

@jennifer-shehane
Copy link
Member

@rgala Yes, can you share it to [email protected]? Thanks!

@rgala
Copy link

rgala commented Oct 1, 2024

@jennifer-shehane I have sent the file today

@AtofStryker
Copy link
Contributor

@jennifer-shehane I have sent the file today

@rgala we received the support file. Thank you for sending it over. This looks like the bundled support file. Are you able to send the pre compiled support file and the webpack config you are using to compile? a tiny zipped project would be great. It can contain node_modules as well as I am guessing there are some packages that do not exist on npm?

@rgala
Copy link

rgala commented Oct 2, 2024

Hello @AtofStryker, I have sent a sample project to support mailbox.

@jennifer-shehane
Copy link
Member

@rgala Hi, we received the zip in the support mailbox, but it appears to be password protected upon opening. Could you provide that?

@rgala
Copy link

rgala commented Oct 2, 2024

I did provide in the e-mail. The password is cypress :)

@jennifer-shehane
Copy link
Member

@rgala Hi, that password doesn't appear to be working

@rgala
Copy link

rgala commented Oct 2, 2024

Are you opening this as a 7Zip archive? I just tried the password and it worked.

@jennifer-shehane
Copy link
Member

@rgala Yes, it's not working for several people on our side.

@rgala
Copy link

rgala commented Oct 2, 2024

I put another one without a password and sent a link. Please try.

@jennifer-shehane
Copy link
Member

@rgala Thanks, we're looking at it now.

@muratkeremozcan
Copy link

muratkeremozcan commented Oct 9, 2024

@jennifer-shehane @AtofStryker

I have reported previously that experimentalJustInTimeCompile made things better for the chunkLoad error.

However, as the component suite grows, we still sporadically see it, with a failure rate of 16% (the Cypress Cloud link should be accessible by Cypress employees).

We are somewhat desperate for a solution, as we are vested into component testing with over 500 files/1600 it blocks.

Unless there is a solution, the only plausible way forward for us could be to execute tests based on source code changes. We would be missing a lot of issues, but we would not be alerted falsely (and cost 1600+ runs from our credit) at a 16% rate.

@AtofStryker
Copy link
Contributor

@jennifer-shehane @AtofStryker

I have reported previously that experimentalJustInTimeCompile made things better for the chunkLoad error.

However, as the component suite grows, we still sporadically see it, with a failure rate of 16% (the Cypress Cloud link should be accessible by Cypress employees).

We are somewhat desperate for a solution, as we are vested into component testing with over 500 files/1600 it blocks.

Unless there is a solution, the only plausible way forward for us could be to execute tests based on source code changes. We would be missing a lot of issues, but we would not be alerted falsely (and cost 1600+ runs from our credit) at a 16% rate.

Hey @muratkeremozcan.

Thank you for the feedback! I am taking a look at the failures and can see the chunk load error. I am seeing something like :

The following error originated from your test code, not from Cypress.


  > Loading chunk vendors~cypress-support-file~spec-1~spec-10~spec-100~spec-101~spec-102~spec-104~spec-105~spec-106~sp~41b558d7 failed.

(error: http://localhost:3000/__cypress/src/vendors~cypress-support-file~spec-1~spec-10~spec-100~spec-101~spec-102~spec-104~spec-105~spec-106~sp~41b558d7.js)

When Cypress detects uncaught errors originating from your test code it will automatically fail the current test.

Cypress could not associate this error to any specific test.

We dynamically generated a new test to display this failure.

Is there something specific about compiling vendor code in your webpack config? The reason I ask is each spec should only compile assets related to itself, so there should be no chunking of the specs like what we see here. It almost looks like the experimentalJustInTimeCompile flag is not turned on here or something custom is happening. Are you able to send a reproduction to the support team?

@muratkeremozcan
Copy link

@jennifer-shehane @AtofStryker
I have reported previously that experimentalJustInTimeCompile made things better for the chunkLoad error.
However, as the component suite grows, we still sporadically see it, with a failure rate of 16% (the Cypress Cloud link should be accessible by Cypress employees).
We are somewhat desperate for a solution, as we are vested into component testing with over 500 files/1600 it blocks.
Unless there is a solution, the only plausible way forward for us could be to execute tests based on source code changes. We would be missing a lot of issues, but we would not be alerted falsely (and cost 1600+ runs from our credit) at a 16% rate.

Hey @muratkeremozcan.

Thank you for the feedback! I am taking a look at the failures and can see the chunk load error. I am seeing something like :

The following error originated from your test code, not from Cypress.


  > Loading chunk vendors~cypress-support-file~spec-1~spec-10~spec-100~spec-101~spec-102~spec-104~spec-105~spec-106~sp~41b558d7 failed.

(error: http://localhost:3000/__cypress/src/vendors~cypress-support-file~spec-1~spec-10~spec-100~spec-101~spec-102~spec-104~spec-105~spec-106~sp~41b558d7.js)

When Cypress detects uncaught errors originating from your test code it will automatically fail the current test.

Cypress could not associate this error to any specific test.

We dynamically generated a new test to display this failure.

Is there something specific about compiling vendor code in your webpack config? The reason I ask is each spec should only compile assets related to itself, so there should be no chunking of the specs like what we see here. It almost looks like the experimentalJustInTimeCompile flag is not turned on here or something custom is happening. Are you able to send a reproduction to the support team?

I am sending the zipped repo to support right away.

Worst case scenario, is there a way we can flag the ChunLoadError a false positive, and not have things fail but perhaps just skip when we see it?

https://files.slack.com/files-pri/T047EH9G6G2-F07RK079PV0/image.png

@AtofStryker
Copy link
Contributor

@rgala from looking at the reproduction you sent us, it looks like the support file has about 14.3MB in source maps from Cypress adding inline-source-maps to the webpack configuration. If you are willing to install @cypress/webpack-dev-server and use patch-package to remove this line of code we can see if it fixes the issues you are experiencing in Azure. Is that something you would be able to try to help us further diagnose the issue for a possible solution?

@muratkeremozcan
Copy link

@AtofStryker

regarding experimentalJustInTimeCompile
We do see it in console.log, but we do not actually see it in the runner, there is no entry for it anymore, perhaps since a recent version.

I sent you a link of the zipped repo on Discord, if you can log in within 24 hours.

@muratkeremozcan
Copy link

muratkeremozcan commented Oct 11, 2024

Bill and I found that when intending to upgrade to v13.15.0, I must have typed in 13.5.0, that is whay it seemed like the ChunkLoadError has come back. We used 13.15.0 and the error went away with the flag experimentalJustInTimeCompile

However, we uncovered a new issue where time to time, the last component test does not crash, but hangs there indefinately.

What kind of logs or debugging can I give to aid with diagnosing this one?

image

@rgala
Copy link

rgala commented Oct 14, 2024

Hi @AtofStryker

Sorry about the delay. I have used the patch-package, which generated below patch file:

diff --git a/node_modules/@cypress/webpack-dev-server/dist/makeDefaultWebpackConfig.js b/node_modules/@cypress/webpack-dev-server/dist/makeDefaultWebpackConfig.js
index 5c4d79a..c60c5d1 100644
--- a/node_modules/@cypress/webpack-dev-server/dist/makeDefaultWebpackConfig.js
+++ b/node_modules/@cypress/webpack-dev-server/dist/makeDefaultWebpackConfig.js
@@ -53,7 +53,6 @@ function makeCypressWebpackConfig(config) {
                 indexHtmlFile,
             }),
         ],
-        devtool: 'inline-source-map',
     };
     if (isRunMode) {
         // if experimentalJustInTimeCompile is configured, we need to watch for file changes as the spec entries are going to be updated per test

I apply the patch during pipeline run by executing yarn patch-package, which ends with:

yarn run v1.22.22
$ /home/vsts/work/1/s/node_modules/.bin/patch-package
patch-package 8.0.0
Applying patches...
@cypress/[email protected]
Done in 0.34s.

Unfortunately, tests still randomly fail :(

@AtofStryker
Copy link
Contributor

@rgala are you referencing @cypress/webpack-dev-server inside your cypress config as well to verify the correct package is being used? The one that gets used by default lives inside the binary so it really can't be patched. Similar to this:

import { devServer } from '@cypress/webpack-dev-server'

export default {
  component: {
     devServer: (devServerConfig) => {
      return devServer({
        ...devServerConfig,
        framework: 'react',
        bundler: 'webpack',
      })
  }
}

@rgala
Copy link

rgala commented Oct 16, 2024

Sorry @AtofStryker, I did not know I had to make such change. Anyway, after implementing it I have been unable to reproduce the issue anymore and this is good news :)

@jennifer-shehane
Copy link
Member

We intend to make the just-in-time compile flag default within Cypress 14, with a justInTimeCompile configuration option to opt out of the behavior. Followup story here: #30234

@papatelst
Copy link

papatelst commented Oct 16, 2024

@AtofStryker following up on the issue I reported related to End-to-End testing (NOT component testing) in the comment in this ticket in march here.
We are now seeing this error more frequently even outside of after each hook. Its completely random.
If I upgrade cypress version to 13.15.0 (latest) and set experimentalJustInTimeCompile=true in *.config.ts file, as mentioned here, will it cause this random error to go away for our E2E Tests. This flag is more for component tests and not sure if it has any effect on the E2E tests. We dont run component tests from our cypress repo.
If this flag is not useful in our case, then what should we do fix this random ChunkLoadError shown in snapshot in previous comment. We have been seeing this error since upgrade to cypress version 13.5.1. Is this something we need to work with our frontend dev team as the error says -

ChunkLoadError: The following error originated from your application code, not from Cypress. It was caused by an unhandled promise rejection.
  > Loading chunk 69 failed.

@smalott16
Copy link

smalott16 commented Oct 17, 2024

I am experiencing this issue in gitlabci on 13.15.0. I found referencing the @cypress/webpack-dev-server in my config file worked some of the time. Usually the test suite would pass the first time but then fail if I re-ran it. I then tried the JIT compile flag which seemed to make the the ChunkErrors go away but then I started getting FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory and my tests would just hang but I imagine is more related to my application and could be remedied through allocating more memory. But anyway for curiosity sake I also tried applying this patch and now it seems to be consistently passing.

So in the end im not even using the experimental JIT flag. But I'm not super familiar with webpack so I'm a little unsure about what this is actually doing or if there could be negative ramifications.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CT Issue related to component testing experimental: just-in-time-compile stage: awaiting response Potential fix was proposed; awaiting response
Projects
None yet
Development

No branches or pull requests