From 1068969a1051bb6ba9bebe84d09d87fa7e653868 Mon Sep 17 00:00:00 2001 From: "Hung-Han (Henry) Chen" Date: Wed, 30 Jun 2021 12:02:04 +0300 Subject: [PATCH] Use esbuild loader Signed-off-by: Hung-Han (Henry) Chen --- src/common/getTSLoader.ts | 63 +++++++++++++++++++++++++++++++++++++++ webpack.main.ts | 12 ++------ webpack.renderer.ts | 12 ++------ 3 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 src/common/getTSLoader.ts diff --git a/src/common/getTSLoader.ts b/src/common/getTSLoader.ts new file mode 100644 index 0000000000..6c76770d5d --- /dev/null +++ b/src/common/getTSLoader.ts @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import esbuild from "esbuild"; + +/** + * A function returning webpack ts/tsx loader + * + * depends on env LENS_DEV_USE_ESBUILD_LOADER to use esbuild-loader (faster) or good-old ts-loader + * + * @param testRegExp - the regex for webpack to conditional find the files + * @returns ts/tsx webpack loader configuration object + */ +const getTSLoader = ( + testRegExp: RegExp, transpileOnly = true +) => { + const useEsbuildLoader = process.env.LENS_DEV_USE_ESBUILD_LOADER === "true"; + + useEsbuildLoader && console.info(`\nšŸš€ using esbuild-loader for ts(x)`); + + if (useEsbuildLoader) { + return { + test: testRegExp, + loader: "esbuild-loader", + options: { + loader: "tsx", + target: "es2015", + implementation: esbuild + }, + }; + } + + return { + test: testRegExp, + exclude: /node_modules/, + use: { + loader: "ts-loader", + options: { + transpileOnly, + } + } + }; +}; + +export default getTSLoader; diff --git a/webpack.main.ts b/webpack.main.ts index 26550de14f..ae78d06d09 100755 --- a/webpack.main.ts +++ b/webpack.main.ts @@ -26,6 +26,7 @@ import { isProduction, mainDir, buildDir, isDevelopment } from "./src/common/var import nodeExternals from "webpack-node-externals"; import ProgressBarPlugin from "progress-bar-webpack-plugin"; import * as vars from "./src/common/vars"; +import getTSLoader from "./src/common/getTSLoader"; export default function (): webpack.Configuration { console.info("WEBPACK:main", vars); @@ -55,16 +56,7 @@ export default function (): webpack.Configuration { test: /\.node$/, use: "node-loader" }, - { - test: /\.ts$/, - exclude: /node_modules/, - use: { - loader: "ts-loader", - options: { - transpileOnly: true, - } - } - }, + getTSLoader(/\.ts$/) ] }, plugins: [ diff --git a/webpack.renderer.ts b/webpack.renderer.ts index eafc636a5c..027d18ac08 100755 --- a/webpack.renderer.ts +++ b/webpack.renderer.ts @@ -28,6 +28,7 @@ import ForkTsCheckerPlugin from "fork-ts-checker-webpack-plugin"; import ProgressBarPlugin from "progress-bar-webpack-plugin"; import ReactRefreshWebpackPlugin from "@pmmmwh/react-refresh-webpack-plugin"; import * as vars from "./src/common/vars"; +import getTSLoader from "./src/common/getTSLoader"; export default [ webpackLensRenderer @@ -88,16 +89,7 @@ export function webpackLensRenderer({ showVars = true } = {}): webpack.Configura test: /\.node$/, use: "node-loader" }, - { - test: /\.tsx?$/, - exclude: /node_modules/, - use: { - loader: "ts-loader", - options: { - transpileOnly: true, // ForkTsCheckerPlugin does type-checking - } - } - }, + getTSLoader(/\.tsx?$/), { test: /\.(jpg|png|svg|map|ico)$/, use: {