React学习之旅----按需加载Antd UI组件及自定义主题

package.json

  "babel": {

"presets": [

"react-app"

],

"plugins": [

[

"import",

{

"libraryName": "antd",

"style": true

}

]

]

}

{

"name": "reactcms",

"version": "0.1.0",

"private": true,

"dependencies": {

"@babel/core": "7.1.0",

"@svgr/webpack": "2.4.1",

"antd": "^3.10.2",

"axios": "^0.18.0",

"babel-core": "7.0.0-bridge.0",

"babel-eslint": "9.0.0",

"babel-jest": "23.6.0",

"babel-loader": "8.0.4",

"babel-plugin-import": "^1.10.0",

"babel-plugin-named-asset-import": "^0.2.2",

"babel-preset-react-app": "^5.0.4",

"bfj": "6.1.1",

"case-sensitive-paths-webpack-plugin": "2.1.2",

"chalk": "2.4.1",

"css-loader": "1.0.0",

"dotenv": "6.0.0",

"dotenv-expand": "4.2.0",

"eslint": "5.6.0",

"eslint-config-react-app": "^3.0.4",

"eslint-loader": "2.1.1",

"eslint-plugin-flowtype": "2.50.1",

"eslint-plugin-import": "2.14.0",

"eslint-plugin-jsx-a11y": "6.1.2",

"eslint-plugin-react": "7.11.1",

"file-loader": "2.0.0",

"fs-extra": "7.0.0",

"html-webpack-plugin": "4.0.0-alpha.2",

"identity-obj-proxy": "3.0.0",

"jest": "23.6.0",

"jest-pnp-resolver": "1.0.1",

"jest-resolve": "23.6.0",

"less": "^3.8.1",

"less-loader": "^4.1.0",

"mini-css-extract-plugin": "0.4.3",

"optimize-css-assets-webpack-plugin": "5.0.1",

"pnp-webpack-plugin": "1.1.0",

"postcss-flexbugs-fixes": "4.1.0",

"postcss-loader": "3.0.0",

"postcss-preset-env": "6.0.6",

"postcss-safe-parser": "4.0.1",

"react": "^16.6.0",

"react-app-polyfill": "^0.1.3",

"react-app-rewired": "^1.6.2",

"react-dev-utils": "^6.0.5",

"react-dom": "^16.6.0",

"react-router-dom": "^4.3.1",

"resolve": "1.8.1",

"sass-loader": "7.1.0",

"style-loader": "0.23.0",

"terser-webpack-plugin": "1.1.0",

"url": "^0.11.0",

"url-loader": "1.1.1",

"webpack": "4.19.1",

"webpack-dev-server": "3.1.9",

"webpack-manifest-plugin": "2.0.4",

"workbox-webpack-plugin": "3.6.2"

},

"scripts": {

"start": "node scripts/start.js",

"build": "node scripts/build.js",

"test": "node scripts/test.js"

},

"eslintConfig": {

"extends": "react-app"

},

"browserslist": [

">0.2%",

"not dead",

"not ie <= 11",

"not op_mini all"

],

"jest": {

"collectCoverageFrom": [

"src/**/*.{js,jsx}"

],

"resolver": "jest-pnp-resolver",

"setupFiles": [

"react-app-polyfill/jsdom"

],

"testMatch": [

"<rootDir>/src/**/__tests__/**/*.{js,jsx}",

"<rootDir>/src/**/?(*.)(spec|test).{js,jsx}"

],

"testEnvironment": "jsdom",

"testURL": "http://localhost",

"transform": {

"^.+\\.(js|jsx)$": "<rootDir>/node_modules/babel-jest",

"^.+\\.css$": "<rootDir>/config/jest/cssTransform.js",

"^(?!.*\\.(js|jsx|css|json)$)": "<rootDir>/config/jest/fileTransform.js"

},

"transformIgnorePatterns": [

"[/\\\\]node_modules[/\\\\].+\\.(js|jsx)$",

"^.+\\.module\\.(css|sass|scss)$"

],

"moduleNameMapper": {

"^react-native$": "react-native-web",

"^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy"

},

"moduleFileExtensions": [

"web.js",

"js",

"json",

"web.jsx",

"jsx",

"node"

]

},

"babel": {

"presets": [

"react-app"

],

"plugins": [

[

"import",

{

"libraryName": "antd",

"style": true

}

]

]

}

}

