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

Remove this exports tracking for files with module syntax #9330

Merged
merged 7 commits into from Oct 23, 2023

Conversation

mattcompiles
Copy link
Contributor

@mattcompiles mattcompiles commented Oct 19, 2023

↪️ Pull Request

The TSC polyfill check was breaking CJS files as we need to track this references for exports. This PR makes it so we disable this export tracking when any module syntax is present.

✔️ PR Todo

  • Added/updated unit tests for this change
  • Included links to related issues/PRs

@parcel-benchmark
Copy link

parcel-benchmark commented Oct 19, 2023

Benchmark Results

Kitchen Sink ✅

Timings

Description Time Difference
Cold 1.44s +28.00ms
Cached 280.00ms -13.00ms

Cold Bundles

No bundle changes detected.

Cached Bundles

No bundle changes detected.

React HackerNews ✅

Timings

Description Time Difference
Cold 3.76s -38.00ms
Cached 406.00ms +13.00ms

Cold Bundles

Bundle Size Difference Time Difference
dist/PermalinkedComment.e9dc4a75.js 3.92kb +0.00b 286.00ms -38.00ms 🚀
dist/UserProfile.8945a243.js 1.38kb +0.00b 286.00ms -38.00ms 🚀
dist/NotFound.8b44a81d.js 269.00b +0.00b 286.00ms -38.00ms 🚀
dist/logo.8dd07848.png 244.00b +0.00b 214.00ms -17.00ms 🚀

Cached Bundles

Bundle Size Difference Time Difference
dist/PermalinkedComment.e9dc4a75.js 3.92kb +0.00b 317.00ms +21.00ms ⚠️
dist/UserProfile.8945a243.js 1.38kb +0.00b 317.00ms +21.00ms ⚠️
dist/NotFound.8b44a81d.js 269.00b +0.00b 317.00ms +21.00ms ⚠️
dist/logo.8dd07848.png 244.00b +0.00b 228.00ms +16.00ms ⚠️

AtlasKit Editor ✅

Timings

Description Time Difference
Cold 30.75s -1.31s
Cached 2.10s +43.00ms

Cold Bundles

