From b1785a889f337460b29551bc7f85728aefd9df71 Mon Sep 17 00:00:00 2001 From: Arpit Chakladar <54011232+arpitchakladar@users.noreply.github.com> Date: Thu, 9 Feb 2023 22:18:58 +0530 Subject: Using a single webpack config for all scripts. --- config/webpack.config.js | 105 +++++++++------------ .../create-manifest-webpack-plugin/index.js | 6 +- .../plugins/inject-script-webpack-plugin.js | 2 +- 3 files changed, 48 insertions(+), 65 deletions(-) diff --git a/config/webpack.config.js b/config/webpack.config.js index f4b05c7..fb618db 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -18,82 +18,63 @@ let scriptBuildConfigs = []; let injectedScriptsCount = 0; -const allScripts = {}; +const entries = {}; + +const _scripts = {}; for (const scriptType in scripts) { - const currentScripts = scripts[scriptType]; - for (const script in currentScripts) { - allScripts[currentScripts[script]] = allScripts[currentScripts[script]] || {}; - allScripts[currentScripts[script]][getScriptRuntimeFromType(scriptType)] = [ - ...(allScripts[currentScripts[script]][getScriptRuntimeFromType(scriptType)] || []), - script - ] - } + _scripts[getScriptRuntimeFromType(scriptType)] = { + ..._scripts[getScriptRuntimeFromType(scriptType)], + ...scripts[scriptType] + }; } -for (const scriptPath in allScripts) { - for (const scriptRuntime in allScripts[scriptPath]) { - const scripts = allScripts[scriptPath]; - if (scripts[scriptRuntime]) { - const importStatements = scripts[scriptRuntime].map(script => +for (const scriptRuntime in _scripts) { + const scripts = _scripts[scriptRuntime]; + for (const script in scripts) { + const scriptPath = scripts[script]; + entries[`${scriptRuntime} - "${scriptPath}"`] = { + import: inlineJavascript(Object.keys(scripts).map(script => `import "${path.resolve(process.env.SOURCE_DIR, "scripts", script)}";` - ).join("\n"); - - scriptBuildConfigs.push({ - entry: inlineJavascript(importStatements), - name: `${scriptPath} - ${scriptRuntime}`, - mode: "production", - output: { - filename: `scripts/${getFileNameHash(scriptPath)}/${scriptRuntime}.js` - }, - resolve: { - extensions: ["", ".ts", ".js"], - alias: { - "@": process.env.SOURCE_DIR - } - }, - module: { - rules: [ - { - test: /\.tsx?$/, - loader: "ts-loader", - options: { - configFile: "config/tsconfig.json" - } - }, - { - test: new RegExp(`^${path.resolve(process.env.SOURCE_DIR, "scripts")}`), - loader: path.resolve(process.env.CONFIG_DIR, "webpack/loaders/scoped-loader") - } - ] - }, - plugins: [ - new SanitizeScriptsImportPlugin() - ].concat( - scriptRuntime === "document_start" - ? [new InjectScriptPlugin()] - : [] - ) - }); - } + ).join("\n")), + filename: `scripts/${getFileNameHash(scriptPath)}/${scriptRuntime}.js` + }; } } -scriptBuildConfigs.push({ - name: "manifest", - entry: inlineJavascript(""), - output: { - filename: `manifest.json` +module.exports = { + entry: entries, + mode: "production", + resolve: { + extensions: ["", ".ts", ".js"], + alias: { + "@": process.env.SOURCE_DIR + } + }, + module: { + rules: [ + { + test: /\.tsx?$/, + loader: "ts-loader", + options: { + configFile: "config/tsconfig.json" + } + }, + { + test: new RegExp(`^${path.resolve(process.env.SOURCE_DIR, "scripts")}`), + loader: path.resolve(process.env.CONFIG_DIR, "webpack/loaders/scoped-loader") + } + ] }, plugins: [ + new SanitizeScriptsImportPlugin(), + new InjectScriptPlugin(), new CopyPlugin({ patterns: [{ from: path.resolve(process.env.ROOT_DIR, "static"), to: "./" }] }), - new CreateManifestPlugin({ scripts }) + new CreateManifestPlugin() ] -}); - -module.exports = scriptBuildConfigs; +}; diff --git a/config/webpack/plugins/create-manifest-webpack-plugin/index.js b/config/webpack/plugins/create-manifest-webpack-plugin/index.js index fcfe689..7044be2 100644 --- a/config/webpack/plugins/create-manifest-webpack-plugin/index.js +++ b/config/webpack/plugins/create-manifest-webpack-plugin/index.js @@ -1,12 +1,14 @@ const { sources } = require("webpack"); const path = require("path"); +const scripts = require(path.resolve(process.env.SOURCE_DIR, "scripts.json")); + const { version } = require(path.resolve(process.env.ROOT_DIR, "package.json")); const { getScriptRuntimeFromType } = require(path.resolve(process.env.CONFIG_DIR, "webpack/utils/script-runtime")); const { getFileNameHash } = require(path.resolve(process.env.CONFIG_DIR, "webpack/utils/file-name-hash")); class CreateManifestPlugin { - constructor({ scripts }) { + constructor() { this.scripts = {}; this.manifest = require("./manifest-template.json"); for (const scriptType in scripts) { @@ -50,7 +52,7 @@ class CreateManifestPlugin { } } - compilation.updateAsset( + compilation.emitAsset( "manifest.json", new sources.RawSource(JSON.stringify(this.manifest)) ); diff --git a/config/webpack/plugins/inject-script-webpack-plugin.js b/config/webpack/plugins/inject-script-webpack-plugin.js index 98620ea..b6525f6 100644 --- a/config/webpack/plugins/inject-script-webpack-plugin.js +++ b/config/webpack/plugins/inject-script-webpack-plugin.js @@ -18,7 +18,7 @@ class InjectScriptPlugin { }, async assets => { for (const assetName in assets) { - if (assetName.endsWith(".js")) { + if (assetName.endsWith("document_start.js")) { const currentAssetContent = compilation.getAsset(assetName).source.source(); const scripts = { before: "", -- cgit v1.2.3