webpack.config.dev.js中68-88 

  if (preProcessor) {

let loader = require.resolve(preProcessor)

if (preProcessor === "less-loader") {

loader = {

loader,

options: {

modifyVars: {

'primary-color': '#000000',

'link-color': '#1DA57A',

'border-radius-base': '2px',

},

javascriptEnabled: true,

}

}

}

loaders.push(loader);

}

 

'use strict';

const path = require('path');

const webpack = require('webpack');

const PnpWebpackPlugin = require('pnp-webpack-plugin');

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 getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent');

const getClientEnvironment = require('./env');

const paths = require('./paths');

const ManifestPlugin = require('webpack-manifest-plugin');

const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin');

// Webpack uses `publicPath` to determine where the app is being served from.

// In development, we always serve from the root. This makes config easier.

const publicPath = '/';

// `publicUrl` is just like `publicPath`, but we will provide it to our app

// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.

// Omit trailing slash as %PUBLIC_PATH%/xyz looks better than %PUBLIC_PATH%xyz.

const publicUrl = '';

// Get environment variables to inject into our app.

const env = getClientEnvironment(publicUrl);

// style files regexes

const cssRegex = /\.css$/;

const cssModuleRegex = /\.module\.css$/;

const lessRegex = /\.less$/;

const lessModuleRegex = /\.module\.less$/;

const sassRegex = /\.(scss|sass)$/;

const sassModuleRegex = /\.module\.(scss|sass)$/;

// common function to get style loaders

const getStyleLoaders = (cssOptions, preProcessor) => {

const loaders = [

require.resolve('style-loader'),

{

loader: require.resolve('css-loader'),

options: cssOptions,

},

{

// Options for PostCSS as we reference these options twice

// Adds vendor prefixing based on your specified browser support in

// package.json

loader: require.resolve('postcss-loader'),

options: {

// Necessary for external CSS imports to work

// https://github.com/facebook/create-react-app/issues/2677

ident: 'postcss',

plugins: () => [

require('postcss-flexbugs-fixes'),

require('postcss-preset-env')({

autoprefixer: {

flexbox: 'no-2009',

},

stage: 3,

}),

],

},

},

];

// if (preProcessor) {

// loaders.push(require.resolve(preProcessor));

// }

if (preProcessor) {

let loader = require.resolve(preProcessor)

if (preProcessor === "less-loader") {

loader = {

loader,

options: {

modifyVars: {

'primary-color': '#000000',

'link-color': '#1DA57A',

'border-radius-base': '2px',

},

javascriptEnabled: true,

}

}

}

loaders.push(loader);

}

return loaders;

};

// This is the development configuration.

// It is focused on developer experience and fast rebuilds.

// The production configuration is different and lives in a separate file.

