[MIRROR] Replaces babel with swc [MDB IGNORE] (#25631)

* Replaces babel with swc (#80310)

## About The Pull Request
Revival of #79943. I was not done with Babel. For some reason, swc was
running very high memory. It was the minifier. If we use our current,
only swapping out babel (the previous PR swapped the minifier AND
transpiler), we not only keep the memory usage down to current levels
but we **slash** TGUI build times. Look at these numbers!

<details>
<summary>Test environment / My specs</summary>

intel i7-13700kf
32GB RAM
windows 11
intel 660p m.2 SSD
asus 4080 TUF series

</details>

<details>
<summary>Benchmarks</summary>

### To perform these tests, build/install/compile once, then delete
everything in the tgui/.yarn/webpack folder and all files in tgui/public
**EXCEPT** tgui.html and tgui-polyfill.min.js

Babel is our CURRENT.

Build time

![2](https://github.com/tgstation/tgstation/assets/42397676/05324a54-2230-4173-a443-ef2aaa82e034)
SWC is 64.36% faster than our current solution

Peak memory usage

![1](https://github.com/tgstation/tgstation/assets/42397676/ab84a91d-7e48-43f8-be1b-7b7b9b36f30a)

</details>

What's the catch? Do we need to use node_modules now? No!

## Why It's Good For The Game
Faster build tools!
## Changelog
N/A nothing player facing

* Replaces babel with swc

---------

Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
This commit is contained in:
SkyratBot
2023-12-15 11:17:43 -05:00
committed by GitHub
co-authored by Jeremiah
parent 44ce89c464
commit b3900d5d42
6 changed files with 226 additions and 1393 deletions
+15
View File
@@ -0,0 +1,15 @@
{
"$schema": "https://json.schemastore.org/swcrc",
"jsc": {
"loose": true,
"parser": {
"syntax": "typescript",
"tsx": true
},
"transform": {
"react": {
"runtime": "automatic"
}
}
}
}
-52
View File
@@ -1,52 +0,0 @@
/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
*/
const createBabelConfig = (options) => {
const { presets = [], plugins = [], removeConsole } = options;
return {
presets: [
[
require.resolve('@babel/preset-typescript'),
{
allowDeclareFields: true,
},
],
[
require.resolve('@babel/preset-env'),
{
modules: 'commonjs',
useBuiltIns: 'entry',
corejs: '3.3.2',
spec: false,
loose: true,
targets: [],
},
],
[require.resolve('@babel/preset-react'), { runtime: 'automatic' }],
...presets,
].filter(Boolean),
plugins: [
[
require.resolve('@babel/plugin-transform-class-properties'),
{
loose: true,
},
],
require.resolve('@babel/plugin-transform-jscript'),
removeConsole && require.resolve('babel-plugin-transform-remove-console'),
require.resolve('common/string.babel-plugin.cjs'),
...plugins,
].filter(Boolean),
};
};
module.exports = (api) => {
api.cache(true);
const mode = process.env.NODE_ENV;
return createBabelConfig({ mode });
};
module.exports.createBabelConfig = createBabelConfig;
+1 -1
View File
@@ -8,7 +8,7 @@ module.exports = {
testEnvironment: 'jsdom',
testRunner: require.resolve('jest-circus/runner'),
transform: {
'^.+\\.(js|cjs|ts|tsx)$': require.resolve('babel-jest'),
'^.+\\.(js|cjs|ts|tsx)$': require.resolve('@swc/jest'),
},
moduleFileExtensions: ['js', 'cjs', 'ts', 'tsx', 'json'],
resetMocks: true,
+3 -11
View File
@@ -20,23 +20,14 @@
"tgui:tsc": "tsc"
},
"dependencies": {
"@babel/core": "^7.23.3",
"@babel/eslint-parser": "^7.23.3",
"@babel/plugin-transform-class-properties": "^7.23.3",
"@babel/plugin-transform-jscript": "^7.23.3",
"@babel/preset-env": "^7.23.3",
"@babel/preset-react": "^7.23.3",
"@babel/preset-typescript": "^7.23.3",
"@swc/core": "^1.3.100",
"@swc/jest": "^0.2.29",
"@types/jest": "^29.5.10",
"@types/jsdom": "^21.1.6",
"@types/node": "^14.x",
"@types/webpack": "^5.28.5",
"@types/webpack-env": "^1.18.4",
"@typescript-eslint/parser": "^5.62.0",
"babel-jest": "^29.7.0",
"babel-loader": "^8.3.0",
"babel-plugin-transform-remove-console": "^6.9.4",
"common": "workspace:*",
"css-loader": "^6.8.1",
"esbuild-loader": "^4.0.2",
"eslint": "^7.32.0",
@@ -54,6 +45,7 @@
"sass": "^1.69.5",
"sass-loader": "^13.3.2",
"style-loader": "^3.3.3",
"swc-loader": "^0.2.3",
"typescript": "^4.9.4",
"url-loader": "^4.1.1",
"webpack": "^5.89.0",
+2 -6
View File
@@ -7,7 +7,6 @@
const webpack = require('webpack');
const path = require('path');
const ExtractCssPlugin = require('mini-css-extract-plugin');
const { createBabelConfig } = require('./babel.config.js');
const createStats = (verbose) => ({
assets: verbose,
@@ -52,13 +51,10 @@ module.exports = (env = {}, argv) => {
module: {
rules: [
{
test: /\.(js(x)?|cjs|ts(x)?)$/,
test: /\.([tj]s(x)?|cjs)$/,
use: [
{
loader: require.resolve('babel-loader'),
options: createBabelConfig({
removeConsole: !bench,
}),
loader: require.resolve('swc-loader'),
},
],
},
+205 -1323
View File
File diff suppressed because it is too large Load Diff