Bundle Size Difference Time Difference
dist/index.52a242f7.js 3.78mb -4.21kb 🚀 14.68s -725.00ms
dist/pdfRenderer.ba28cccc.js 1.11mb +0.00b 10.85s -807.00ms 🚀
dist/editorView.a0126b37.js 619.22kb +0.00b 11.55s -1.46s 🚀
dist/refractor.3e0cc31b.js 598.96kb +0.00b 10.09s -1.12s 🚀
dist/media-viewer.e993d1a1.js 536.13kb +0.00b 9.96s -1.12s 🚀
dist/popup.a77286c1.js 321.45kb +0.00b 10.09s -1.12s 🚀
dist/ConfigPanelFieldsLoader.182d39bc.js 303.43kb +0.00b 6.93s -931.00ms 🚀
dist/EmojiPickerComponent.1e4c5464.js 188.61kb +0.00b 10.04s -1.04s 🚀
dist/card.d06de810.js 138.91kb +0.00b 6.92s -942.00ms 🚀
dist/ConfigPanelFieldsLoader.3b50a158.js 82.73kb +0.00b 10.04s -1.04s 🚀
dist/mobile-upload.63ab2b72.js 66.34kb +0.00b 4.21s -506.00ms 🚀
dist/esm.34897092.js 62.95kb +0.00b 10.09s -1.12s 🚀
dist/ElementBrowser.e8f01080.js 61.94kb +0.00b 6.92s -940.00ms 🚀
dist/archive.c374f622.js 59.90kb +0.00b 10.09s -1.12s 🚀
dist/esm.271a6e34.js 59.30kb +0.00b 6.92s -934.00ms 🚀
dist/component-lazy.51d1dec9.js 58.94kb +0.00b 5.02s -533.00ms 🚀
dist/component.ea8ea9a2.js 57.16kb +0.00b 4.21s -504.00ms 🚀
dist/DatePicker.042aeb21.js 47.46kb +0.00b 5.02s -541.00ms 🚀
dist/esm.cb0d3833.js 39.11kb +0.00b 10.09s -1.12s 🚀
dist/Modal.fa93d531.js 27.83kb +0.00b 4.20s -505.00ms 🚀
dist/DatePicker.e51a79b1.js 24.96kb +0.00b 5.02s -541.00ms 🚀
dist/smartMediaEditor.efa59853.js 21.68kb +0.00b 10.09s -1.12s 🚀
dist/esm.fedda0d0.js 20.43kb +0.00b 10.09s -1.12s 🚀
dist/component.f7f8c338.js 18.68kb +0.00b 4.21s -504.00ms 🚀
dist/js.e1035d4d.js 17.15kb +0.00b 4.21s -500.00ms 🚀
dist/ConfigPanelFieldsLoader.3384e28b.js 15.74kb +0.00b 6.92s -940.00ms 🚀
dist/ui.8c117104.js 14.48kb +0.00b 6.92s -940.00ms 🚀
dist/ConfigPanelFieldsLoader.aa7dd375.js 13.63kb +0.00b 6.92s -940.00ms 🚀
dist/dropzone.464b3150.js 13.40kb +0.00b 10.09s -1.12s 🚀
dist/pdfRenderer.a0700f46.js 11.90kb +0.00b 6.92s -942.00ms 🚀
dist/dropzone.1c15cdc1.js 11.48kb +0.00b 10.09s -1.12s 🚀
dist/Toolbar.4d256e97.js 9.36kb +0.00b 10.09s -1.12s 🚀
dist/clipboard.400013a2.js 7.92kb +0.00b 10.09s -1.12s 🚀
dist/mobile-upload.3747b689.js 7.79kb +0.00b 4.21s -504.00ms 🚀
dist/mobile-upload.3baad8e4.js 7.79kb +0.00b 6.92s -933.00ms 🚀
dist/mobile-upload.7a892a37.js 7.79kb +0.00b 6.92s -934.00ms 🚀
dist/mobile-upload.2102debb.js 7.79kb +0.00b 10.09s -1.12s 🚀
dist/index.runtime.d5d39f8d.js 7.29kb +0.00b 10.10s -1.11s 🚀
dist/browser.0009c8b4.js 7.19kb +0.00b 10.09s -1.12s 🚀
dist/index.b16227d6.css 4.08kb +0.00b 10.11s -1.11s 🚀
dist/Modal.850345b4.js 3.86kb +0.00b 4.21s -504.00ms 🚀
dist/component.360dba95.js 3.20kb +0.00b 4.21s -504.00ms 🚀
dist/media-viewer-analytics-error-boundary.60bdaa4c.js 3.18kb +0.00b 10.09s -1.12s 🚀
dist/media-picker-analytics-error-boundary.c493f011.js 3.18kb +0.00b 10.09s -1.12s 🚀
dist/media-card-analytics-error-boundary.74e0c7f9.js 3.18kb +0.00b 10.09s -1.12s 🚀
dist/png-chunks-extract.92497b2d.js 3.06kb +0.00b 4.20s -501.00ms 🚀
dist/ru.0cf3f40e.js 2.81kb +0.00b 6.92s -941.00ms 🚀
dist/uk.282f23b1.js 2.76kb +0.00b 6.92s -941.00ms 🚀
dist/codeViewerRenderer.51140ec8.js 2.61kb +0.00b 10.09s -993.00ms 🚀
dist/th.137e1013.js 2.60kb +0.00b 6.92s -940.00ms 🚀
dist/ResourcedEmojiComponent.9a253c26.js 2.47kb +0.00b 5.02s -541.00ms 🚀
dist/pl.bce591be.js 2.25kb +0.00b 5.02s -539.00ms 🚀
dist/cs.bf42283b.js 2.23kb +0.00b 5.02s -537.00ms 🚀
dist/de.90d5c4fa.js 2.17kb +0.00b 5.02s -537.00ms 🚀
dist/fr.ff5d335f.js 2.13kb +0.00b 5.02s -538.00ms 🚀
dist/es.80bf0476.js 2.12kb +0.00b 5.02s -537.00ms 🚀
dist/hu.223c2cde.js 2.10kb +0.00b 5.02s -538.00ms 🚀
dist/fi.98bb8fa8.js 2.09kb +0.00b 5.02s -538.00ms 🚀
dist/ja.7d4156df.js 2.09kb +0.00b 5.02s -539.00ms 🚀
dist/vi.b46097db.js 2.09kb +0.00b 6.92s -941.00ms 🚀
dist/pt_BR.b9e37d37.js 2.06kb +0.00b 5.02s -539.00ms 🚀
dist/tr.c85d90a9.js 2.03kb +0.00b 6.92s -941.00ms 🚀
dist/ko.9c6bf469.js 1.98kb +0.00b 5.02s -539.00ms 🚀
dist/sv.1c06c95c.js 1.98kb +0.00b 6.92s -940.00ms 🚀
dist/it.04edb54a.js 1.97kb +0.00b 5.02s -539.00ms 🚀
dist/nb.9bd6db78.js 1.96kb +0.00b 5.02s -539.00ms 🚀
dist/date.139a08b0.js 1.95kb +0.00b 4.41s -541.00ms 🚀
dist/da.d2d8303e.js 1.95kb +0.00b 5.02s -540.00ms 🚀
dist/nl.c4d12122.js 1.94kb +0.00b 5.02s -539.00ms 🚀
dist/images.774ef3be.js 1.90kb +0.00b 4.42s -540.00ms 🚀
dist/zh_TW.b7c55aa6.js 1.86kb +0.00b 6.92s -941.00ms 🚀
dist/zh.b01fe721.js 1.84kb +0.00b 6.92s -940.00ms 🚀
dist/feedback.4b745631.js 1.76kb +0.00b 5.02s -542.00ms 🚀
dist/status.20808f9b.js 1.67kb +0.00b 4.42s -541.00ms 🚀
dist/code.3ce450f8.js 1.56kb +0.00b 4.41s -540.00ms 🚀
dist/workerHasher.4f6584da.js 1.56kb +0.00b 4.20s -501.00ms 🚀
dist/workerHasher.540c9790.js 1.56kb +0.00b 6.92s -940.00ms 🚀
dist/workerHasher.c840c607.js 1.56kb +0.00b 6.92s -934.00ms 🚀
dist/workerHasher.730f3766.js 1.56kb +0.00b 10.09s -1.12s 🚀
dist/workerHasher.9b1fcdbf.js 1.56kb +0.00b 10.09s -1.12s 🚀
dist/workerHasher.02b63a21.js 1.56kb +0.00b 10.09s -1.12s 🚀
dist/list-number.fdc97a50.js 1.47kb +0.00b 4.42s -540.00ms 🚀
dist/heading6.e6e03f52.js 1.36kb +0.00b 5.02s -542.00ms 🚀
dist/16.4998f52b.js 1.35kb +0.00b 4.21s -505.00ms 🚀
dist/heading3.73972e33.js 1.35kb +0.00b 4.42s -541.00ms 🚀
dist/16.330880f6.js 1.29kb +0.00b 4.21s -505.00ms 🚀
dist/link.71e06c5e.js 1.28kb +0.00b 4.42s -540.00ms 🚀
dist/emoji.8f9f45dc.js 1.25kb +0.00b 4.42s -540.00ms 🚀
dist/heading5.d2f94d9d.js 1.23kb +0.00b 5.02s -541.00ms 🚀
dist/expand.c983e90a.js 1.18kb +0.00b 5.02s -542.00ms 🚀
dist/heading2.c27d912d.js 1.17kb +0.00b 4.42s -541.00ms 🚀
dist/heading4.be08fc9e.js 1.12kb +0.00b 4.42s -541.00ms 🚀
dist/mention.f4723418.js 1.09kb +0.00b 4.42s -540.00ms 🚀
dist/layout.b5e3a7ef.js 1.05kb +0.00b 4.42s -540.00ms 🚀
dist/divider.7bb33712.js 1.04kb +0.00b 4.42s -540.00ms 🚀
dist/action.c407ac14.js 1.02kb +0.00b 4.41s -540.00ms 🚀
dist/heading1.d7caae19.js 1.02kb +0.00b 4.42s -541.00ms 🚀
dist/16.371e251f.js 1.00kb +0.00b 4.21s -504.00ms 🚀
dist/list.bd698aa0.js 1011.00b +0.00b 4.42s -540.00ms 🚀
dist/quote.d6bda47a.js 1011.00b +0.00b 4.41s -542.00ms 🚀
dist/decision.a17a0d00.js 992.00b +0.00b 4.41s -541.00ms 🚀
dist/16.8adad466.js 980.00b +0.00b 4.21s -505.00ms 🚀
dist/16.71432140.js 980.00b +0.00b 4.21s -505.00ms 🚀
dist/panel-warning.772e8569.js 968.00b +0.00b 4.41s -542.00ms 🚀
dist/16.e5f05248.js 960.00b +0.00b 4.20s -505.00ms 🚀
dist/16.549c63e3.js 955.00b +0.00b 4.41s -540.00ms 🚀
dist/table.e0e68580.js 946.00b +0.00b 4.42s -541.00ms 🚀
dist/16.79864de1.js 920.00b +0.00b 4.21s -504.00ms 🚀
dist/panel.45c00b08.js 887.00b +0.00b 4.41s -542.00ms 🚀
dist/panel-error.bfda44fb.js 864.00b +0.00b 4.41s -541.00ms 🚀
dist/16.7d7d7930.js 862.00b +0.00b 4.21s -504.00ms 🚀
dist/16.4556c00f.js 834.00b +0.00b 4.21s -504.00ms 🚀
dist/16.a44bb474.js 827.00b +0.00b 4.20s -505.00ms 🚀
dist/16.bf9fb66d.js 821.00b +0.00b 4.41s -540.00ms 🚀
dist/panel-success.4afcba7a.js 805.00b +0.00b 4.41s -541.00ms 🚀
dist/panel-note.58ef2b52.js 795.00b +0.00b 4.41s -541.00ms 🚀
dist/16.dffb58fe.js 782.00b +0.00b 4.21s -505.00ms 🚀
dist/16.0118b1f8.js 776.00b +0.00b 4.21s -505.00ms 🚀
dist/16.9a311f76.js 776.00b +0.00b 4.21s -505.00ms 🚀
dist/16.edf70d70.js 775.00b +0.00b 4.21s -506.00ms 🚀
dist/16.4af9f37f.js 774.00b +0.00b 4.21s -505.00ms 🚀
dist/16.aa70dcce.js 773.00b +0.00b 4.20s -505.00ms 🚀
dist/16.c715b7e1.js 746.00b +0.00b 4.41s -540.00ms 🚀
dist/16.54ffa2b2.js 725.00b +0.00b 4.21s -504.00ms 🚀
dist/16.d7c3881b.js 697.00b +0.00b 4.21s -504.00ms 🚀
dist/sk.4be9c93f.js 656.00b +0.00b 6.92s -940.00ms 🚀
dist/pt_PT.e211e609.js 635.00b +0.00b 5.02s -539.00ms 🚀
dist/et.88ef7cb4.js 633.00b +0.00b 5.02s -537.00ms 🚀
dist/simpleHasher.09765db3.js 589.00b +0.00b 4.20s -501.00ms 🚀
dist/simpleHasher.c14e20b4.js 589.00b +0.00b 6.93s -932.00ms 🚀
dist/simpleHasher.23db7a52.js 589.00b +0.00b 6.92s -934.00ms 🚀
dist/simpleHasher.eefc98b4.js 589.00b +0.00b 10.09s -1.12s 🚀
dist/simpleHasher.47b9c809.js 589.00b +0.00b 10.09s -1.12s 🚀
dist/simpleHasher.cadc19c6.js 589.00b +0.00b 10.09s -1.12s 🚀
dist/is.5f045a22.js 495.00b +0.00b 5.02s -538.00ms 🚀
dist/ro.8d5b380a.js 482.00b +0.00b 6.92s -635.00ms 🚀
dist/en_GB.4c40e6c6.js 472.00b +0.00b 5.02s -537.00ms 🚀
dist/en.e1d21f6d.js 469.00b +0.00b 5.02s -537.00ms 🚀
dist/index.html 248.00b +0.00b 10.13s -1.11s 🚀

