ant-design-pro config
config
// ref: https://umijs.org/config/import os from 'os';import pageRoutes from './router.config';import defaultSettings from '../src/defaultSettings';import slash from 'slash2';const { pwa, primaryColor } = defaultSettings;const { APP_TYPE, TEST } = process.env;const plugins = [ [ 'umi-plugin-react', { antd: true, dva: { hmr: true, }, locale: { enable: true, // default false default: 'zh-CN', // default zh-CN baseNavigator: true, // default true, when it is true, will use `navigator.language` overwrite default }, dynamicImport: { loadingComponent: './components/PageLoading/index', webpackChunkName: true, level: 3, }, pwa: pwa ? { workboxPluginMode: 'InjectManifest', workboxOptions: { importWorkboxFrom: 'local', }, } : false, ...(!TEST && os.platform() === 'darwin' ? { dll: { include: ['dva', 'dva/router', 'dva/saga', 'dva/fetch'], exclude: ['@babel/runtime', 'netlify-lambda'], }, hardSource: false, } : {}), }, ],];// 针对 preview.pro.ant.design 的 GA 统计代码// 业务上不需要这个if (APP_TYPE === 'site') { plugins.push([ 'umi-plugin-ga', { code: 'UA-72788897-6', }, ]);}export default { plugins: [ [ 'umi-plugin-react', { antd: true, dva: { hmr: true, }, targets: { ie: 11, }, locale: { enable: true, // default false default: 'zh-CN', // default zh-CN baseNavigator: true, // default true, when it is true, will use `navigator.language` overwrite default }, dynamicImport: { loadingComponent: './components/PageLoading/index', }, }, ], [ 'umi-plugin-pro-block', { moveMock: false, moveService: false, modifyRequest: true, autoAddMenu: true, }, ], ], define: { APP_TYPE: process.env.APP_TYPE || '', }, targets: { ie: 11, }, /** * 路由相关配置 */ routes: pageRoutes, /** * webpack 相关配置 */ // Theme for antd // https://ant.design/docs/react/customize-theme-cn theme: { 'primary-color': primaryColor, }, externals: { '@antv/data-set': 'DataSet', }, ignoreMomentLocale: true, lessLoaderOptions: { javascriptEnabled: true, }, disableRedirectHoist: true, cssLoaderOptions: { modules: true, getLocalIdent: (context, localIdentName, localName) => { if ( context.resourcePath.includes('node_modules') || context.resourcePath.includes('ant.design.pro.less') || context.resourcePath.includes('global.less') ) { return localName; } const match = context.resourcePath.match(/src(.*)/); if (match && match[1]) { const antdProPath = match[1].replace('.less', ''); const arr = slash(antdProPath) .split('/') .map(a => a.replace(/([A-Z])/g, '-$1')) .map(a => a.toLowerCase()); return `antd-pro${arr.join('-')}-${localName}`.replace(/--/g, '-'); } return localName; }, }, manifest: { basePath: '/', },};
plugin.config
// Change theme pluginimport MergeLessPlugin from 'antd-pro-merge-less';import AntDesignThemePlugin from 'antd-theme-webpack-plugin';import path from 'path';function getModulePackageName(module) { if (!module.context) return null; const nodeModulesPath = path.join(__dirname, '../node_modules/'); if (module.context.substring(0, nodeModulesPath.length) !== nodeModulesPath) { return null; } const moduleRelativePath = module.context.substring(nodeModulesPath.length); const [moduleDirName] = moduleRelativePath.split(path.sep); let packageName = moduleDirName; // handle tree shaking if (packageName.match('^_')) { // eslint-disable-next-line prefer-destructuring packageName = packageName.match(/^_(@?[^@]+)/)[1]; } return packageName;}export default config => { // pro 和 开发环境再添加这个插件 if (process.env.APP_TYPE === 'site' || process.env.NODE_ENV !== 'production') { // 将所有 less 合并为一个供 themePlugin使用 const outFile = path.join(__dirname, '../.temp/ant-design-pro.less'); const stylesDir = path.join(__dirname, '../src/'); config.plugin('merge-less').use(MergeLessPlugin, [ { stylesDir, outFile, }, ]); config.plugin('ant-design-theme').use(AntDesignThemePlugin, [ { antDir: path.join(__dirname, '../node_modules/antd'), stylesDir, varFile: path.join(__dirname, '../node_modules/antd/lib/style/themes/default.less'), mainLessFile: outFile, // themeVariables: ['@primary-color'], indexFileName: 'index.html', generateOne: true, lessUrl: 'https://gw.alipayobjects.com/os/lib/less.js/3.8.1/less.min.js', }, ]); } // optimize chunks config.optimization .runtimeChunk(false) // share the same chunks across different modules .splitChunks({ chunks: 'async', name: 'vendors', maxInitialRequests: Infinity, minSize: 0, cacheGroups: { vendors: { test: module => { const packageName = getModulePackageName(module); if (packageName) { return ['bizcharts', '@antv_data-set'].indexOf(packageName) >= 0; } return false; }, name(module) { const packageName = getModulePackageName(module); if (['bizcharts', '@antv_data-set'].indexOf(packageName) >= 0) { return 'viz'; // visualization package } return 'misc'; }, }, }, });};
router.config
export default [ //user { path: '/user', component: '../layouts/UserLayout', routes: [ { path: '/user', redirect: '/user/login' }, { path: '/user/login', name: 'login', component: './User/Login' }, { path: '/user/register', name: 'register', component: './User/Register' }, { path: '/user/register-result', name: 'register.result', component: './User/RegisterResult', }, { component: '404', }, ], }, //app { path: '/', component: '../layouts/BasicLayout', Routes: ['src/pages/Authorized'], routes: [ //dashboard { path: '/', redirect: '/dashboard/analysis', authority: ['admin', 'user'] }, { path: '/dashboard', name: 'dashboard', icon: 'dashboard', routes: [ { path: '/dashboard/analysis', name: 'analysis', component: './Dashboard/Analysis', }, ], }, ], },]
pro-umi-config
config
// ref: https://umijs.org/config/import os from 'os';import pageRoutes from './router.config';import defaultSettings from '../src/defaultSettings';const { pwa, primaryColor } = defaultSettings;const { APP_TYPE, TEST } = process.env;const plugins = [ [ 'umi-plugin-react', { antd: true, dva: { hmr: true, }, locale: { enable: true, // default false default: 'zh-CN', // default zh-CN baseNavigator: true, // default true, when it is true, will use `navigator.language` overwrite default }, dynamicImport: { loadingComponent: './components/PageLoading/index', webpackChunkName: true, level: 3, }, pwa: pwa ? { workboxPluginMode: 'InjectManifest', workboxOptions: { importWorkboxFrom: 'local', }, } : false, ...(!TEST && os.platform() === 'darwin' ? { dll: { include: ['dva', 'dva/router', 'dva/saga', 'dva/fetch'], exclude: ['@babel/runtime', 'netlify-lambda'], }, hardSource: false, } : {}), }, ],];// 针对 preview.pro.ant.design 的 GA 统计代码// 业务上不需要这个if (APP_TYPE === 'site') { plugins.push([ 'umi-plugin-ga', { code: 'UA-72788897-6', }, ]);}export default { plugins: [ [ 'umi-plugin-react', { antd: true, dva: { hmr: true, }, targets: { ie: 11, }, locale: { enable: true, // default false default: 'zh-CN', // default zh-CN baseNavigator: true, // default true, when it is true, will use `navigator.language` overwrite default }, dynamicImport: { loadingComponent: './components/PageLoading/index', }, }, ], [ 'umi-plugin-pro-block', { moveMock: false, moveService: false, modifyRequest: true, autoAddMenu: true, }, ], ], /** * webpack 相关配置 */ define: { APP_TYPE: process.env.APP_TYPE || '', }, treeShaking: true, targets: { ie: 11, }, // Theme for antd // https://ant.design/docs/react/customize-theme-cn //路由相关配置 routes: pageRoutes, disableRedirectHoist: true, theme: { 'primary-color': primaryColor, }, externals: { '@antv/data-set': 'DataSet', }, ignoreMomentLocale: true, lessLoaderOptions: { javascriptEnabled: true, },};
pages/umi/routes
import React from 'react';import { Router as DefaultRouter, Route, Switch } from 'react-router-dom';import dynamic from 'umi/dynamic';import renderRoutes from 'umi/lib/renderRoutes';import history from '@tmp/history';import RendererWrapper0 from '/Users/a1/github/prointeraction/pop3/src/pages/.umi/LocaleWrapper.jsx';import _dvaDynamic from 'dva/dynamic';let Router = require('dva/router').routerRedux.ConnectedRouter;let routes = [ { path: '/user', component: __IS_BROWSER ? _dvaDynamic({ component: () => import('../../layouts/UserLayout'), LoadingComponent: require('/Users/a1/github/prointeraction/pop3/src/components/PageLoading/index') .default, }) : require('../../layouts/UserLayout').default, routes: [ { path: '/user', redirect: '/user/login', exact: true, }, { path: '/user/login', name: 'login', component: __IS_BROWSER ? _dvaDynamic({ component: () => import('../User/Login'), LoadingComponent: require('/Users/a1/github/prointeraction/pop3/src/components/PageLoading/index') .default, }) : require('../User/Login').default, exact: true, }, { path: '/user/register', name: 'register', component: __IS_BROWSER ? _dvaDynamic({ component: () => import('../User/Register'), LoadingComponent: require('/Users/a1/github/prointeraction/pop3/src/components/PageLoading/index') .default, }) : require('../User/Register').default, exact: true, }, { path: '/user/register-result', name: 'register.result', component: __IS_BROWSER ? _dvaDynamic({ component: () => import('../User/RegisterResult'), LoadingComponent: require('/Users/a1/github/prointeraction/pop3/src/components/PageLoading/index') .default, }) : require('../User/RegisterResult').default, exact: true, }, { component: __IS_BROWSER ? _dvaDynamic({ component: () => import('../404'), LoadingComponent: require('/Users/a1/github/prointeraction/pop3/src/components/PageLoading/index') .default, }) : require('../404').default, exact: true, }, { component: () => React.createElement( require('/Users/a1/github/prointeraction/pop3/node_modules/umi-build-dev/lib/plugins/404/NotFound.js') .default, { pagesPath: 'src/pages', hasRoutesInConfig: true }, ), }, ], }, { path: '/', component: __IS_BROWSER ? _dvaDynamic({ component: () => import('../../layouts/BasicLayout'), LoadingComponent: require('/Users/a1/github/prointeraction/pop3/src/components/PageLoading/index') .default, }) : require('../../layouts/BasicLayout').default, Routes: [require('../Authorized').default], routes: [ { path: '/', redirect: '/dashboard/analysis', authority: ['admin', 'user'], exact: true, }, { path: '/dashboard', name: 'dashboard', icon: 'dashboard', routes: [ { path: '/dashboard/analysis', name: 'analysis', component: __IS_BROWSER ? _dvaDynamic({ component: () => import('../Dashboard/Analysis'), LoadingComponent: require('/Users/a1/github/prointeraction/pop3/src/components/PageLoading/index') .default, }) : require('../Dashboard/Analysis').default, exact: true, }, { component: () => React.createElement( require('/Users/a1/github/prointeraction/pop3/node_modules/umi-build-dev/lib/plugins/404/NotFound.js') .default, { pagesPath: 'src/pages', hasRoutesInConfig: true }, ), }, ], }, { component: () => React.createElement( require('/Users/a1/github/prointeraction/pop3/node_modules/umi-build-dev/lib/plugins/404/NotFound.js') .default, { pagesPath: 'src/pages', hasRoutesInConfig: true }, ), }, ], }, { component: () => React.createElement( require('/Users/a1/github/prointeraction/pop3/node_modules/umi-build-dev/lib/plugins/404/NotFound.js') .default, { pagesPath: 'src/pages', hasRoutesInConfig: true }, ), },];window.g_routes = routes;const plugins = require('umi/_runtimePlugin');plugins.applyForEach('patchRoutes', { initialValue: routes });export { routes };export default class RouterWrapper extends React.Component { unListen = () => {}; constructor(props) { super(props); // route change handler function routeChangeHandler(location, action) { plugins.applyForEach('onRouteChange', { initialValue: { routes, location, action, }, }); } this.unListen = history.listen(routeChangeHandler); routeChangeHandler(history.location); } componentWillUnmount() { this.unListen(); } render() { const props = this.props || {}; return ( <RendererWrapper0> <Router history={history}>{renderRoutes(routes, props)}</Router> </RendererWrapper0> ); }}