[7.x] [kbn/ui-shared-deps] expand and split (#62364) (#62522)

* [kbn/ui-shared-deps] expand and split (#62364)

* [kbn/ui-shared-deps] expand and split

* add two import styles for eui/react-dom that are new

Co-authored-by: spalger <spalger@users.noreply.github.com>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>

* update yarn.lock file

Co-authored-by: spalger <spalger@users.noreply.github.com>
Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
This commit is contained in:
Spencer 2020-04-04 10:25:12 -07:00 committed by GitHub
parent fec6b7c37e
commit 33fa13eab2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 115 additions and 73 deletions

View file

@ -235,6 +235,7 @@
"react-monaco-editor": "~0.27.0", "react-monaco-editor": "~0.27.0",
"react-redux": "^7.1.3", "react-redux": "^7.1.3",
"react-resize-detector": "^4.2.0", "react-resize-detector": "^4.2.0",
"react-router": "^5.1.2",
"react-router-dom": "^5.1.2", "react-router-dom": "^5.1.2",
"react-sizeme": "^2.3.6", "react-sizeme": "^2.3.6",
"react-use": "^13.27.0", "react-use": "^13.27.0",

View file

@ -27,7 +27,7 @@ import TerserPlugin from 'terser-webpack-plugin';
import webpackMerge from 'webpack-merge'; import webpackMerge from 'webpack-merge';
// @ts-ignore // @ts-ignore
import { CleanWebpackPlugin } from 'clean-webpack-plugin'; import { CleanWebpackPlugin } from 'clean-webpack-plugin';
import * as SharedDeps from '@kbn/ui-shared-deps'; import * as UiSharedDeps from '@kbn/ui-shared-deps';
import { Bundle, WorkerConfig, parseDirPath, DisallowedSyntaxPlugin } from '../common'; import { Bundle, WorkerConfig, parseDirPath, DisallowedSyntaxPlugin } from '../common';
@ -71,7 +71,7 @@ export function getWebpackConfig(bundle: Bundle, worker: WorkerConfig) {
}, },
externals: { externals: {
...SharedDeps.externals, ...UiSharedDeps.externals,
}, },
plugins: [new CleanWebpackPlugin(), new DisallowedSyntaxPlugin()], plugins: [new CleanWebpackPlugin(), new DisallowedSyntaxPlugin()],

View file

@ -38,7 +38,7 @@
"brace": "0.11.1", "brace": "0.11.1",
"chalk": "^2.4.2", "chalk": "^2.4.2",
"chokidar": "3.2.1", "chokidar": "3.2.1",
"core-js": "^3.2.1", "core-js": "^3.6.4",
"css-loader": "^3.4.2", "css-loader": "^3.4.2",
"expose-loader": "^0.7.5", "expose-loader": "^0.7.5",
"file-loader": "^4.2.0", "file-loader": "^4.2.0",

View file

@ -17,31 +17,40 @@
* under the License. * under the License.
*/ */
// import global polyfills before everything else
require('./polyfills'); require('./polyfills');
// must load before angular // must load before angular
export const Jquery = require('jquery'); export const Jquery = require('jquery');
window.$ = window.jQuery = Jquery; window.$ = window.jQuery = Jquery;
export const Angular = require('angular'); // stateful deps
export const ElasticCharts = require('@elastic/charts');
export const ElasticEui = require('@elastic/eui');
export const ElasticEuiLibServices = require('@elastic/eui/lib/services');
export const ElasticEuiLightTheme = require('@elastic/eui/dist/eui_theme_light.json');
export const ElasticEuiDarkTheme = require('@elastic/eui/dist/eui_theme_dark.json');
export const KbnI18n = require('@kbn/i18n'); export const KbnI18n = require('@kbn/i18n');
export const KbnI18nAngular = require('@kbn/i18n/angular'); export const KbnI18nAngular = require('@kbn/i18n/angular');
export const KbnI18nReact = require('@kbn/i18n/react'); export const KbnI18nReact = require('@kbn/i18n/react');
export const Angular = require('angular');
export const Moment = require('moment'); export const Moment = require('moment');
export const MomentTimezone = require('moment-timezone/moment-timezone'); export const MomentTimezone = require('moment-timezone/moment-timezone');
export const Monaco = require('./monaco.ts');
export const MonacoBare = require('monaco-editor/esm/vs/editor/editor.api');
export const React = require('react'); export const React = require('react');
export const ReactDom = require('react-dom'); export const ReactDom = require('react-dom');
export const ReactDomServer = require('react-dom/server');
export const ReactIntl = require('react-intl'); export const ReactIntl = require('react-intl');
export const ReactRouter = require('react-router'); // eslint-disable-line export const ReactRouter = require('react-router'); // eslint-disable-line
export const ReactRouterDom = require('react-router-dom'); export const ReactRouterDom = require('react-router-dom');
export const Monaco = require('./monaco.ts');
export const MonacoBare = require('monaco-editor/esm/vs/editor/editor.api');
// load timezone data into moment-timezone
Moment.tz.load(require('moment-timezone/data/packed/latest.json')); Moment.tz.load(require('moment-timezone/data/packed/latest.json'));
// big deps which are locked to a single version
export const Rxjs = require('rxjs');
export const RxjsOperators = require('rxjs/operators');
export const ElasticCharts = require('@elastic/charts');
export const ElasticEui = require('@elastic/eui');
export const ElasticEuiLibServices = require('@elastic/eui/lib/services');
export const ElasticEuiLibServicesFormat = require('@elastic/eui/lib/services/format');
export const ElasticEuiLightTheme = require('@elastic/eui/dist/eui_theme_light.json');
export const ElasticEuiDarkTheme = require('@elastic/eui/dist/eui_theme_dark.json');
export const ElasticEuiChartsTheme = require('@elastic/eui/dist/eui_charts_theme');
// massive deps that we should really get rid of or reduce in size substantially
export const ElasticsearchBrowser = require('elasticsearch-browser/elasticsearch.js');

View file

@ -25,7 +25,12 @@ export const distDir: string;
/** /**
* Filename of the main bundle file in the distributable directory * Filename of the main bundle file in the distributable directory
*/ */
export const distFilename: string; export const jsFilename: string;
/**
* Filename of files that must be loaded before the jsFilename
*/
export const jsDepFilenames: string[];
/** /**
* Filename of the unthemed css file in the distributable directory * Filename of the unthemed css file in the distributable directory

View file

@ -20,17 +20,14 @@
const Path = require('path'); const Path = require('path');
exports.distDir = Path.resolve(__dirname, 'target'); exports.distDir = Path.resolve(__dirname, 'target');
exports.distFilename = 'kbn-ui-shared-deps.js'; exports.jsDepFilenames = ['kbn-ui-shared-deps.@elastic.js'];
exports.jsFilename = 'kbn-ui-shared-deps.js';
exports.baseCssDistFilename = 'kbn-ui-shared-deps.css'; exports.baseCssDistFilename = 'kbn-ui-shared-deps.css';
exports.lightCssDistFilename = 'kbn-ui-shared-deps.light.css'; exports.lightCssDistFilename = 'kbn-ui-shared-deps.light.css';
exports.darkCssDistFilename = 'kbn-ui-shared-deps.dark.css'; exports.darkCssDistFilename = 'kbn-ui-shared-deps.dark.css';
exports.externals = { exports.externals = {
// stateful deps
angular: '__kbnSharedDeps__.Angular', angular: '__kbnSharedDeps__.Angular',
'@elastic/charts': '__kbnSharedDeps__.ElasticCharts',
'@elastic/eui': '__kbnSharedDeps__.ElasticEui',
'@elastic/eui/lib/services': '__kbnSharedDeps__.ElasticEuiLibServices',
'@elastic/eui/dist/eui_theme_light.json': '__kbnSharedDeps__.ElasticEuiLightTheme',
'@elastic/eui/dist/eui_theme_dark.json': '__kbnSharedDeps__.ElasticEuiDarkTheme',
'@kbn/i18n': '__kbnSharedDeps__.KbnI18n', '@kbn/i18n': '__kbnSharedDeps__.KbnI18n',
'@kbn/i18n/angular': '__kbnSharedDeps__.KbnI18nAngular', '@kbn/i18n/angular': '__kbnSharedDeps__.KbnI18nAngular',
'@kbn/i18n/react': '__kbnSharedDeps__.KbnI18nReact', '@kbn/i18n/react': '__kbnSharedDeps__.KbnI18nReact',
@ -39,10 +36,31 @@ exports.externals = {
'moment-timezone': '__kbnSharedDeps__.MomentTimezone', 'moment-timezone': '__kbnSharedDeps__.MomentTimezone',
react: '__kbnSharedDeps__.React', react: '__kbnSharedDeps__.React',
'react-dom': '__kbnSharedDeps__.ReactDom', 'react-dom': '__kbnSharedDeps__.ReactDom',
'react-dom/server': '__kbnSharedDeps__.ReactDomServer',
'react-intl': '__kbnSharedDeps__.ReactIntl', 'react-intl': '__kbnSharedDeps__.ReactIntl',
'react-router': '__kbnSharedDeps__.ReactRouter', 'react-router': '__kbnSharedDeps__.ReactRouter',
'react-router-dom': '__kbnSharedDeps__.ReactRouterDom', 'react-router-dom': '__kbnSharedDeps__.ReactRouterDom',
'@kbn/ui-shared-deps/monaco': '__kbnSharedDeps__.Monaco', '@kbn/ui-shared-deps/monaco': '__kbnSharedDeps__.Monaco',
// this is how plugins/consumers from npm load monaco // this is how plugins/consumers from npm load monaco
'monaco-editor/esm/vs/editor/editor.api': '__kbnSharedDeps__.MonacoBare', 'monaco-editor/esm/vs/editor/editor.api': '__kbnSharedDeps__.MonacoBare',
/**
* big deps which are locked to a single version
*/
rxjs: '__kbnSharedDeps__.Rxjs',
'rxjs/operators': '__kbnSharedDeps__.RxjsOperators',
'@elastic/charts': '__kbnSharedDeps__.ElasticCharts',
'@elastic/eui': '__kbnSharedDeps__.ElasticEui',
'@elastic/eui/lib/services': '__kbnSharedDeps__.ElasticEuiLibServices',
'@elastic/eui/lib/services/format': '__kbnSharedDeps__.ElasticEuiLibServicesFormat',
'@elastic/eui/dist/eui_charts_theme': '__kbnSharedDeps__.ElasticEuiChartsTheme',
'@elastic/eui/dist/eui_theme_light.json': '__kbnSharedDeps__.ElasticEuiLightTheme',
'@elastic/eui/dist/eui_theme_dark.json': '__kbnSharedDeps__.ElasticEuiDarkTheme',
/**
* massive deps that we should really get rid of or reduce in size substantially
*/
elasticsearch: '__kbnSharedDeps__.ElasticsearchBrowser',
'elasticsearch-browser': '__kbnSharedDeps__.ElasticsearchBrowser',
'elasticsearch-browser/elasticsearch': '__kbnSharedDeps__.ElasticsearchBrowser',
}; };