Cached Bundles

Bundle Size Difference Time Difference
dist/index.52a242f7.js 3.78mb -4.21kb 🚀 14.81s -240.00ms
dist/component-lazy.51d1dec9.js 58.94kb +0.00b 4.62s -567.00ms 🚀
dist/pdfRenderer.a0700f46.js 11.90kb +0.00b 9.80s +2.83s ⚠️
dist/codeViewerRenderer.51140ec8.js 2.61kb +0.00b 9.80s +2.83s ⚠️
dist/ro.8d5b380a.js 482.00b +0.00b 5.25s -1.72s 🚀
dist/index.html 248.00b +0.00b 9.98s +4.78s ⚠️

Three.js ✅

Timings

Description Time Difference
Cold 2.89s +23.00ms
Cached 306.00ms -10.00ms

Cold Bundles

No bundle changes detected.

Cached Bundles

No bundle changes detected.

Click here to view a detailed benchmark overview.

@@ -252,6 +252,7 @@ pub fn transform(config: Config) -> Result<TransformResult, std::io::Error> {
),
));

let is_module = module.is_module();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this do exactly? What is the definition of a "module" here? Anything with an import/export? We also compute this within collect itself already.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@devongovett
Copy link
Member

Is the problem that the member expression is still being tracked as an export? REPL I guess that would happen here:

return Expr::Ident(self.get_export_ident(member.span, &key));

So you might need the same binary expression check in hoist.rs too. But seems like the real issue is that we don't distinguish property reads from writes...

@mattcompiles
Copy link
Contributor Author

@devongovett @mischnic

Is the problem that the member expression is still being tracked as an export?

Yeah I believe that's the case, but we don't track top-level this exports for modules/ESM hence the fix.

So you might need the same binary expression check in hoist.rs too. But seems like the real issue is that we don't distinguish property reads from writes...

I agree it'd be better to only track assignments but that's a much larger task. Do you have any blocking concerns for this fix? Without it we're breaking CJS files that have the TSC polyfills.

@devongovett
Copy link
Member

With this change, do we even need the previous one? We could just disable this tracking entirely for ESM instead of the binary expression heuristic? That would be technically more correct anyway I think. Am I missing something?

@mattcompiles
Copy link
Contributor Author

@devongovett 🤔 Good point, I hadn't actually considered that. The only thing I can think of is potentially breaking this exports tracking in mixed modules (files with ESM and CJS syntax). But I doubt that's something we need to support.

I'll rework to disable this tracking in modules 👍

@@ -1140,11 +1140,21 @@ mod tests {
);

let mut parser = Parser::new_from(lexer);
match parser.parse_module() {
Ok(module) => swc_core::common::GLOBALS.set(&Globals::new(), || {
match parser.parse_program() {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated this to closer reflect the parsing we do in lib.rs

@mattcompiles mattcompiles changed the title Fix TSC check for CJS files Remove this exports tracking for files with module syntax Oct 20, 2023
@mattcompiles
Copy link
Contributor Author

@mischnic @devongovett I updated the PR to instead remove this tracking of exports when module syntax is present. Let me know your thoughts. Unless there's some weird edge-case I'm not aware of that's not tested then I think this is a good trade-off.

@@ -689,6 +692,11 @@ impl Visit for Collect {
return;
}
Expr::This(_this) => {
if self.is_module {
// Don't track this bindings if ESM syntax is present
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we might still have to track this_exprs in ESM (the second case below)? For example:

export function a() {
  return this.b();
}

export function b() {
  return 2;
}

Looks like we only have a CJS test for that (in hoist.rs).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't valid code though as this is undefined for ESM files. Is there actual scenarios expecting this to work?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if you do

import * as ns from './above_code';

ns.a();

the this will be the namespace. Niklas brought this example up in the issue that the recent PR fixed. #7866 (comment)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@devongovett I feel like this is an accidental implementation detail of ESM on top of existing JS. No one would do it in practice as it means you're library could only be used via namespace imports. Not sure we should go out of our way to support this.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I only brought it up because I think this PR literally just fixed it! #9291 Does it work if you only make the first case conditional on ESM instead of the whole thing?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@devongovett I'm a bit confused on this. That fix was for CJS files which still works. The ESM scenario doesn't work regardless of this change. If I add a test with the code Niklas mentioned in that PR it fails with and without my changes.

Does it work if you only make the first case conditional on ESM instead of the whole thing?

It does work in this case. I'll update the code to this but I'm not sure tracking this in ESM files is really doing anything.

mattcompiles and others added 2 commits October 23, 2023 15:36
Co-authored-by: Devon Govett <devongovett@gmail.com>
@mattcompiles mattcompiles merged commit 808edd8 into v2 Oct 23, 2023
16 checks passed
@mischnic mischnic deleted the fix-TSC-check-CJS branch October 24, 2023 07:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants