diff --git a/config/webpack.config.dev.js b/config/webpack.config.dev.js index 17446b8c..914c0ce7 100644 --- a/config/webpack.config.dev.js +++ b/config/webpack.config.dev.js @@ -1,24 +1,26 @@ -'use strict'; +"use strict"; -const autoprefixer = require('autoprefixer'); -const path = require('path'); -const webpack = require('webpack'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); -const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin'); -const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin'); -const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); -const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); -const getClientEnvironment = require('./env'); -const paths = require('./paths'); +const autoprefixer = require("autoprefixer"); +const path = require("path"); +const webpack = require("webpack"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin"); +const InterpolateHtmlPlugin = require("react-dev-utils/InterpolateHtmlPlugin"); +const WatchMissingNodeModulesPlugin = require("react-dev-utils/WatchMissingNodeModulesPlugin"); +const ModuleScopePlugin = require("react-dev-utils/ModuleScopePlugin"); +const MonacoWebpackPlugin = require("monaco-editor-webpack-plugin"); -const publicPath = '/'; -const env = getClientEnvironment('/'); +const getClientEnvironment = require("./env"); + +const paths = require("./paths"); + +const publicPath = "/"; +const env = getClientEnvironment("/"); module.exports = { optimization: { splitChunks: { - chunks: 'async', + chunks: "async", // 大于30KB才单独分离成chunk minSize: 30000, maxAsyncRequests: 5, @@ -30,24 +32,24 @@ module.exports = { reuseExistingChunk: true, }, vendors: { - name: 'vendors', + name: "vendors", test: /[\\/]node_modules[\\/]/, priority: -10, - chunks: "all" - } - } + chunks: "all", + }, + }, }, - runtimeChunk: true + runtimeChunk: true, }, - mode: 'development', + mode: "development", // 开启调试 - devtool: "source-map", // 开启调试 + devtool: "source-map", // 开启调试 // These are the "entry points" to our application. // This means they will be the "root" imports that are included in JS bundle. // The first two entry points enable "hot" CSS and auto-refreshes for JS. entry: [ // We ship a few polyfills by default: - require.resolve('./polyfills'), + require.resolve("./polyfills"), // Include an alternative client for WebpackDevServer. A client's job is to // connect to WebpackDevServer by a socket and get notified about changes. // When you save a file, the client will either apply hot updates (in case @@ -58,7 +60,7 @@ module.exports = { // the line below with these two lines if you prefer the stock client: // require.resolve('webpack-dev-server/client') + '?/', // require.resolve('webpack/hot/dev-server'), - require.resolve('react-dev-utils/webpackHotDevClient'), + require.resolve("react-dev-utils/webpackHotDevClient"), // Finally, this is your app's code: paths.appIndexJs, // We include the app code last so that if there is a runtime error during @@ -68,25 +70,25 @@ module.exports = { output: { // Add /* filename */ comments to generated require()s in the output. pathinfo: true, - globalObject: 'this', + globalObject: "this", // This does not produce a real file. It's just the virtual path that is // served by WebpackDevServer in development. This is the JS bundle // containing code from all our entry points, and the Webpack runtime. - filename: 'static/js/bundle.js', + filename: "static/js/bundle.js", // There are also additional JS chunk files if you use code splitting. - chunkFilename: 'static/js/[name].chunk.js', + chunkFilename: "static/js/[name].chunk.js", // This is the URL that app is served from. We use "/" in development. publicPath, // Point sourcemap entries to original disk location (format as URL on Windows) - devtoolModuleFilenameTemplate: info => - path.resolve(info.absoluteResourcePath).replace(/\\/g, '/'), + devtoolModuleFilenameTemplate: (info) => + path.resolve(info.absoluteResourcePath).replace(/\\/g, "/"), }, resolve: { // This allows you to set a fallback for where Webpack should look for modules. // We placed these paths second because we want `node_modules` to "win" // if there are any conflicts. This matches Node resolution mechanism. // https://github.com/facebookincubator/create-react-app/issues/253 - modules: ['node_modules', paths.appNodeModules].concat( + modules: ["node_modules", paths.appNodeModules].concat( // It is guaranteed to exist because we tweak it in `env.js` process.env.NODE_PATH.split(path.delimiter).filter(Boolean) ), @@ -96,13 +98,12 @@ module.exports = { // https://github.com/facebookincubator/create-react-app/issues/290 // `web` extension prefixes have been added for better support // for React Native Web. - extensions: ['.web.js', '.mjs', '.js', '.json', '.web.jsx', '.jsx'], + extensions: [".web.js", ".mjs", ".js", ".json", ".web.jsx", ".jsx"], alias: { - - "educoder": __dirname + "/../src/common/educoder.js", + educoder: __dirname + "/../src/common/educoder.js", // Support React Native Web // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/ - 'react-native': 'react-native-web', + "react-native": "react-native-web", }, plugins: [ // Prevents users from importing files from outside of src/ (or node_modules/). @@ -126,10 +127,10 @@ module.exports = { // A missing `test` is equivalent to a match. { test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/], - loader: require.resolve('url-loader'), + loader: require.resolve("url-loader"), options: { limit: 10000, - name: 'static/media/[name].[hash:8].[ext]', + name: "static/media/[name].[hash:8].[ext]", }, }, // Process JS with Babel. @@ -137,19 +138,22 @@ module.exports = { test: /\.(js|jsx|mjs)$/, include: paths.appSrc, exclude: /node_modules/, - loader: require.resolve('babel-loader'), + loader: require.resolve("babel-loader"), options: { // This is a feature of `babel-loader` for webpack (not Babel itself). // It enables caching results in ./node_modules/.cache/babel-loader/ // directory for faster rebuilds. cacheDirectory: true, - "plugins": [ - ["import", { - "libraryName": "antd", - "libraryDirectory": "es", - "style": "css" - }] - ] + plugins: [ + [ + "import", + { + libraryName: "antd", + libraryDirectory: "es", + style: "css", + }, + ], + ], }, }, // "postcss" loader applies autoprefixer to our CSS. @@ -160,29 +164,29 @@ module.exports = { { test: /\.css$/, use: [ - require.resolve('style-loader'), + require.resolve("style-loader"), { - loader: require.resolve('css-loader'), + loader: require.resolve("css-loader"), options: { importLoaders: 1, }, }, { - loader: require.resolve('postcss-loader'), + loader: require.resolve("postcss-loader"), options: { // Necessary for external CSS imports to work // https://github.com/facebookincubator/create-react-app/issues/2677 - ident: 'postcss', + ident: "postcss", plugins: () => [ - require('postcss-flexbugs-fixes'), + require("postcss-flexbugs-fixes"), autoprefixer({ browsers: [ - '>1%', - 'last 4 versions', - 'Firefox ESR', - 'not ie < 9', // React doesn't support IE8 anyway + ">1%", + "last 4 versions", + "Firefox ESR", + "not ie < 9", // React doesn't support IE8 anyway ], - flexbox: 'no-2009', + flexbox: "no-2009", }), ], }, @@ -192,7 +196,7 @@ module.exports = { { test: /\.scss$/, use: [ - require.resolve('style-loader'), + require.resolve("style-loader"), { loader: require.resolve("css-loader"), options: { @@ -200,8 +204,8 @@ module.exports = { }, }, { - loader: require.resolve("sass-loader") - } + loader: require.resolve("sass-loader"), + }, ], }, // "file" loader makes sure those assets get served by WebpackDevServer. @@ -215,9 +219,9 @@ module.exports = { // Also exclude `html` and `json` extensions so they get processed // by webpacks internal loaders. exclude: [/\.(js|jsx|mjs)$/, /\.html$/, /\.json$/], - loader: require.resolve('file-loader'), + loader: require.resolve("file-loader"), options: { - name: 'static/media/[name].[hash:8].[ext]', + name: "static/media/[name].[hash:8].[ext]", }, }, ], @@ -261,17 +265,18 @@ module.exports = { // You can remove this if you don't use Moment.js: new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), new MonacoWebpackPlugin({ - features: ['!gotoSymbol'], - }) + features: ["coreCommands", "find"], + languages: ['plaintext','apex', 'azcli', 'bat', 'clojure', 'coffee', 'cpp', 'csharp', 'csp', 'css', 'dockerfile', 'fsharp', 'go', 'handlebars', 'html', 'ini', 'java', 'javascript', 'json', 'less', 'lua', 'markdown', 'msdax', 'mysql', 'objective', 'perl', 'pgsql', 'php', 'postiats', 'powerquery', 'powershell', 'pug', 'python', 'r', 'razor', 'redis', 'redshift', 'ruby', 'rust', 'sb', 'scheme', 'scss', 'shell', 'solidity', 'sql', 'st', 'swift', 'typescript', 'vb', 'xml', 'yaml'] + }), ], // Some libraries import Node modules but don't use them in the browser. // Tell Webpack to provide empty mocks for them so importing them works. node: { - dgram: 'empty', - fs: 'empty', - net: 'empty', - tls: 'empty', - child_process: 'empty', + dgram: "empty", + fs: "empty", + net: "empty", + tls: "empty", + child_process: "empty", }, // Turn off performance hints during development because we don't do any // splitting or minification in interest of speed. These warnings become diff --git a/config/webpack.config.prod.js b/config/webpack.config.prod.js index 1fc0f0ca..838da647 100644 --- a/config/webpack.config.prod.js +++ b/config/webpack.config.prod.js @@ -1,25 +1,25 @@ -'use strict'; -const autoprefixer = require('autoprefixer'); -const path = require('path'); -const webpack = require('webpack'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const ManifestPlugin = require('webpack-manifest-plugin'); -const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin'); -const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin'); -const eslintFormatter = require('react-dev-utils/eslintFormatter'); -const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); -const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); +"use strict"; +const autoprefixer = require("autoprefixer"); +const path = require("path"); +const webpack = require("webpack"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const ManifestPlugin = require("webpack-manifest-plugin"); +const InterpolateHtmlPlugin = require("react-dev-utils/InterpolateHtmlPlugin"); +const SWPrecacheWebpackPlugin = require("sw-precache-webpack-plugin"); +const eslintFormatter = require("react-dev-utils/eslintFormatter"); +const ModuleScopePlugin = require("react-dev-utils/ModuleScopePlugin"); +const MonacoWebpackPlugin = require("monaco-editor-webpack-plugin"); -const TerserJSPlugin = require('terser-webpack-plugin'); -const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); +const TerserJSPlugin = require("terser-webpack-plugin"); +const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); -const paths = require('./paths'); -const getClientEnvironment = require('./env'); +const paths = require("./paths"); +const getClientEnvironment = require("./env"); // Some apps do not use client-side routing with pushState. // For these, "homepage" can be set to "." to enable relative asset paths. -let publicPath = '/react/build/'; +let publicPath = "/react/build/"; // let nodeEnv = process.env.NODE_ENV // if (nodeEnv === 'testBuild') { // publicPath = 'https://testforgeplus.trustie.net/react/build/'; @@ -28,7 +28,7 @@ let publicPath = '/react/build/'; // publicPath = 'https://forgeplus.trustie.net/react/build/'; // } const publicUrl = publicPath.slice(0, -1); -const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false'; +const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false"; const env = getClientEnvironment(publicPath); // This is the production configuration. @@ -36,296 +36,301 @@ const env = getClientEnvironment(publicPath); // The development configuration is different and lives in a separate file. // 上线用的 module.exports = { - optimization: { - minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})], - splitChunks: { - chunks: 'async', - // 大于30KB才单独分离成chunk - minSize: 30000, - maxAsyncRequests: 5, - maxInitialRequests: 3, - name: true, - cacheGroups: { - default: { - minChunks: 2, - priority: -20, - reuseExistingChunk: true, - }, - // vendors: { - // name: 'vendors', - // test: /[\\/]node_modules[\\/]/, - // priority: -10, - // chunks: "all" - // } - } - }, - runtimeChunk: true - }, - bail: true, - mode: 'production', - devtool: false,//测试版 - entry: [require.resolve('./polyfills'), paths.appIndexJs], - output: { - path: paths.appBuild, - globalObject: 'this', - filename: './static/js/[name].[contenthash:8].js', - chunkFilename: './static/js/[name].[contenthash:8].chunk.js', - publicPath, + optimization: { + minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})], + splitChunks: { + chunks: "async", + // 大于30KB才单独分离成chunk + minSize: 30000, + maxAsyncRequests: 5, + maxInitialRequests: 3, + name: true, + cacheGroups: { + default: { + minChunks: 2, + priority: -20, + reuseExistingChunk: true, + }, + // vendors: { + // name: 'vendors', + // test: /[\\/]node_modules[\\/]/, + // priority: -10, + // chunks: "all" + // } + }, + }, + runtimeChunk: true, + }, + bail: true, + mode: "production", + devtool: false, //测试版 + entry: [require.resolve("./polyfills"), paths.appIndexJs], + output: { + path: paths.appBuild, + globalObject: "this", + filename: "./static/js/[name].[contenthash:8].js", + chunkFilename: "./static/js/[name].[contenthash:8].chunk.js", + publicPath, - // Point sourcemap entries to original disk location (format as URL on Windows) - devtoolModuleFilenameTemplate: info => - path - .relative(paths.appSrc, info.absoluteResourcePath) - .replace(/\\/g, '/'), - }, - resolve: { - // This allows you to set a fallback for where Webpack should look for modules. - // We placed these paths second because we want `node_modules` to "win" - // if there are any conflicts. This matches Node resolution mechanism. - // https://github.com/facebookincubator/create-react-app/issues/253 - modules: ['node_modules', paths.appNodeModules].concat( - // It is guaranteed to exist because we tweak it in `env.js` - process.env.NODE_PATH.split(path.delimiter).filter(Boolean) - ), - // These are the reasonable defaults supported by the Node ecosystem. - // We also include JSX as a common component filename extension to support - // some tools, although we do not recommend using it, see: - // https://github.com/facebookincubator/create-react-app/issues/290 - // `web` extension prefixes have been added for better support - // for React Native Web. - extensions: ['.web.js', '.mjs', '.js', '.json', '.web.jsx', '.jsx'], - alias: { - "educoder": __dirname + "/../src/common/educoder.js", - // Support React Native Web - // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/ - 'react-native': 'react-native-web', - }, - plugins: [ - // Prevents users from importing files from outside of src/ (or node_modules/). - // This often causes confusion because we only process files within src/ with babel. - // To fix this, we prevent you from importing files out of src/ -- if you'd like to, - // please link the files into your node_modules/ and let module-resolution kick in. - // Make sure your source files are compiled, as they will not be processed in any way. - new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]), - ], - }, - module: { - strictExportPresence: true, - rules: [ - { - test: /\.(js|jsx|mjs)$/, - enforce: 'pre', - use: [ - { - options: { - formatter: eslintFormatter, - eslintPath: require.resolve('eslint'), + // Point sourcemap entries to original disk location (format as URL on Windows) + devtoolModuleFilenameTemplate: (info) => + path + .relative(paths.appSrc, info.absoluteResourcePath) + .replace(/\\/g, "/"), + }, + resolve: { + // This allows you to set a fallback for where Webpack should look for modules. + // We placed these paths second because we want `node_modules` to "win" + // if there are any conflicts. This matches Node resolution mechanism. + // https://github.com/facebookincubator/create-react-app/issues/253 + modules: ["node_modules", paths.appNodeModules].concat( + // It is guaranteed to exist because we tweak it in `env.js` + process.env.NODE_PATH.split(path.delimiter).filter(Boolean) + ), + // These are the reasonable defaults supported by the Node ecosystem. + // We also include JSX as a common component filename extension to support + // some tools, although we do not recommend using it, see: + // https://github.com/facebookincubator/create-react-app/issues/290 + // `web` extension prefixes have been added for better support + // for React Native Web. + extensions: [".web.js", ".mjs", ".js", ".json", ".web.jsx", ".jsx"], + alias: { + educoder: __dirname + "/../src/common/educoder.js", + // Support React Native Web + // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/ + "react-native": "react-native-web", + }, + plugins: [ + // Prevents users from importing files from outside of src/ (or node_modules/). + // This often causes confusion because we only process files within src/ with babel. + // To fix this, we prevent you from importing files out of src/ -- if you'd like to, + // please link the files into your node_modules/ and let module-resolution kick in. + // Make sure your source files are compiled, as they will not be processed in any way. + new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]), + ], + }, + module: { + strictExportPresence: true, + rules: [ + { + test: /\.(js|jsx|mjs)$/, + enforce: "pre", + use: [ + { + options: { + formatter: eslintFormatter, + eslintPath: require.resolve("eslint"), + }, + loader: require.resolve("eslint-loader"), + }, + ], + include: paths.appSrc, + }, + { + // "oneOf" will traverse all following loaders until one will + // match the requirements. When no loader matches it will fall + // back to the "file" loader at the end of the loader list. + oneOf: [ + // "url" loader works just like "file" loader but it also embeds + // assets smaller than specified size as data URLs to avoid requests. + { + test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/], + loader: require.resolve("url-loader"), + options: { + limit: 10000, + name: "static/media/[name].[hash:8].[ext]", + }, + }, + // Process JS with Babel. + { + test: /\.(js|jsx|mjs)$/, + include: paths.appSrc, + exclude: /node_modules/, + loader: require.resolve("babel-loader"), + options: { + compact: true, + plugins: [ + [ + "import", + { + libraryName: "antd", + libraryDirectory: "es", + style: "css", + }, + ], + ], + }, + }, - }, - loader: require.resolve('eslint-loader'), - }, - ], - include: paths.appSrc, - }, - { - // "oneOf" will traverse all following loaders until one will - // match the requirements. When no loader matches it will fall - // back to the "file" loader at the end of the loader list. - oneOf: [ - // "url" loader works just like "file" loader but it also embeds - // assets smaller than specified size as data URLs to avoid requests. - { - test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/], - loader: require.resolve('url-loader'), - options: { - limit: 10000, - name: 'static/media/[name].[hash:8].[ext]', - }, - }, - // Process JS with Babel. - { - test: /\.(js|jsx|mjs)$/, - include: paths.appSrc, - exclude: /node_modules/, - loader: require.resolve('babel-loader'), - options: { - compact: true, - "plugins": [ - ["import", { - "libraryName": "antd", - "libraryDirectory": "es", - "style": "css" - }] - ] - }, - }, + { + test: /\.css$/, - { - test: /\.css$/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath, + }, + }, + { + loader: require.resolve("css-loader"), + options: { + importLoaders: 1, + sourceMap: shouldUseSourceMap, + }, + }, + { + loader: require.resolve("postcss-loader"), + options: { + ident: "postcss", + plugins: () => [ + require("postcss-flexbugs-fixes"), + autoprefixer({ + browsers: [ + ">1%", + "last 4 versions", + "Firefox ESR", + "not ie < 9", // React doesn't support IE8 anyway + ], + flexbox: "no-2009", + }), + ], + }, + }, + ], + }, + { + test: /\.scss$/, + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath, + }, + }, + { + loader: require.resolve("css-loader"), + options: { + importLoaders: 1, + sourceMap: shouldUseSourceMap, + }, + }, + { + loader: require.resolve("sass-loader"), + }, + ], + }, + // "file" loader makes sure assets end up in the `build` folder. + // When you `import` an asset, you get its filename. + // This loader doesn't use a "test" so it will catch all modules + // that fall through the other loaders. + { + loader: require.resolve("file-loader"), + // Exclude `js` files to keep "css" loader working as it injects + // it's runtime that would otherwise processed through "file" loader. + // Also exclude `html` and `json` extensions so they get processed + // by webpacks internal loaders. + exclude: [/\.(js|jsx|mjs)$/, /\.html$/, /\.json$/], + options: { + name: "static/media/[name].[contenthash:8].[ext]", + }, + }, + // ** STOP ** Are you adding a new loader? + // Make sure to add the new loader(s) before the "file" loader. + ], + }, + ], + }, + plugins: [ + // Makes some environment variables available in index.html. + // The public URL is available as %PUBLIC_URL% in index.html, e.g.: + // + // In production, it will be an empty string unless you specify "homepage" + // in `package.json`, in which case it will be the pathname of that URL. + // Generates an `index.html` file with the