module.exports = {

mode: 'development',

// You may want 'eval' instead if you prefer to see the compiled output in DevTools.

// See the discussion in https://github.com/facebook/create-react-app/issues/343

devtool: 'cheap-module-source-map',

// These are the "entry points" to our application.

// This means they will be the "root" imports that are included in JS bundle.

entry: [

// 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

// of CSS changes), or refresh the page (in case of JS changes). When you

// make a syntax error, this client will display a syntax error overlay.

// Note: instead of the default WebpackDevServer client, we use a custom one

// to bring better experience for Create React App users. You can replace

// 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'),

// Finally, this is your app's code:

paths.appIndexJs,

// We include the app code last so that if there is a runtime error during

// initialization, it doesn't blow up the WebpackDevServer client, and

// changing JS code would still trigger a refresh.

],

output: {

// Add /* filename */ comments to generated require()s in the output.

pathinfo: true,

// 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',

// There are also additional JS chunk files if you use code splitting.

chunkFilename: 'static/js/[name].chunk.js',

// This is the URL that app is served from. We use "/" in development.

publicPath: publicPath,

// Point sourcemap entries to original disk location (format as URL on Windows)

devtoolModuleFilenameTemplate: info =>

path.resolve(info.absoluteResourcePath).replace(/\\/g, '/'),

},

optimization: {

// Automatically split vendor and commons

// https://twitter.com/wSokra/status/969633336732905474

// https://medium.com/webpack/webpack-4-code-splitting-chunk-graph-and-the-splitchunks-optimization-be739a861366

splitChunks: {

chunks: 'all',

name: false,

},

// Keep the runtime chunk seperated to enable long term caching

// https://twitter.com/wSokra/status/969679223278505985

runtimeChunk: true,

},

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/facebook/create-react-app/issues/253

modules: ['node_modules'].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/facebook/create-react-app/issues/290

// `web` extension prefixes have been added for better support

// for React Native Web.

extensions: ['.mjs', '.web.js', '.js', '.json', '.web.jsx', '.jsx'],

alias: {

// 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: [

// Adds support for installing with Plug'n'Play, leading to faster installs and adding

// guards against forgotten dependencies and such.

PnpWebpackPlugin,

// 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]),

],

},

resolveLoader: {

plugins: [

// Also related to Plug'n'Play, but this time it tells Webpack to load its loaders

// from the current package.

PnpWebpackPlugin.moduleLoader(module),

],

},