View file

@ -1,37 +1,41 @@
{ {
"name": "@kbn/ui-shared-deps", "name": "@kbn/ui-shared-deps",
"version": "1.0.0", "version": "1.0.0",
"license": "Apache-2.0",
"private": true, "private": true,
"license": "Apache-2.0",
"scripts": { "scripts": {
"build": "node scripts/build", "build": "node scripts/build",
"kbn:bootstrap": "node scripts/build --dev", "kbn:bootstrap": "node scripts/build --dev",
"kbn:watch": "node scripts/build --watch" "kbn:watch": "node scripts/build --watch"
}, },
"devDependencies": { "dependencies": {
"abortcontroller-polyfill": "^1.4.0",
"@elastic/eui": "21.0.1",
"@kbn/babel-preset": "1.0.0",
"@elastic/charts": "^18.1.1", "@elastic/charts": "^18.1.1",
"@kbn/dev-utils": "1.0.0", "@elastic/eui": "21.0.1",
"@kbn/i18n": "1.0.0", "@kbn/i18n": "1.0.0",
"@yarnpkg/lockfile": "^1.1.0", "abortcontroller-polyfill": "^1.4.0",
"angular": "^1.7.9", "angular": "^1.7.9",
"core-js": "^3.2.1", "core-js": "^3.2.1",
"css-loader": "^3.4.2",
"custom-event-polyfill": "^0.3.0", "custom-event-polyfill": "^0.3.0",
"del": "^5.1.0", "elasticsearch-browser": "^16.7.0",
"jquery": "^3.4.1", "jquery": "^3.4.1",
"mini-css-extract-plugin": "0.8.0",
"moment": "^2.24.0", "moment": "^2.24.0",
"moment-timezone": "^0.5.27", "moment-timezone": "^0.5.27",
"monaco-editor": "~0.17.0",
"react": "^16.12.0",
"react-dom": "^16.12.0", "react-dom": "^16.12.0",
"react-intl": "^2.8.0", "react-intl": "^2.8.0",
"react": "^16.12.0", "react-router": "^5.1.2",
"read-pkg": "^5.2.0", "react-router-dom": "^5.1.2",
"regenerator-runtime": "^0.13.3", "regenerator-runtime": "^0.13.3",
"rxjs": "^6.5.3",
"symbol-observable": "^1.2.0", "symbol-observable": "^1.2.0",
"webpack": "^4.41.5",
"whatwg-fetch": "^3.0.0" "whatwg-fetch": "^3.0.0"
},
"devDependencies": {
"@kbn/babel-preset": "1.0.0",
"@kbn/dev-utils": "1.0.0",
"css-loader": "^3.4.2",
"del": "^5.1.0",
"webpack": "^4.41.5"
} }
} }

