|
@@ -1,17 +1,119 @@
|
|
|
-global.__childdir = __dirname;
|
|
|
const path = require("path");
|
|
|
-const { merge } = require("webpack-merge");
|
|
|
-const commonConfig = require("../common.webpack.prod.config");
|
|
|
+const TerserPlugin = require("terser-webpack-plugin");
|
|
|
+const BundleAnalyzerPlugin =
|
|
|
+ require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
|
|
|
+const autoprefixer = require("autoprefixer");
|
|
|
+const webpack = require("webpack");
|
|
|
+const { parseEnvVariables } = require("./env");
|
|
|
|
|
|
-const config = {
|
|
|
+module.exports = {
|
|
|
+ mode: "production",
|
|
|
entry: {
|
|
|
"excalidraw.production.min": "./entry.js",
|
|
|
},
|
|
|
output: {
|
|
|
path: path.resolve(__dirname, "dist"),
|
|
|
library: "ExcalidrawLib",
|
|
|
+ libraryTarget: "umd",
|
|
|
+ filename: "[name].js",
|
|
|
chunkFilename: "excalidraw-assets/[name]-[contenthash].js",
|
|
|
assetModuleFilename: "excalidraw-assets/[name][ext]",
|
|
|
+ publicPath: "",
|
|
|
+ },
|
|
|
+ resolve: {
|
|
|
+ extensions: [".js", ".ts", ".tsx", ".css", ".scss"],
|
|
|
+ },
|
|
|
+ module: {
|
|
|
+ rules: [
|
|
|
+ {
|
|
|
+ test: /\.(sa|sc|c)ss$/,
|
|
|
+ exclude: /node_modules/,
|
|
|
+ use: [
|
|
|
+ "style-loader",
|
|
|
+ {
|
|
|
+ loader: "css-loader",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ loader: "postcss-loader",
|
|
|
+ options: {
|
|
|
+ postcssOptions: {
|
|
|
+ plugins: [autoprefixer()],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ "sass-loader",
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ test: /\.(ts|tsx|js|jsx|mjs)$/,
|
|
|
+ exclude: /node_modules\/(?!browser-fs-access)/,
|
|
|
+ use: [
|
|
|
+ {
|
|
|
+ loader: "ts-loader",
|
|
|
+ options: {
|
|
|
+ transpileOnly: true,
|
|
|
+ configFile: path.resolve(__dirname, "../tsconfig.prod.json"),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ {
|
|
|
+ loader: "babel-loader",
|
|
|
+ options: {
|
|
|
+ presets: [
|
|
|
+ "@babel/preset-env",
|
|
|
+ ["@babel/preset-react", { runtime: "automatic" }],
|
|
|
+ "@babel/preset-typescript",
|
|
|
+ ],
|
|
|
+ plugins: [
|
|
|
+ "transform-class-properties",
|
|
|
+ "@babel/plugin-transform-runtime",
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ test: /\.(woff|woff2|eot|ttf|otf)$/,
|
|
|
+ type: "asset/resource",
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ optimization: {
|
|
|
+ minimize: true,
|
|
|
+ minimizer: [
|
|
|
+ new TerserPlugin({
|
|
|
+ test: /\.js($|\?)/i,
|
|
|
+ }),
|
|
|
+ ],
|
|
|
+ splitChunks: {
|
|
|
+ chunks: "async",
|
|
|
+ cacheGroups: {
|
|
|
+ vendors: {
|
|
|
+ test: /[\\/]node_modules[\\/]/,
|
|
|
+ name: "vendor",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ plugins: [
|
|
|
+ ...(process.env.ANALYZER === "true" ? [new BundleAnalyzerPlugin()] : []),
|
|
|
+ new webpack.DefinePlugin({
|
|
|
+ "process.env": parseEnvVariables(
|
|
|
+ path.resolve(__dirname, "../../../.env.production"),
|
|
|
+ ),
|
|
|
+ }),
|
|
|
+ ],
|
|
|
+ externals: {
|
|
|
+ react: {
|
|
|
+ root: "React",
|
|
|
+ commonjs2: "react",
|
|
|
+ commonjs: "react",
|
|
|
+ amd: "react",
|
|
|
+ },
|
|
|
+ "react-dom": {
|
|
|
+ root: "ReactDOM",
|
|
|
+ commonjs2: "react-dom",
|
|
|
+ commonjs: "react-dom",
|
|
|
+ amd: "react-dom",
|
|
|
+ },
|
|
|
},
|
|
|
};
|
|
|
-module.exports = merge(commonConfig, config);
|