module: {

strictExportPresence: true,

rules: [

// Disable require.ensure as it's not a standard language feature.

{ parser: { requireEnsure: false } },

// First, run the linter.

// It's important to do this before Babel processes the JS.

{

test: /\.(js|mjs|jsx)$/,

enforce: 'pre',

use: [

{

options: {

formatter: require.resolve('react-dev-utils/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 like "file" loader except that it embeds assets

// smaller than specified limit in bytes as data URLs to avoid requests.

// A missing `test` is equivalent to a match.

{

test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],

loader: require.resolve('url-loader'),

options: {

limit: 10000,

name: 'static/media/[name].[hash:8].[ext]',

},

},

// Process application JS with Babel.

// The preset includes JSX, Flow, and some ESnext features.

{

test: /\.(js|mjs|jsx)$/,

include: paths.appSrc,

loader: require.resolve('babel-loader'),

options: {

customize: require.resolve(

'babel-preset-react-app/webpack-overrides'

),

plugins: [

[

require.resolve('babel-plugin-named-asset-import'),

{

loaderMap: {

svg: {

ReactComponent: '@svgr/webpack?-prettier,-svgo![path]',

},

},

},

],

],

// 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,

// Don't waste time on Gzipping the cache

cacheCompression: false,

},

},

// Process any JS outside of the app with Babel.

// Unlike the application JS, we only compile the standard ES features.

{

test: /\.(js|mjs)$/,

exclude: /@babel(?:\/|\\{1,2})runtime/,

loader: require.resolve('babel-loader'),

options: {

babelrc: false,

configFile: false,

compact: false,

presets: [

[

require.resolve('babel-preset-react-app/dependencies'),

{ helpers: true },

],

],

cacheDirectory: true,

// Don't waste time on Gzipping the cache

cacheCompression: false,

// If an error happens in a package, it's possible to be

// because it was compiled. Thus, we don't want the browser

// debugger to show the original code. Instead, the code

// being evaluated would be much more helpful.

sourceMaps: false,

},

},

// "postcss" loader applies autoprefixer to our CSS.

// "css" loader resolves paths in CSS and adds assets as dependencies.

// "style" loader turns CSS into JS modules that inject <style> tags.

// In production, we use a plugin to extract that CSS to a file, but

// in development "style" loader enables hot editing of CSS.

// By default we support CSS Modules with the extension .module.css

{

test: cssRegex,

exclude: cssModuleRegex,

use: getStyleLoaders({

importLoaders: 1,

}),

},

// Adds support for CSS Modules (https://github.com/css-modules/css-modules)

// using the extension .module.css

{

test: cssModuleRegex,

use: getStyleLoaders({

importLoaders: 1,

modules: true,

getLocalIdent: getCSSModuleLocalIdent,

}),

},

// Opt-in support for SASS (using .scss or .sass extensions).

// Chains the sass-loader with the css-loader and the style-loader

// to immediately apply all styles to the DOM.

// By default we support SASS Modules with the

// extensions .module.scss or .module.sass

{

test: sassRegex,

exclude: sassModuleRegex,

use: getStyleLoaders({ importLoaders: 2 }, 'sass-loader'),

},

// Adds support for CSS Modules, but using SASS

// using the extension .module.scss or .module.sass

{

test: sassModuleRegex,

use: getStyleLoaders(

{

importLoaders: 2,

modules: true,

getLocalIdent: getCSSModuleLocalIdent,

},

'sass-loader'

),

},

{

test: lessRegex,

exclude: lessModuleRegex,

use: getStyleLoaders({ importLoaders: 2 }, 'less-loader'),

},

// Adds support for CSS Modules, but using SASS

// using the extension .module.scss or .module.sass

{

test: lessModuleRegex,

use: getStyleLoaders(

{

importLoaders: 2,

modules: true,

getLocalIdent: getCSSModuleLocalIdent,

},

'less-loader'

),

},

// "file" loader makes sure those assets get served by WebpackDevServer.

// When you `import` an asset, you get its (virtual) filename.

// In production, they would get copied to the `build` folder.

// This loader doesn't use a "test" so it will catch all modules

// that fall through the other loaders.

{

// Exclude `js` files to keep "css" loader working as it injects

// its runtime that would otherwise be processed through "file" loader.

// Also exclude `html` and `json` extensions so they get processed

// by webpacks internal loaders.

exclude: [/\.(js|mjs|jsx)$/, /\.html$/, /\.json$/],

loader: require.resolve('file-loader'),

options: {

name: 'static/media/[name].[hash:8].[ext]',

},

},

],

},

// ** STOP ** Are you adding a new loader?

// Make sure to add the new loader(s) before the "file" loader.

],

},

plugins: [

// Generates an `index.html` file with the <script> injected.

new HtmlWebpackPlugin({

inject: true,

template: paths.appHtml,

}),

// Makes some environment variables available in index.html.

// The public URL is available as %PUBLIC_URL% in index.html, e.g.:

// <link rel="shortcut icon" href="https://www.pianshen.com/article/188544050/%PUBLIC_URL%/favicon.ico">

// In development, this will be an empty string.

new InterpolateHtmlPlugin(HtmlWebpackPlugin, env.raw),

// This gives some necessary context to module not found errors, such as

// the requesting resource.

new ModuleNotFoundPlugin(paths.appPath),

// Makes some environment variables available to the JS code, for example:

// if (process.env.NODE_ENV === 'development') { ... }. See `./env.js`.

new webpack.DefinePlugin(env.stringified),

// This is necessary to emit hot updates (currently CSS only):

new webpack.HotModuleReplacementPlugin(),

// Watcher doesn't work well if you mistype casing in a path so we use

// a plugin that prints an error when you attempt to do this.

// See https://github.com/facebook/create-react-app/issues/240

new CaseSensitivePathsPlugin(),

// If you require a missing module and then `npm install` it, you still have

// to restart the development server for Webpack to discover it. This plugin

// makes the discovery automatic so you don't have to restart.

// See https://github.com/facebook/create-react-app/issues/186

new WatchMissingNodeModulesPlugin(paths.appNodeModules),

// Moment.js is an extremely popular library that bundles large locale files

// by default due to how Webpack interprets its code. This is a practical

// solution that requires the user to opt into importing specific locales.

// https://github.com/jmblog/how-to-optimize-momentjs-with-webpack

// You can remove this if you don't use Moment.js:

new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),

// Generate a manifest file which contains a mapping of all asset filenames

// to their corresponding output file so that tools can pick it up without

// having to parse `index.html`.

new ManifestPlugin({

fileName: 'asset-manifest.json',

publicPath: publicPath,

}),

],

// 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',

},

