X-Git-Url: http://these/git/?a=blobdiff_plain;f=webpack.config.js;h=267a14451912fe4699a93df47dab4946fb17b1ca;hb=b7ec7ae3110c560968e0cb24a32f1fe9166eec29;hp=dcb88c52cb0046e81132b2471b6327586a0d3264;hpb=35d20491ea54958f8442b10f68b41d28bda93052;p=lemmy-ui.git diff --git a/webpack.config.js b/webpack.config.js index dcb88c5..267a144 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,13 +1,11 @@ const webpack = require("webpack"); -const path = require("path"); +const { resolve } = require("path"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const nodeExternals = require("webpack-node-externals"); const CopyPlugin = require("copy-webpack-plugin"); const RunNodeWebpackPlugin = require("run-node-webpack-plugin"); -const merge = require("lodash.merge"); const { ServiceWorkerPlugin } = require("service-worker-webpack"); -const BundleAnalyzerPlugin = - require("webpack-bundle-analyzer").BundleAnalyzerPlugin; + const banner = ` hash:[contentHash], chunkhash:[chunkhash], name:[name], filebase:[base], query:[query], file:[file] Source code: https://github.com/LemmyNet/lemmy-ui @@ -15,99 +13,86 @@ const banner = ` @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL v3.0 `; -const base = { - output: { - filename: "js/server.js", - publicPath: "/", - hashFunction: "xxhash64", - }, - resolve: { - extensions: [".js", ".jsx", ".ts", ".tsx"], - alias: { - "@": path.resolve(__dirname, "src/"), - "@utils": path.resolve(__dirname, "src/shared/utils/"), +module.exports = (env, argv) => { + const mode = argv.mode; + + const base = { + output: { + filename: "js/server.js", + publicPath: "/", + hashFunction: "xxhash64", }, - }, - performance: { - hints: false, - }, - module: { - rules: [ - { - test: /\.(scss|css)$/i, - use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"], - }, - { - test: /\.(js|jsx|tsx|ts)$/, // All ts and tsx files will be process by - exclude: /node_modules/, // ignore node_modules - loader: "babel-loader", + resolve: { + extensions: [".js", ".jsx", ".ts", ".tsx"], + alias: { + "@": resolve(__dirname, "src/"), + "@utils": resolve(__dirname, "src/shared/utils/"), }, - // Due to some weird babel issue: https://github.com/webpack/webpack/issues/11467 - { - test: /\.m?js/, - resolve: { - fullySpecified: false, + }, + performance: { + hints: false, + }, + module: { + rules: [ + { + test: /\.(scss|css)$/i, + use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"], }, - }, + { + test: /\.(js|jsx|tsx|ts)$/, // All ts and tsx files will be process by + exclude: /node_modules/, // ignore node_modules + loader: "babel-loader", + }, + // Due to some weird babel issue: https://github.com/webpack/webpack/issues/11467 + { + test: /\.m?js/, + resolve: { + fullySpecified: false, + }, + }, + ], + }, + plugins: [ + new webpack.DefinePlugin({ + "process.env.COMMIT_HASH": `"${env.COMMIT_HASH}"`, + "process.env.NODE_ENV": `"${mode}"`, + }), + new MiniCssExtractPlugin({ + filename: "styles/styles.css", + }), + new CopyPlugin({ + patterns: [{ from: "./src/assets", to: "./assets" }], + }), + new webpack.BannerPlugin({ + banner, + }), ], - }, - plugins: [ - new MiniCssExtractPlugin({ - filename: "styles/styles.css", - }), - new CopyPlugin({ - patterns: [{ from: "./src/assets", to: "./assets" }], - }), - new webpack.BannerPlugin({ - banner, - }), - ], -}; + }; -const createServerConfig = (_env, mode) => { - const config = merge({}, base, { - mode, + const serverConfig = { + ...base, entry: "./src/server/index.tsx", output: { filename: "js/server.js", }, target: "node", externals: [nodeExternals(), "inferno-helmet"], - }); + }; - if (mode === "development") { - // config.cache = { - // type: "filesystem", - // name: "server", - // }; - - config.plugins.push( - new RunNodeWebpackPlugin({ - runOnlyInWatchMode: true, - }) - ); - } - - return config; -}; - -const createClientConfig = (_env, mode) => { - const config = merge({}, base, { - mode, + const clientConfig = { + ...base, entry: "./src/client/index.tsx", output: { filename: "js/client.js", + publicPath: `/static/${env.COMMIT_HASH}/`, }, plugins: [ ...base.plugins, new ServiceWorkerPlugin({ enableInDevelopment: mode !== "development", // this may seem counterintuitive, but it is correct workbox: { - modifyURLPrefix: { - "/": "/static/", - }, cacheId: "lemmy", - include: [/(assets|styles)\/.+\..+|client\.js$/g], + include: [/(assets|styles|js)\/.+\..+$/g], inlineWorkboxRuntime: true, runtimeCaching: [ { @@ -153,16 +138,21 @@ const createClientConfig = (_env, mode) => { }, }), ], - }); + }; - if (mode === "none") { - config.plugins.push(new BundleAnalyzerPlugin()); + if (mode === "development") { + // serverConfig.cache = { + // type: "filesystem", + // name: "server", + // }; + + serverConfig.plugins.push( + new RunNodeWebpackPlugin({ runOnlyInWatchMode: true }) + ); + } else if (mode === "none") { + const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer"); + serverConfig.plugins.push(new BundleAnalyzerPlugin()); } - return config; + return [serverConfig, clientConfig]; }; - -module.exports = (env, properties) => [ - createServerConfig(env, properties.mode || "development"), - createClientConfig(env, properties.mode || "development"), -];