From b912184a2c01ca36a412a99b0a03636b91af9501 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 5 Jun 2025 11:27:23 -0400 Subject: [PATCH 1/2] improve arrow function support --- .../packagers/js/src/ScopeHoistingPackager.js | 15 ++++++++++--- packages/packagers/js/src/helpers.js | 21 +++++++++++-------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/packages/packagers/js/src/ScopeHoistingPackager.js b/packages/packagers/js/src/ScopeHoistingPackager.js index c07bfbfe36..8105659ce1 100644 --- a/packages/packagers/js/src/ScopeHoistingPackager.js +++ b/packages/packagers/js/src/ScopeHoistingPackager.js @@ -104,6 +104,7 @@ export class ScopeHoistingPackager { externalAssets: Set = new Set(); forceSkipWrapAssets: Array = []; logger: PluginLogger; + supportsArrowFunctions: boolean; constructor( options: PluginOptions, @@ -121,6 +122,10 @@ export class ScopeHoistingPackager { this.useAsyncBundleRuntime = useAsyncBundleRuntime; this.forceSkipWrapAssets = forceSkipWrapAssets ?? []; this.logger = logger; + this.supportsArrowFunctions = this.bundle.env.supports( + 'arrow-functions', + true, + ); let OutputFormat = OUTPUT_FORMATS[this.bundle.env.outputFormat]; this.outputFormat = new OutputFormat(this); @@ -341,7 +346,7 @@ export class ScopeHoistingPackager { let params = [ JSON.stringify(this.bundle.publicId), - fnExpr(this.bundle.env, [], [codeToRun]), + fnExpr(this.supportsArrowFunctions, [], [codeToRun]), `${JSON.stringify(deps)}${ conditions.length > 0 ? `.concat([${conditions @@ -717,9 +722,13 @@ export class ScopeHoistingPackager { sourceMap?.offsetLines(1, 1); lineCount++; + const args = '(module, exports)'; + const func = this.supportsArrowFunctions + ? `${args} =>` + : `function${args}`; code = `parcelRegister(${JSON.stringify( this.bundleGraph.getAssetPublicId(asset), - )}, function(module, exports) { + )}, ${func} { ${code} }); `; @@ -1552,7 +1561,7 @@ ${code} } buildFunctionExpression(args: Array, expr: string): string { - return this.bundle.env.supports('arrow-functions', true) + return this.supportsArrowFunctions ? `(${args.join(', ')}) => ${expr}` : `function (${args.join(', ')}) { return ${expr}; }`; } diff --git a/packages/packagers/js/src/helpers.js b/packages/packagers/js/src/helpers.js index 1ece9a2971..c0ffaf8ade 100644 --- a/packages/packagers/js/src/helpers.js +++ b/packages/packagers/js/src/helpers.js @@ -36,20 +36,22 @@ var parcelRegister = parcelRequire.register; `; export const fnExpr = ( - env: Environment, + supportsArrowFunctions: boolean, params: Array, body: Array, ): string => { let block = `{ ${body.join(' ')} }`; - if (env.supports('arrow-functions')) { + if (supportsArrowFunctions) { return `(${params.join(', ')}) => ${block}`; } return `function (${params.join(', ')}) ${block}`; }; -export const bundleQueuePrelude = (env: Environment): string => ` +export const bundleQueuePrelude = (env: Environment): string => { + const supportsArrowFunctions = env.supports('arrow-functions'); + return ` if (!$parcel$global.lb) { // Set of loaded bundles $parcel$global.lb = new Set(); @@ -58,14 +60,14 @@ if (!$parcel$global.lb) { // Register loaded bundle $parcel$global.rlb = ${fnExpr( - env, + supportsArrowFunctions, ['bundle'], ['$parcel$global.lb.add(bundle);', '$parcel$global.pq();'], )} // Run when ready $parcel$global.rwr = ${fnExpr( - env, + supportsArrowFunctions, // b = bundle public id // r = run function to execute the bundle entry // d = list of dependent bundles this bundle requires before executing @@ -75,15 +77,15 @@ if (!$parcel$global.lb) { // Process queue $parcel$global.pq = ${fnExpr( - env, + supportsArrowFunctions, [], [ `var runnableEntry = $parcel$global.bq.find(${fnExpr( - env, + supportsArrowFunctions, ['i'], [ `return i.d.every(${fnExpr( - env, + supportsArrowFunctions, ['dep'], ['return $parcel$global.lb.has(dep);'], )});`, @@ -91,7 +93,7 @@ if (!$parcel$global.lb) { )});`, 'if (runnableEntry) {', `$parcel$global.bq = $parcel$global.bq.filter(${fnExpr( - env, + supportsArrowFunctions, ['i'], ['return i.b !== runnableEntry.b;'], )});`, @@ -102,6 +104,7 @@ if (!$parcel$global.lb) { )} } `; +}; const $parcel$export = ` function $parcel$export(e, n, v, s) { From f6ee6cbda8c6a6f6e874ebf57e1f55240a99e86e Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 5 Jun 2025 11:33:34 -0400 Subject: [PATCH 2/2] add changeset --- .changeset/stupid-kiwis-change.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/stupid-kiwis-change.md diff --git a/.changeset/stupid-kiwis-change.md b/.changeset/stupid-kiwis-change.md new file mode 100644 index 0000000000..a722413b9b --- /dev/null +++ b/.changeset/stupid-kiwis-change.md @@ -0,0 +1,5 @@ +--- +'@atlaspack/packager-js': minor +--- + +Use arrow functions in `parcelRegister` calls when supported. Reduce calls to `this.bundle.env.supports('arrow-functions', true);`.