// Turn off performance processing because we utilize

// our own hints via the FileSizeReporter

performance: false,

};

React学习之旅----按需加载Antd UI组件及自定义主题

webpack.config.prod.js中98-114

  if (preProcessor) {

let loader = {

loader: require.resolve(preProcessor),

options: {

sourceMap: shouldUseSourceMap,

},

}

if (preProcessor === "less-loader") {

loader.options.modifyVars = {

'primary-color': '#000000',

'link-color': '#1DA57A',

'border-radius-base': '2px',

}

loader.options.javascriptEnabled = true

}

loaders.push(loader);

}

'use strict';

const path = require('path');

const webpack = require('webpack');

const PnpWebpackPlugin = require('pnp-webpack-plugin');

const HtmlWebpackPlugin = require('html-webpack-plugin');

const InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin');

const TerserPlugin = require('terser-webpack-plugin');

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');

const safePostCssParser = require('postcss-safe-parser');

const ManifestPlugin = require('webpack-manifest-plugin');

const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');

const WorkboxWebpackPlugin = require('workbox-webpack-plugin');

const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');

const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent');

const paths = require('./paths');

const getClientEnvironment = require('./env');

const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin');

// Webpack uses `publicPath` to determine where the app is being served from.

// It requires a trailing slash, or the file assets will get an incorrect path.

const publicPath = paths.servedPath;

// Some apps do not use client-side routing with pushState.

// For these, "homepage" can be set to "." to enable relative asset paths.

const shouldUseRelativeAssetPaths = publicPath === './';

// Source maps are resource heavy and can cause out of memory issue for large source files.

const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false';

// Some apps do not need the benefits of saving a web request, so not inlining the chunk

// makes for a smoother build process.

const shouldInlineRuntimeChunk = process.env.INLINE_RUNTIME_CHUNK !== 'false';

// `publicUrl` is just like `publicPath`, but we will provide it to our app

// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.

// Omit trailing slash as %PUBLIC_URL%/xyz looks better than %PUBLIC_URL%xyz.

const publicUrl = publicPath.slice(0, -1);

// Get environment variables to inject into our app.

const env = getClientEnvironment(publicUrl);

// Assert this just to be safe.

// Development builds of React are slow and not intended for production.

if (env.stringified['process.env'].NODE_ENV !== '"production"') {

throw new Error('Production builds must have NODE_ENV=production.');

}

// style files regexes

const cssRegex = /\.css$/;

const cssModuleRegex = /\.module\.css$/;

const lessRegex = /\.less$/;

const lessModuleRegex = /\.module\.less$/;

const sassRegex = /\.(scss|sass)$/;

const sassModuleRegex = /\.module\.(scss|sass)$/;

// common function to get style loaders

const getStyleLoaders = (cssOptions, preProcessor) => {

const loaders = [

{

loader: MiniCssExtractPlugin.loader,

options: Object.assign(

{},

shouldUseRelativeAssetPaths ? { publicPath: '../../' } : undefined

),

},

{

loader: require.resolve('css-loader'),

options: cssOptions,

},

{

// Options for PostCSS as we reference these options twice

// Adds vendor prefixing based on your specified browser support in

// package.json

loader: require.resolve('postcss-loader'),

options: {

// Necessary for external CSS imports to work

// https://github.com/facebook/create-react-app/issues/2677

ident: 'postcss',

plugins: () => [

require('postcss-flexbugs-fixes'),

require('postcss-preset-env')({

autoprefixer: {

flexbox: 'no-2009',

},

stage: 3,

}),

],

sourceMap: shouldUseSourceMap,

},

},

];

// if (preProcessor) {

// loaders.push({

// loader: require.resolve(preProcessor),

// options: {

// sourceMap: shouldUseSourceMap,

// },

// });

// }

if (preProcessor) {

let loader = {

loader: require.resolve(preProcessor),

options: {

sourceMap: shouldUseSourceMap,

},

}

if (preProcessor === "less-loader") {

loader.options.modifyVars = {

'primary-color': '#000000',

'link-color': '#1DA57A',

'border-radius-base': '2px',

}

loader.options.javascriptEnabled = true

}

loaders.push(loader);

}

return loaders;

};