View file

@ -23,19 +23,19 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { REPO_ROOT } = require('@kbn/dev-utils'); const { REPO_ROOT } = require('@kbn/dev-utils');
const webpack = require('webpack'); const webpack = require('webpack');
const SharedDeps = require('./index'); const UiSharedDeps = require('./index');
const MOMENT_SRC = require.resolve('moment/min/moment-with-locales.js'); const MOMENT_SRC = require.resolve('moment/min/moment-with-locales.js');
exports.getWebpackConfig = ({ dev = false } = {}) => ({ exports.getWebpackConfig = ({ dev = false } = {}) => ({
mode: dev ? 'development' : 'production', mode: dev ? 'development' : 'production',
entry: { entry: {
[SharedDeps.distFilename.replace(/\.js$/, '')]: './entry.js', 'kbn-ui-shared-deps': './entry.js',
[SharedDeps.darkCssDistFilename.replace(/\.css$/, '')]: [ 'kbn-ui-shared-deps.dark': [
'@elastic/eui/dist/eui_theme_dark.css', '@elastic/eui/dist/eui_theme_dark.css',
'@elastic/charts/dist/theme_only_dark.css', '@elastic/charts/dist/theme_only_dark.css',
], ],
[SharedDeps.lightCssDistFilename.replace(/\.css$/, '')]: [ 'kbn-ui-shared-deps.light': [
'@elastic/eui/dist/eui_theme_light.css', '@elastic/eui/dist/eui_theme_light.css',
'@elastic/charts/dist/theme_only_light.css', '@elastic/charts/dist/theme_only_light.css',
], ],
@ -43,7 +43,7 @@ exports.getWebpackConfig = ({ dev = false } = {}) => ({
context: __dirname, context: __dirname,
devtool: dev ? '#cheap-source-map' : false, devtool: dev ? '#cheap-source-map' : false,
output: { output: {
path: SharedDeps.distDir, path: UiSharedDeps.distDir,
filename: '[name].js', filename: '[name].js',
sourceMapFilename: '[file].map', sourceMapFilename: '[file].map',
publicPath: '__REPLACE_WITH_PUBLIC_PATH__', publicPath: '__REPLACE_WITH_PUBLIC_PATH__',
@ -81,6 +81,16 @@ exports.getWebpackConfig = ({ dev = false } = {}) => ({
optimization: { optimization: {
noEmitOnErrors: true, noEmitOnErrors: true,
splitChunks: {
cacheGroups: {
'kbn-ui-shared-deps.@elastic': {
name: 'kbn-ui-shared-deps.@elastic',
test: m => m.resource && m.resource.includes('@elastic'),
chunks: 'all',
enforce: true,
},
},
},
}, },
performance: { performance: {

View file

@ -0,0 +1 @@
../../yarn.lock

View file

@ -76,6 +76,14 @@ if (window.__kbnStrictCsp__ && window.__kbnCspNotEnforced__) {
load({ load({
deps: [ deps: [
{{#each sharedJsDepFilenames}}
'{{../regularBundlePath}}/kbn-ui-shared-deps/{{this}}',
{{/each}}
],
urls: [
{
deps: [
'{{regularBundlePath}}/kbn-ui-shared-deps/{{sharedJsFilename}}',
{ {
deps: [ deps: [
'{{dllBundlePath}}/vendors_runtime.bundle.dll.js' '{{dllBundlePath}}/vendors_runtime.bundle.dll.js'
@ -86,14 +94,15 @@ if (window.__kbnStrictCsp__ && window.__kbnCspNotEnforced__) {
{{/each}} {{/each}}
] ]
}, },
'{{regularBundlePath}}/kbn-ui-shared-deps/{{sharedDepsFilename}}',
'{{regularBundlePath}}/commons.bundle.js', '{{regularBundlePath}}/commons.bundle.js',
], ],
urls: [ urls: [
'{{regularBundlePath}}/{{appId}}.bundle.js', '{{regularBundlePath}}/{{appId}}.bundle.js',
{{#each styleSheetPaths}} {{#each styleSheetPaths}}
'{{this}}', '{{this}}',
{{/each}}, {{/each}}
]
}
] ]
}); });
}; };

View file

@ -134,7 +134,8 @@ export function uiRenderMixin(kbnServer, server, config) {
dllBundlePath, dllBundlePath,
dllJsChunks, dllJsChunks,
styleSheetPaths, styleSheetPaths,
sharedDepsFilename: UiSharedDeps.distFilename, sharedJsFilename: UiSharedDeps.jsFilename,
sharedJsDepFilenames: UiSharedDeps.jsDepFilenames,
darkMode, darkMode,
}, },
}); });

View file

@ -54,7 +54,11 @@ module.exports = function(grunt) {
return [ return [
'http://localhost:5610/test_bundle/built_css.css', 'http://localhost:5610/test_bundle/built_css.css',
`http://localhost:5610/bundles/kbn-ui-shared-deps/${UiSharedDeps.distFilename}`, ...UiSharedDeps.jsDepFilenames.map(
chunkFilename => `http://localhost:5610/bundles/kbn-ui-shared-deps/${chunkFilename}`
),
`http://localhost:5610/bundles/kbn-ui-shared-deps/${UiSharedDeps.jsFilename}`,
'http://localhost:5610/built_assets/dlls/vendors_runtime.bundle.dll.js', 'http://localhost:5610/built_assets/dlls/vendors_runtime.bundle.dll.js',
...DllCompiler.getRawDllConfig().chunks.map( ...DllCompiler.getRawDllConfig().chunks.map(
chunk => `http://localhost:5610/built_assets/dlls/vendors${chunk}.bundle.dll.js` chunk => `http://localhost:5610/built_assets/dlls/vendors${chunk}.bundle.dll.js`

View file

@ -1,21 +0,0 @@
/*
* Licensed to Elasticsearch B.V. under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
require('angular');
module.exports = require('elasticsearch-browser/elasticsearch.angular.js');

View file

@ -316,6 +316,7 @@
"react-portal": "^3.2.0", "react-portal": "^3.2.0",
"react-redux": "^7.1.3", "react-redux": "^7.1.3",
"react-reverse-portal": "^1.0.4", "react-reverse-portal": "^1.0.4",
"react-router": "^5.1.2",
"react-router-dom": "^5.1.2", "react-router-dom": "^5.1.2",
"react-shortcuts": "^2.0.0", "react-shortcuts": "^2.0.0",
"react-sticky": "^6.0.3", "react-sticky": "^6.0.3",

View file

@ -24201,7 +24201,7 @@ react-router-redux@^4.0.8:
resolved "https://registry.yarnpkg.com/react-router-redux/-/react-router-redux-4.0.8.tgz#227403596b5151e182377dab835b5d45f0f8054e" resolved "https://registry.yarnpkg.com/react-router-redux/-/react-router-redux-4.0.8.tgz#227403596b5151e182377dab835b5d45f0f8054e"
integrity sha1-InQDWWtRUeGCN32rg1tdRfD4BU4= integrity sha1-InQDWWtRUeGCN32rg1tdRfD4BU4=
react-router@5.1.2: react-router@5.1.2, react-router@^5.1.2:
version "5.1.2" version "5.1.2"
resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418" resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418"
integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A== integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==