From fbe7dcbb4d792a17ab88db3992b692b0b441fae0 Mon Sep 17 00:00:00 2001 From: Kris Selden Date: Mon, 21 Jun 2021 17:11:48 -0700 Subject: [PATCH] fix issue with thread-loader performance since thread-loader serializes options per file we only pass the config file and variant to the loader then apply the variant to the config inside the worker. --- packages/babel-loader-8/index.js | 44 ++++++++++++++++++++ packages/babel-loader-8/package.json | 24 +++++++++++ packages/webpack/package.json | 1 + packages/webpack/src/ember-webpack.ts | 53 +++++++++--------------- yarn.lock | 58 ++++++++++++++++++++++++--- 5 files changed, 141 insertions(+), 39 deletions(-) create mode 100644 packages/babel-loader-8/index.js create mode 100644 packages/babel-loader-8/package.json diff --git a/packages/babel-loader-8/index.js b/packages/babel-loader-8/index.js new file mode 100644 index 000000000..4dbf84fa6 --- /dev/null +++ b/packages/babel-loader-8/index.js @@ -0,0 +1,44 @@ +const { applyVariantToBabelConfig } = require('@embroider/core'); +module.exports = require('babel-loader').custom(babel => { + return { + customOptions({ variant, appBabelConfigPath, ...extraOptions }) { + const custom = { + variant, + appBabelConfigPath, + }; + + const appBabelConfig = applyVariantToBabelConfig(variant, require(appBabelConfigPath)); + + const loader = { + ...appBabelConfig, + ...extraOptions, + }; + + if (loader.plugins) { + loader.plugins = loader.plugins.slice(); + } else { + loader.plugins = []; + } + + // webpack uses acorn and acorn doesn't parse these features yet, so we + // always tranpile them away regardless of what preset-env is doing + if (!loader.plugins.some(pluginMatches(/@babel\/plugin-proposal-optional-chaining/))) { + loader.plugins.push(require.resolve('@babel/plugin-proposal-optional-chaining')); + } + if (!loader.plugins.some(pluginMatches(/@babel\/plugin-proposal-nullish-coalescing-operator/))) { + loader.plugins.push(require.resolve('@babel/plugin-proposal-nullish-coalescing-operator')); + } + + return { + custom, + loader, + }; + }, + }; +}); + +function pluginMatches(pattern) { + return function (plugin) { + return plugin && pattern.test(Array.isArray(plugin) ? plugin[0] : plugin); + }; +} diff --git a/packages/babel-loader-8/package.json b/packages/babel-loader-8/package.json new file mode 100644 index 000000000..6e7af5a5b --- /dev/null +++ b/packages/babel-loader-8/package.json @@ -0,0 +1,24 @@ +{ + "name": "@embroider/babel-loader-8", + "version": "0.42.1", + "repository": { + "type": "git", + "url": "https://github.com/embroider-build/embroider.git", + "directory": "packages/babel-loader-8" + }, + "license": "MIT", + "main": "index.js", + "dependencies": { + "@babel/core": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@embroider/core": "0.42.1", + "babel-loader": "8" + }, + "engines": { + "node": "12.* || 14.* || >= 16" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/packages/webpack/package.json b/packages/webpack/package.json index 611ce675e..2cdaafd5c 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -24,6 +24,7 @@ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", "@babel/plugin-proposal-optional-chaining": "^7.14.5", "@embroider/babel-loader-7": "0.42.1", + "@embroider/babel-loader-8": "0.42.1", "@embroider/hbs-loader": "0.42.1", "@types/loader-utils": "^2.0.2", "@types/source-map": "^0.5.7", diff --git a/packages/webpack/src/ember-webpack.ts b/packages/webpack/src/ember-webpack.ts index 81d562863..b001aad2b 100644 --- a/packages/webpack/src/ember-webpack.ts +++ b/packages/webpack/src/ember-webpack.ts @@ -207,7 +207,7 @@ const Webpack: PackagerConstructor = class Webpack implements Packager // not overriding the default loader resolution rules in case the app also // wants to control those. 'thread-loader': require.resolve('thread-loader'), - 'babel-loader-8': require.resolve('babel-loader'), + 'babel-loader-8': require.resolve('@embroider/babel-loader-8'), 'babel-loader-7': require.resolve('@embroider/babel-loader-7'), 'css-loader': require.resolve('css-loader'), 'style-loader': require.resolve('style-loader'), @@ -542,8 +542,7 @@ function warmUp(extraOptions: object | false | undefined) { threadLoaderWarmup(Object.assign({}, threadLoaderOptions, extraOptions), [ require.resolve('@embroider/hbs-loader'), - require.resolve('babel-loader'), - require.resolve('@embroider/babel-loader-7'), + require.resolve('@embroider/babel-loader-8'), ]); } @@ -580,40 +579,28 @@ function babelLoaderOptions( appBabelConfigPath: string, extraOptions: BabelLoaderOptions | undefined ) { - let options = Object.assign( - {}, - // eslint-disable-next-line @typescript-eslint/no-require-imports - applyVariantToBabelConfig(variant, require(appBabelConfigPath)), - { - cacheDirectory: getPackagerCacheDir('webpack-babel-loader'), - }, - extraOptions - ); - if (majorVersion === 7) { - if (options.plugins) { - options.plugins = options.plugins.slice(); - } else { - options.plugins = []; - } - // webpack uses acorn and acorn doesn't parse these features yet, so we - // always tranpile them away regardless of what preset-env is doing - if (!options.plugins.some(pluginMatches(/@babel\/plugin-proposal-optional-chaining/))) { - options.plugins.push(require.resolve('@babel/plugin-proposal-optional-chaining')); - } - if (!options.plugins.some(pluginMatches(/@babel\/plugin-proposal-nullish-coalescing-operator/))) { - options.plugins.push(require.resolve('@babel/plugin-proposal-nullish-coalescing-operator')); - } + const cacheDirectory = getPackagerCacheDir('webpack-babel-loader'); + if (majorVersion === 6) { + return { + loader: 'babel-loader-7', + options: { + // eslint-disable-next-line @typescript-eslint/no-require-imports + ...applyVariantToBabelConfig(variant, require(appBabelConfigPath)), + cacheDirectory, + ...extraOptions, + }, + }; } + const options: BabelLoaderOptions & { variant: Variant; appBabelConfigPath: string } = { + variant, + appBabelConfigPath, + cacheDirectory, + ...extraOptions, + }; return { - loader: majorVersion === 6 ? 'babel-loader-7' : 'babel-loader-8', + loader: 'babel-loader-8', options, }; } -function pluginMatches(pattern: RegExp) { - return function (plugin: string | [string] | undefined) { - return plugin && pattern.test(Array.isArray(plugin) ? plugin[0] : plugin); - }; -} - export { Webpack }; diff --git a/yarn.lock b/yarn.lock index 5e9ef1eb6..5817618d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3635,7 +3635,7 @@ babel-loader@7: loader-utils "^1.0.2" mkdirp "^0.5.1" -babel-loader@^8.0.6, babel-loader@^8.2.2: +babel-loader@8, babel-loader@^8.0.6, babel-loader@^8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== @@ -5283,7 +5283,15 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^3.2.6, browserslist@^4.0.0, browserslist@^4.14.0, browserslist@^4.14.5, browserslist@^4.16.6: +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6: version "4.16.6" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== @@ -5533,6 +5541,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001219: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz#0a80de4cdf62e1770bb46a30d884fc8d633e3958" integrity sha512-o0PRQSrSCGJKCPZcgMzl5fUaj5xHe8qA2m4QRvnyY4e1lITqoNkr7q/Oh1NcpGSy0Th97UZ35yoKcINPoq7YOQ== +caniuse-lite@^1.0.30000844: + version "1.0.30001239" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz#66e8669985bb2cb84ccb10f68c25ce6dd3e4d2b8" + integrity sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -6792,6 +6805,11 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +electron-to-chromium@^1.3.47: + version "1.3.754" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.754.tgz#afbe69177ad7aae968c3bbeba129dc70dcc37cf4" + integrity sha512-Q50dJbfYYRtwK3G9mFP/EsJVzlgcYwKxFjbXmvVa1lDAbdviPcT9QOpFoufDApub4j0hBfDRL6v3lWNLEdEDXQ== + electron-to-chromium@^1.3.723: version "1.3.752" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz#0728587f1b9b970ec9ffad932496429aef750d09" @@ -10114,7 +10132,21 @@ fastboot-transform@^0.1.0, fastboot-transform@^0.1.3: broccoli-stew "^1.5.0" convert-source-map "^1.5.1" -fastboot@^2.0.0, fastboot@^2.0.1, fastboot@^3.1.0: +fastboot@^2.0.0, fastboot@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-2.0.3.tgz#0b712e6c590f1b463dc5b12138893bcbbafa2459" + integrity sha512-NNH/o+XhITAQUnW2CC9IDXlcnI74W2BONjtRSRmc01N3uJl/7pcvX9iWTUWu2PYQbQZUBu8HzVFt7GmQ9qw9JQ== + dependencies: + chalk "^2.0.1" + cookie "^0.4.0" + debug "^4.1.0" + najax "^1.0.3" + resolve "^1.8.1" + rsvp "^4.8.0" + simple-dom "^1.4.0" + source-map-support "^0.5.0" + +fastboot@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.1.2.tgz#c10a97be3a61fbbf9e4bd8abc43373e8739d1787" integrity sha512-yvhJfIRd4wWWACk+qjJxQI+WBIQ+pyQyp0/fxrQyA/cYJgZAXOHb+22zXJbJXaPku3fHS+gBl7crwovIkl8bhQ== @@ -12639,6 +12671,11 @@ jest@^24.9.0: import-local "^2.0.0" jest-cli "^24.9.0" +jquery-deferred@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" + integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= + jquery@^3.3.1, jquery@^3.4.1, jquery@^3.5.0, jquery@^3.5.1: version "3.6.0" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" @@ -14003,6 +14040,15 @@ mz@^2.4.0: object-assign "^4.0.1" thenify-all "^1.0.0" +najax@^1.0.3: + version "1.0.7" + resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.7.tgz#706dce52d4b738dce01aee97f392ccdb79d51eef" + integrity sha512-JqBMguf2plv1IDqhOE6eebnTivjS/ej0C/Sw831jVc+dRQIMK37oyktdQCGAQtwpl5DikOWI2xGfIlBPSSLgXg== + dependencies: + jquery-deferred "^0.3.0" + lodash "^4.17.21" + qs "^6.2.0" + nan@^2.12.1: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" @@ -15238,7 +15284,7 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -qs@^6.4.0, qs@^6.9.4: +qs@^6.2.0, qs@^6.4.0, qs@^6.9.4: version "6.10.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== @@ -16030,7 +16076,7 @@ rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0 resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== -rsvp@^4.0.1, rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4, rsvp@^4.8.5: +rsvp@^4.0.1, rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4, rsvp@^4.8.5: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== @@ -16594,7 +16640,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.16, source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.10, source-map-support@~0.5.12, source-map-support@~0.5.19: +source-map-support@^0.5.0, source-map-support@^0.5.16, source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.10, source-map-support@~0.5.12, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==