// This is the production configuration.

// It compiles slowly and is focused on producing a fast and minimal bundle.

// The development configuration is different and lives in a separate file.

module.exports = {

mode: 'production',

// Don't attempt to continue if there are any errors.

bail: true,

// We generate sourcemaps in production. This is slow but gives good results.

// You can exclude the *.map files from the build during deployment.

devtool: shouldUseSourceMap ? 'source-map' : false,

// In production, we only want to load the app code.

entry: [paths.appIndexJs],

output: {

// The build folder.

path: paths.appBuild,

// Generated JS file names (with nested folders).

// There will be one main bundle, and one file per asynchronous chunk.

// We don't currently advertise code splitting but Webpack supports it.

filename: 'static/js/[name].[chunkhash:8].js',

chunkFilename: 'static/js/[name].[chunkhash:8].chunk.js',

// We inferred the "public path" (such as / or /my-project) from homepage.

publicPath: publicPath,

// Point sourcemap entries to original disk location (format as URL on Windows)

devtoolModuleFilenameTemplate: info =>

path

.relative(paths.appSrc, info.absoluteResourcePath)

.replace(/\\/g, '/'),

},

optimization: {

minimizer: [

new TerserPlugin({

terserOptions: {

parse: {

// we want terser to parse ecma 8 code. However, we don't want it

// to apply any minfication steps that turns valid ecma 5 code

// into invalid ecma 5 code. This is why the 'compress' and 'output'

// sections only apply transformations that are ecma 5 safe

// https://github.com/facebook/create-react-app/pull/4234

ecma: 8,

},

compress: {

ecma: 5,

warnings: false,

// Disabled because of an issue with Uglify breaking seemingly valid code:

// https://github.com/facebook/create-react-app/issues/2376

// Pending further investigation:

// https://github.com/mishoo/UglifyJS2/issues/2011

comparisons: false,

// Disabled because of an issue with Terser breaking valid code:

// https://github.com/facebook/create-react-app/issues/5250

// Pending futher investigation:

// https://github.com/terser-js/terser/issues/120

inline: 2,

},

mangle: {

safari10: true,

},

output: {

ecma: 5,

comments: false,

// Turned on because emoji and regex is not minified properly using default

// https://github.com/facebook/create-react-app/issues/2488

ascii_only: true,

},

},

// Use multi-process parallel running to improve the build speed

// Default number of concurrent runs: os.cpus().length - 1

parallel: true,

// Enable file caching

cache: true,

sourceMap: shouldUseSourceMap,

}),

new OptimizeCSSAssetsPlugin({

cssProcessorOptions: {

parser: safePostCssParser,

map: shouldUseSourceMap

? {

// `inline: false` forces the sourcemap to be output into a

// separate file

inline: false,

// `annotation: true` appends the sourceMappingURL to the end of

// the css file, helping the browser find the sourcemap

annotation: true,

}

: false,

},

}),

],

// Automatically split vendor and commons

// https://twitter.com/wSokra/status/969633336732905474

// https://medium.com/webpack/webpack-4-code-splitting-chunk-graph-and-the-splitchunks-optimization-be739a861366

splitChunks: {

chunks: 'all',

name: false,

},

// Keep the runtime chunk seperated to enable long term caching

// https://twitter.com/wSokra/status/969679223278505985

runtimeChunk: true,

},

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/facebook/create-react-app/issues/253

modules: ['node_modules'].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/facebook/create-react-app/issues/290

// `web` extension prefixes have been added for better support

// for React Native Web.

extensions: ['.mjs', '.web.js', '.js', '.json', '.web.jsx', '.jsx'],

alias: {

// 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: [

// Adds support for installing with Plug'n'Play, leading to faster installs and adding

// guards against forgotten dependencies and such.

PnpWebpackPlugin,

// 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]),

],

},

