diff --git a/lib/Dashboard/CasesOverviewWidget.php b/lib/Dashboard/CasesOverviewWidget.php index ad4ef47..e6abb48 100644 --- a/lib/Dashboard/CasesOverviewWidget.php +++ b/lib/Dashboard/CasesOverviewWidget.php @@ -117,6 +117,9 @@ public function getUrl(): ?string */ public function load(): void { + // Shared vendor chunks emitted by webpack splitChunks (see webpack.config.js). + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-vendor'); + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-nc-vue'); Util::addScript(Application::APP_ID, Application::APP_ID.'-casesOverviewWidget'); Util::addStyle(Application::APP_ID, 'dashboardWidgets'); diff --git a/lib/Dashboard/DeadlineAlertsWidget.php b/lib/Dashboard/DeadlineAlertsWidget.php index c248607..0deb932 100644 --- a/lib/Dashboard/DeadlineAlertsWidget.php +++ b/lib/Dashboard/DeadlineAlertsWidget.php @@ -118,6 +118,9 @@ public function getUrl(): ?string */ public function load(): void { + // Shared vendor chunks emitted by webpack splitChunks (see webpack.config.js). + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-vendor'); + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-nc-vue'); Util::addScript(Application::APP_ID, Application::APP_ID.'-deadlineAlertsWidget'); Util::addStyle(Application::APP_ID, 'dashboardWidgets'); diff --git a/lib/Dashboard/MyTasksWidget.php b/lib/Dashboard/MyTasksWidget.php index 31025e6..7d5a3d7 100644 --- a/lib/Dashboard/MyTasksWidget.php +++ b/lib/Dashboard/MyTasksWidget.php @@ -117,6 +117,9 @@ public function getUrl(): ?string */ public function load(): void { + // Shared vendor chunks emitted by webpack splitChunks (see webpack.config.js). + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-vendor'); + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-nc-vue'); Util::addScript(Application::APP_ID, Application::APP_ID.'-myTasksWidget'); Util::addStyle(Application::APP_ID, 'dashboardWidgets'); diff --git a/lib/Dashboard/OverdueCasesWidget.php b/lib/Dashboard/OverdueCasesWidget.php index 2b88efa..0309585 100644 --- a/lib/Dashboard/OverdueCasesWidget.php +++ b/lib/Dashboard/OverdueCasesWidget.php @@ -117,6 +117,9 @@ public function getUrl(): ?string */ public function load(): void { + // Shared vendor chunks emitted by webpack splitChunks (see webpack.config.js). + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-vendor'); + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-nc-vue'); Util::addScript(Application::APP_ID, Application::APP_ID.'-overdueCasesWidget'); Util::addStyle(Application::APP_ID, 'dashboardWidgets'); diff --git a/lib/Dashboard/StalledCasesWidget.php b/lib/Dashboard/StalledCasesWidget.php index 70280b5..81aa5d2 100644 --- a/lib/Dashboard/StalledCasesWidget.php +++ b/lib/Dashboard/StalledCasesWidget.php @@ -118,6 +118,9 @@ public function getUrl(): ?string */ public function load(): void { + // Shared vendor chunks emitted by webpack splitChunks (see webpack.config.js). + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-vendor'); + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-nc-vue'); Util::addScript(Application::APP_ID, Application::APP_ID.'-stalledCasesWidget'); Util::addStyle(Application::APP_ID, 'dashboardWidgets'); diff --git a/lib/Dashboard/StartCaseWidget.php b/lib/Dashboard/StartCaseWidget.php index 836abfb..8a449b3 100644 --- a/lib/Dashboard/StartCaseWidget.php +++ b/lib/Dashboard/StartCaseWidget.php @@ -112,6 +112,9 @@ public function getUrl(): ?string */ public function load(): void { + // Shared vendor chunks emitted by webpack splitChunks (see webpack.config.js). + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-vendor'); + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-nc-vue'); Util::addScript(Application::APP_ID, Application::APP_ID.'-startCaseWidget'); Util::addStyle(Application::APP_ID, 'dashboardWidgets'); }//end load() diff --git a/lib/Dashboard/TaskRemindersWidget.php b/lib/Dashboard/TaskRemindersWidget.php index ef852eb..bceca4b 100644 --- a/lib/Dashboard/TaskRemindersWidget.php +++ b/lib/Dashboard/TaskRemindersWidget.php @@ -118,6 +118,9 @@ public function getUrl(): ?string */ public function load(): void { + // Shared vendor chunks emitted by webpack splitChunks (see webpack.config.js). + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-vendor'); + Util::addScript(Application::APP_ID, Application::APP_ID.'-shared-nc-vue'); Util::addScript(Application::APP_ID, Application::APP_ID.'-taskRemindersWidget'); Util::addStyle(Application::APP_ID, 'dashboardWidgets'); diff --git a/webpack.config.js b/webpack.config.js index 6125f44..d8e9627 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -101,4 +101,41 @@ webpackConfig.plugins = [ // preventing the nextcloud-vue submodule's nested deps (Vue 3) from leaking in. webpackConfig.resolve.alias['@nextcloud/dialogs'] = path.resolve(__dirname, 'node_modules/@nextcloud/dialogs') +// Share Vue + @nextcloud/vue + pinia + icons + @conduction/nextcloud-vue +// across every entry-point so each widget bundle no longer inlines its own +// ~5 MB framework copy. Stable filenames (no contenthash in the JS name) +// mean each widget's `Util::addScript` PHP call can reference the chunk +// directly without a manifest. The vendor chunk is loaded once and cached +// across every widget/page in the app. +webpackConfig.optimization = { + ...(webpackConfig.optimization || {}), + splitChunks: { + ...(webpackConfig.optimization?.splitChunks || {}), + chunks: 'all', + cacheGroups: { + default: false, + defaultVendors: false, + ncVue: { + name: appId + '-shared-nc-vue', + // Matches both node_modules entries AND the monorepo-dev alias + // `../nextcloud-vue/src/...` which webpack resolves outside + // node_modules when @conduction/nextcloud-vue is aliased to it. + test: /[\\/]node_modules[\\/](@nextcloud[\\/]vue|@conduction[\\/]nextcloud-vue)[\\/]|[\\/]nextcloud-vue[\\/]src[\\/]/, + priority: 30, + reuseExistingChunk: true, + enforce: true, + filename: appId + '-shared-nc-vue.js', + }, + vendor: { + name: appId + '-shared-vendor', + test: /[\\/]node_modules[\\/](vue|pinia|vue-material-design-icons|@vueuse|core-js)[\\/]/, + priority: 20, + reuseExistingChunk: true, + enforce: true, + filename: appId + '-shared-vendor.js', + }, + }, + }, +} + module.exports = webpackConfig