From becad7b3c77b8fe9cb170a4ff6ca2e679af83baf Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sat, 4 Jul 2020 22:16:06 -0700 Subject: [PATCH] Cut out all of the unused ace editor modes; significantly reduces bundle size --- .../scripts/components/elements/AceEditor.tsx | 30 ++----------------- resources/scripts/modes.js | 25 ++++++++++++++++ webpack.config.js | 3 ++ 3 files changed, 31 insertions(+), 27 deletions(-) create mode 100644 resources/scripts/modes.js diff --git a/resources/scripts/components/elements/AceEditor.tsx b/resources/scripts/components/elements/AceEditor.tsx index 9f9866388..0b4ebca95 100644 --- a/resources/scripts/components/elements/AceEditor.tsx +++ b/resources/scripts/components/elements/AceEditor.tsx @@ -3,6 +3,8 @@ import ace, { Editor } from 'brace'; import styled from 'styled-components/macro'; import tw from 'twin.macro'; import Select from '@/components/elements/Select'; +// @ts-ignore +import modes from '@/modes'; // @ts-ignore require('brace/ext/modelist'); @@ -18,32 +20,6 @@ const EditorContainer = styled.div` } `; -const modes: { [k: string]: string } = { - assembly_x86: 'Assembly (x86)', - c_cpp: 'C++', - coffee: 'Coffeescript', - css: 'CSS', - dockerfile: 'Dockerfile', - golang: 'Go', - html: 'HTML', - ini: 'Ini', - java: 'Java', - javascript: 'Javascript', - json: 'JSON', - kotlin: 'Kotlin', - lua: 'Luascript', - perl: 'Perl', - php: 'PHP', - properties: 'Properties', - python: 'Python', - ruby: 'Ruby', - plain_text: 'Plaintext', - toml: 'TOML', - typescript: 'Typescript', - xml: 'XML', - yaml: 'YAML', -}; - Object.keys(modes).forEach(mode => require(`brace/mode/${mode}`)); export interface Props { @@ -117,7 +93,7 @@ export default ({ style, initialContent, initialModePath, fetchContent, onConten > { Object.keys(modes).map(key => ( - + )) } diff --git a/resources/scripts/modes.js b/resources/scripts/modes.js new file mode 100644 index 000000000..e5f4bd04f --- /dev/null +++ b/resources/scripts/modes.js @@ -0,0 +1,25 @@ +module.exports = { + assembly_x86: 'Assembly (x86)', + c_cpp: 'C++', + coffee: 'Coffeescript', + css: 'CSS', + dockerfile: 'Dockerfile', + golang: 'Go', + html: 'HTML', + ini: 'Ini', + java: 'Java', + javascript: 'Javascript', + json: 'JSON', + kotlin: 'Kotlin', + lua: 'Luascript', + perl: 'Perl', + php: 'PHP', + properties: 'Properties', + python: 'Python', + ruby: 'Ruby', + plain_text: 'Plaintext', + toml: 'TOML', + typescript: 'Typescript', + xml: 'XML', + yaml: 'YAML', +}; diff --git a/webpack.config.js b/webpack.config.js index ddef4d9aa..a4d533687 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,10 +1,12 @@ const path = require('path'); +const webpack = require('webpack'); const AssetsManifestPlugin = require('webpack-assets-manifest'); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const isProduction = process.env.NODE_ENV === 'production'; +const modes = Object.keys(require('./resources/scripts/modes')); module.exports = { cache: true, @@ -72,6 +74,7 @@ module.exports = { moment: 'moment', }, plugins: [ + new webpack.ContextReplacementPlugin(/brace[/\\](mode|worker)/, new RegExp(`^\.\/(${modes.join('|')})$`)), new AssetsManifestPlugin({ writeToDisk: true, publicPath: true, integrity: true, integrityHashes: ['sha384'] }), !isProduction ? new ForkTsCheckerWebpackPlugin({ eslint: {