resolveLoader: {

plugins: [

// Also related to Plug'n'Play, but this time it tells Webpack to load its loaders

// from the current package.

PnpWebpackPlugin.moduleLoader(module),

],

},

module: {

strictExportPresence: true,

rules: [

// Disable require.ensure as it's not a standard language feature.

{ parser: { requireEnsure: false } },

// First, run the linter.

// It's important to do this before Babel processes the JS.

{

test: /\.(js|mjs|jsx)$/,

enforce: 'pre',

use: [

{

options: {

formatter: require.resolve('react-dev-utils/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 application JS with Babel.

// The preset includes JSX, Flow, and some ESnext features.

{

test: /\.(js|mjs|jsx)$/,

include: paths.appSrc,

loader: require.resolve('babel-loader'),

options: {

customize: require.resolve(

'babel-preset-react-app/webpack-overrides'

),

plugins: [

[

require.resolve('babel-plugin-named-asset-import'),

{

loaderMap: {

svg: {

ReactComponent: '@svgr/webpack?-prettier,-svgo![path]',

},

},

},

],

],

cacheDirectory: true,

// Save disk space when time isn't as important

cacheCompression: true,

compact: true,

},

},

// Process any JS outside of the app with Babel.

// Unlike the application JS, we only compile the standard ES features.

{

test: /\.(js|mjs)$/,

exclude: /@babel(?:\/|\\{1,2})runtime/,

loader: require.resolve('babel-loader'),

options: {

babelrc: false,

configFile: false,

compact: false,

presets: [

[

require.resolve('babel-preset-react-app/dependencies'),

{ helpers: true },

],

],

cacheDirectory: true,

// Save disk space when time isn't as important

cacheCompression: true,

// If an error happens in a package, it's possible to be

// because it was compiled. Thus, we don't want the browser

// debugger to show the original code. Instead, the code

// being evaluated would be much more helpful.

sourceMaps: false,

},

},

// "postcss" loader applies autoprefixer to our CSS.

// "css" loader resolves paths in CSS and adds assets as dependencies.

// `MiniCSSExtractPlugin` extracts styles into CSS

// files. If you use code splitting, async bundles will have their own separate CSS chunk file.

// By default we support CSS Modules with the extension .module.css

{

test: cssRegex,

exclude: cssModuleRegex,

loader: getStyleLoaders({

importLoaders: 1,

sourceMap: shouldUseSourceMap,

}),

// Don't consider CSS imports dead code even if the

// containing package claims to have no side effects.

// Remove this when webpack adds a warning or an error for this.

// See https://github.com/webpack/webpack/issues/6571

sideEffects: true,

},

// Adds support for CSS Modules (https://github.com/css-modules/css-modules)

// using the extension .module.css

{

test: cssModuleRegex,

loader: getStyleLoaders({

importLoaders: 1,

sourceMap: shouldUseSourceMap,

modules: true,

getLocalIdent: getCSSModuleLocalIdent,

}),

},

// Opt-in support for SASS. The logic here is somewhat similar

// as in the CSS routine, except that "sass-loader" runs first

// to compile SASS files into CSS.

// By default we support SASS Modules with the

// extensions .module.scss or .module.sass

{

test: sassRegex,

exclude: sassModuleRegex,

loader: getStyleLoaders(

{

importLoaders: 2,

sourceMap: shouldUseSourceMap,

},

'sass-loader'

),

// Don't consider CSS imports dead code even if the

// containing package claims to have no side effects.

// Remove this when webpack adds a warning or an error for this.

// See https://github.com/webpack/webpack/issues/6571

sideEffects: true,

},

{

test: lessRegex,

exclude: lessModuleRegex,

loader: getStyleLoaders(

{

importLoaders: 2,

sourceMap: shouldUseSourceMap,

},

'less-loader'

),

// Don't consider CSS imports dead code even if the

// containing package claims to have no side effects.

// Remove this when webpack adds a warning or an error for this.

// See https://github.com/webpack/webpack/issues/6571

sideEffects: true,

},

// Adds support for CSS Modules, but using SASS

// using the extension .module.scss or .module.sass

{

test: sassModuleRegex,

loader: getStyleLoaders(

{

importLoaders: 2,

sourceMap: shouldUseSourceMap,

modules: true,

getLocalIdent: getCSSModuleLocalIdent,

},

'sass-loader'

),

},

{

test: lessModuleRegex,

loader: getStyleLoaders(

{

importLoaders: 2,

sourceMap: shouldUseSourceMap,

modules: true,

getLocalIdent: getCSSModuleLocalIdent,

},

'less-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 be processed through "file" loader.

// Also exclude `html` and `json` extensions so they get processed

// by webpacks internal loaders.

exclude: [/\.(js|mjs|jsx)$/, /\.html$/, /\.json$/],

options: {

name: 'static/media/[name].[hash:8].[ext]',

},

},

// ** STOP ** Are you adding a new loader?

// Make sure to add the new loader(s) before the "file" loader.

],

},

],

},

plugins: [

// Generates an `index.html` file with the <script> injected.

new HtmlWebpackPlugin({

inject: true,

template: paths.appHtml,

minify: {

removeComments: true,

collapseWhitespace: true,

removeRedundantAttributes: true,

useShortDoctype: true,

removeEmptyAttributes: true,

removeStyleLinkTypeAttributes: true,

keepClosingSlash: true,

minifyJS: true,

minifyCSS: true,

minifyURLs: true,

},

}),

// Inlines the webpack runtime script. This script is too small to warrant

// a network request.

shouldInlineRuntimeChunk && new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/runtime~.+[.]js/]),

// Makes some environment variables available in index.html.

// The public URL is available as %PUBLIC_URL% in index.html, e.g.:

// <link rel="shortcut icon" href="https://www.pianshen.com/article/188544050/%PUBLIC_URL%/favicon.ico">

// 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.

new InterpolateHtmlPlugin(HtmlWebpackPlugin, env.raw),

// This gives some necessary context to module not found errors, such as

// the requesting resource.

new ModuleNotFoundPlugin(paths.appPath),

// Makes some environment variables available to the JS code, for example:

// if (process.env.NODE_ENV === 'production') { ... }. See `./env.js`.

// It is absolutely essential that NODE_ENV was set to production here.

// Otherwise React will be compiled in the very slow development mode.

new webpack.DefinePlugin(env.stringified),

new MiniCssExtractPlugin({

// Options similar to the same options in webpackOptions.output

// both options are optional

filename: 'static/css/[name].[contenthash:8].css',

chunkFilename: 'static/css/[name].[contenthash:8].chunk.css',

}),

// Generate a manifest file which contains a mapping of all asset filenames

// to their corresponding output file so that tools can pick it up without

// having to parse `index.html`.

new ManifestPlugin({

fileName: 'asset-manifest.json',

publicPath: publicPath,

}),

// Moment.js is an extremely popular library that bundles large locale files

// by default due to how Webpack interprets its code. This is a practical

// solution that requires the user to opt into importing specific locales.

// https://github.com/jmblog/how-to-optimize-momentjs-with-webpack

// You can remove this if you don't use Moment.js:

new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),

// Generate a service worker script that will precache, and keep up to date,

// the HTML & assets that are part of the Webpack build.

new WorkboxWebpackPlugin.GenerateSW({

clientsClaim: true,

exclude: [/\.map$/, /asset-manifest\.json$/],

importWorkboxFrom: 'cdn',

navigateFallback: publicUrl + '/index.html',

navigateFallbackBlacklist: [

// Exclude URLs starting with /_, as they're likely an API call

new RegExp('^/_'),

// Exclude URLs containing a dot, as they're likely a resource in

// public/ and not a SPA route

new RegExp('/[^/]+\\.[^/]+$'),

],

}),

].filter(Boolean),

// 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',

},

// Turn off performance processing because we utilize

// our own hints via the FileSizeReporter

performance: false,

};

React学习之旅----按需加载Antd UI组件及自定义主题

 

以上是 React学习之旅----按需加载Antd UI组件及自定义主题 的全部内容, 来源链接: utcz.com/a/68812.html

回到顶部