aboutsummaryrefslogtreecommitdiffstats
path: root/config/webpack.config.js
diff options
context:
space:
mode:
Diffstat (limited to 'config/webpack.config.js')
-rw-r--r--config/webpack.config.js95
1 files changed, 58 insertions, 37 deletions
diff --git a/config/webpack.config.js b/config/webpack.config.js
index 010a51f..15cae74 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -11,16 +11,23 @@ global.production = process.env.NODE_ENV === "production";
global.webpackRequire = modulePath => require(path.resolve(CONFIG_DIR, "webpack", modulePath));
const CreateManifestPlugin = webpackRequire("plugins/create-manifest-webpack-plugin");
+const CreateRulesPlugin = webpackRequire("plugins/create-rules-webpack-plugin");
const InjectScriptPlugin = webpackRequire("plugins/inject-script-webpack-plugin");
const { inlineJavascript } = webpackRequire("utils/inline-javascript");
const { getScriptRuntimeFromType } = webpackRequire("utils/script-runtime");
-const { getFileNameHash } = webpackRequire("utils/file-name-hash");
+const { getFileNameHash } = webpackRequire("utils/filename-hash");
const scripts = webpackRequire("utils/scripts");
const sharedModules = webpackRequire("utils/shared-modules");
+const sharedModulesImportedCount = {};
+
+for (const sharedModule of sharedModules) {
+ sharedModulesImportedCount[sharedModule] = 0;
+}
+
const uninjectedScriptEntries = {};
const injectedAfterScriptEntries = {};
const injectedBeforeScriptEntries = {};
@@ -54,11 +61,16 @@ for (const scriptPath in scripts) {
for (const sharedModule of sharedModules) {
const sharedModuleNameHash = getFileNameHash(sharedModule, "shared");
+ const sharedModuleGlobalVariableName = `$${sharedModuleNameHash.substring(sharedModuleNameHash.length - 16)}`;
sharedModuleEntries[sharedModule] = {
import: path.resolve(SOURCE_DIR, "shared", sharedModule),
- filename: `shared/${sharedModuleNameHash}.js`
+ filename: `shared/${sharedModuleNameHash}.js`,
+ library: {
+ name: sharedModuleGlobalVariableName,
+ type: "var"
+ }
};
- sharedModuleExternals[`@/shared/${sharedModule}`] = `/shared/${sharedModuleNameHash}.js`;
+ sharedModuleExternals[`@/shared/${sharedModule}`] = sharedModuleGlobalVariableName;
}
const commonOptions = {
@@ -82,26 +94,32 @@ const commonOptions = {
},
optimization: {
minimize: process.env.NODE_ENV === "production"
- }
-};
-
-const ecmaScriptModuleOptions = {
- experiments: {
- outputModule: true,
- topLevelAwait: true
- }
-};
-
-const scriptOptions = {
+ },
output: {
iife: true
}
};
+const sharedModuleOptions = {
+ externals: sharedModuleExternals,
+ externalsType: "var",
+ module: {
+ rules: [
+ {
+ test: /\.(j|t)s$/,
+ loader: path.resolve(CONFIG_DIR, "webpack/loader/count-imports-loader.js"),
+ options: {
+ sharedModulesImportedCount
+ },
+ enforce: "post"
+ }
+ ]
+ },
+};
+
const uninjectedScriptConfiguration = merge(
commonOptions,
- ecmaScriptModuleOptions,
- scriptOptions,
+ sharedModuleOptions,
{
entry: uninjectedScriptEntries,
plugins: [
@@ -110,24 +128,13 @@ const uninjectedScriptConfiguration = merge(
from: path.resolve(ROOT_DIR, "static"),
to: "./"
}]
- }),
- new CreateManifestPlugin()
- ],
- module: {
- rules: [
- {
- enforce: "post",
- test: /\.(js|ts)$/,
- loader: "./config/webpack/loader/dynamic-imports-loader"
- }
- ]
- }
+ })
+ ]
}
);
const injectedAfterScriptConfiguration = merge(
commonOptions,
- scriptOptions,
{
entry: injectedAfterScriptEntries,
plugins: [
@@ -138,7 +145,6 @@ const injectedAfterScriptConfiguration = merge(
const injectedBeforeScriptConfiguration = merge(
commonOptions,
- scriptOptions,
{
entry: injectedBeforeScriptEntries,
plugins: [
@@ -147,17 +153,32 @@ const injectedBeforeScriptConfiguration = merge(
}
);
+const sortedSharedModules = []
+
const sharedModulesConfiguration = merge(
commonOptions,
- ecmaScriptModuleOptions,
+ sharedModuleOptions,
{
- output: {
- library: {
- type: "module"
- }
- },
entry: sharedModuleEntries,
- externals: sharedModuleExternals
+ plugins: [
+ new CreateManifestPlugin({
+ sharedModulesImportedCount,
+ sortedSharedModules
+ }),
+ new CreateRulesPlugin()
+ ],
+ module: {
+ rules: [
+ {
+ test: /\.(j|t)s$/,
+ loader: path.resolve(CONFIG_DIR, "webpack/loader/arrange-shared-module-loader.js"),
+ options: {
+ sortedSharedModules
+ },
+ enforce: "post"
+ }
+ ]
+ }
}
);