Showing
7 changed files
with
203 additions
and
212 deletions
Too many changes to show.
To preserve performance only 7 of 9 files are displayed.
| 1 | 1 | #!/usr/bin/env node |
| 2 | - | |
| 3 | -const path = require('path'); | |
| 4 | -const fs = require('fs'); | |
| 5 | 2 | const execSync = require('child_process').execSync; |
| 6 | 3 | const chalk = require('chalk'); |
| 7 | -const getConfigContent = require('../config/defaultConfig.js'); | |
| 8 | 4 | |
| 9 | -const umircCwdFilePath = path.resolve(process.cwd(), '.umirc.js'); | |
| 5 | +const defaultEnv = ['dev', 'prod'] | |
| 6 | +const env = process.argv.slice(2).join(' ') || 'prod' | |
| 7 | + | |
| 8 | +if (!defaultEnv.includes(env)) { | |
| 9 | + console.log(chalk.red('\n 命令不存在')); | |
| 10 | + process.exit(1); | |
| 11 | +} | |
| 10 | 12 | |
| 11 | -async function writeFile() { | |
| 12 | - const content = await getConfigContent(); | |
| 13 | - fs.writeFile(umircCwdFilePath, content, (err) => { | |
| 14 | - if (err) { | |
| 15 | - console.log(chalk.red(`文件写入失败, ${err}`)); | |
| 16 | - process.exit(1); | |
| 17 | - } else { | |
| 18 | - execSync(`npx cross-env ${process.argv.slice(2).join(' ')} umi build`, { stdio: 'inherit' }); | |
| 19 | - fs.unlinkSync(umircCwdFilePath); | |
| 20 | - } | |
| 21 | - }); | |
| 13 | +if (env === 'prod') { | |
| 14 | + execSync(`npx cross-env NODE_ENV=production webpack build --config ./config/webpack.prod.js`, { stdio: 'inherit' }); | |
| 22 | 15 | } |
| 23 | 16 | |
| 24 | -writeFile(); | |
| 17 | +if (env === 'dev') { | |
| 18 | + execSync(`npx cross-env NODE_ENV=development webpack build --config ./config/webpack.dev.js`, { stdio: 'inherit' }); | |
| 19 | +} | ... | ... |
| 1 | 1 | #!/usr/bin/env node |
| 2 | 2 | |
| 3 | -const path = require('path'); | |
| 4 | -const fs = require('fs'); | |
| 5 | 3 | const execSync = require('child_process').execSync; |
| 6 | -const chalk = require('chalk'); | |
| 7 | -const getConfigContent = require('../config/defaultConfig.js'); | |
| 8 | -const { findUsablePort } = require('../utils'); | |
| 9 | 4 | |
| 10 | -const umircCwdFilePath = path.resolve(process.cwd(), '.umirc.js'); | |
| 11 | - | |
| 12 | -async function writeFile() { | |
| 13 | - const port = await findUsablePort(process.env.PORT || 8000); | |
| 14 | - const content = getConfigContent(port); | |
| 15 | - | |
| 16 | - fs.writeFile(umircCwdFilePath, content, (err) => { | |
| 17 | - if (err) { | |
| 18 | - console.log(chalk.red(`文件写入失败, ${err}`)); | |
| 19 | - process.exit(1); | |
| 20 | - } else { | |
| 21 | - execSync( | |
| 22 | - `npx cross-env ${process.argv | |
| 23 | - .slice(2) | |
| 24 | - .join(' ')} SOCKET_SERVER=http://localhost:${port} umi dev`, | |
| 25 | - { stdio: 'inherit' }, | |
| 26 | - ); | |
| 27 | - fs.unlinkSync(umircCwdFilePath); | |
| 28 | - } | |
| 29 | - }); | |
| 30 | -} | |
| 31 | - | |
| 32 | -writeFile(); | |
| 5 | +execSync(`npx cross-env NODE_ENV=development vite --force --config ./config/vite.config.js`, { stdio: 'inherit' }); | ... | ... |
config/defaultConfig.js
deleted
100644 → 0
| 1 | -const getConfigContent = (port) => { | |
| 2 | - return ` | |
| 3 | - import { defineConfig } from 'umi'; | |
| 4 | - import path from 'path'; | |
| 5 | - import fs from 'fs'; | |
| 6 | - import MiniCssExtractPlugin from 'mini-css-extract-plugin' | |
| 7 | - import routes from './src/routes' | |
| 8 | - import pkg from './package.json' | |
| 9 | - let userConfig = {}; | |
| 10 | - let terserOptions = {}; | |
| 11 | - let publicPath = '/' + pkg.name + '/' | |
| 12 | - | |
| 13 | - if (fs.existsSync(path.resolve(process.cwd(), '.qx.config.js'))) { | |
| 14 | - userConfig = require(path.resolve(process.cwd(), '.qx.config.js')) | |
| 15 | - } | |
| 16 | - | |
| 17 | - if (process.env.NODE_ENV === 'development') { | |
| 18 | - publicPath = '//localhost:' + ${port} + '/' | |
| 19 | - } | |
| 20 | - | |
| 21 | - if (process.env.UMI_APP_ENV === 'prod') { | |
| 22 | - terserOptions = { | |
| 23 | - compress: { | |
| 24 | - pure_funcs: ['console.log', 'debugger'], | |
| 25 | - }, | |
| 26 | - }; | |
| 27 | - } else { | |
| 28 | - terserOptions = { | |
| 29 | - compress: { | |
| 30 | - drop_debugger: true, | |
| 31 | - }, | |
| 32 | - }; | |
| 33 | - } | |
| 34 | - | |
| 35 | - export default defineConfig({ | |
| 36 | - esbuild: {}, | |
| 37 | - devServer: { | |
| 38 | - port: ${port}, | |
| 39 | - 'Access-Control-Allow-Origin': true | |
| 40 | - }, | |
| 41 | - runtimePublicPath: true, | |
| 42 | - publicPath, | |
| 43 | - mountElementId: pkg.name, | |
| 44 | - webpack5: { | |
| 45 | - lazyCompilation: {}, | |
| 46 | - }, | |
| 47 | - nodeModulesTransform: { | |
| 48 | - type: 'none', | |
| 49 | - }, | |
| 50 | - history: { | |
| 51 | - type: 'hash', | |
| 52 | - }, | |
| 53 | - alias: { | |
| 54 | - '@/src': 'src', | |
| 55 | - }, | |
| 56 | - hash: true, | |
| 57 | - title: false, | |
| 58 | - lessLoader: { | |
| 59 | - globalVars: { | |
| 60 | - theme: 'true;@import "~@/variable.less"', | |
| 61 | - }, | |
| 62 | - }, | |
| 63 | - antd: { | |
| 64 | - config: {}, | |
| 65 | - }, | |
| 66 | - fastRefresh: {}, | |
| 67 | - qiankun: { | |
| 68 | - slave: {}, | |
| 69 | - }, | |
| 70 | - dynamicImport: { | |
| 71 | - loading: '@/components/qx-page-loading', | |
| 72 | - }, | |
| 73 | - routes, | |
| 74 | - terserOptions, | |
| 75 | - chainWebpack: function (memo, { env, webpack, createCSSRule }) { | |
| 76 | - memo.resolve.alias.set('@', path.resolve(__dirname, './src')); | |
| 77 | - memo.resolve.alias.set('@@', path.resolve(__dirname, './src/.umi')); | |
| 78 | - memo.optimization.delete('noEmitOnErrors'); | |
| 79 | - memo.plugins.delete('optimize-css'); | |
| 80 | - // if (env === 'production') { | |
| 81 | - memo.merge({ | |
| 82 | - plugins: env === 'production'? [new MiniCssExtractPlugin()] : [], | |
| 83 | - optimization: { | |
| 84 | - emitOnErrors: true, | |
| 85 | - splitChunks: { | |
| 86 | - chunks: 'async', | |
| 87 | - minSize: 30000, | |
| 88 | - minChunks: 3, | |
| 89 | - automaticNameDelimiter: '.', | |
| 90 | - cacheGroups: { | |
| 91 | - antdesigns: { | |
| 92 | - name: 'antdesigns', | |
| 93 | - chunks: 'all', | |
| 94 | - test: /(@antd|antd|@ant-design)/, | |
| 95 | - priority: 10 | |
| 96 | - }, | |
| 97 | - x6: { | |
| 98 | - name: 'x6', | |
| 99 | - chunks: 'all', | |
| 100 | - test: /(@antv\\/x6|@antv\\/x6-react-components|@antv\\/x6-react-shape)/, | |
| 101 | - priority: 20, | |
| 102 | - }, | |
| 103 | - qxwidgets: { | |
| 104 | - name: 'qxwidgets', | |
| 105 | - chunks: 'all', | |
| 106 | - test: /\\/src\\/packages\\/qx-form-generator/, | |
| 107 | - priority: 10, | |
| 108 | - }, | |
| 109 | - formrender: { | |
| 110 | - name: 'formrender', | |
| 111 | - chunks: 'all', | |
| 112 | - test: /@qx\\/form-render/, | |
| 113 | - priority: 10, | |
| 114 | - }, | |
| 115 | - qx: { | |
| 116 | - name: 'qx', | |
| 117 | - chunks: 'all', | |
| 118 | - test: /(@qx\\/view-render|@qx\\/form-design|@qx\\/hooks|@qx\\/utils|@qx\\/icon-btn)/, | |
| 119 | - priority: 20, | |
| 120 | - }, | |
| 121 | - echarts: { | |
| 122 | - name: 'echarts', | |
| 123 | - chunks: 'all', | |
| 124 | - test: /(echarts|echarts-for-react)/, | |
| 125 | - priority: 20, | |
| 126 | - }, | |
| 127 | - // styles: { | |
| 128 | - // name: "styles", | |
| 129 | - // type: "css/mini-extract", | |
| 130 | - // chunks: "all", | |
| 131 | - // enforce: true, | |
| 132 | - // }, | |
| 133 | - vendors: { | |
| 134 | - name: 'vendors', | |
| 135 | - chunks: 'all', | |
| 136 | - test: /[\\/]node_modules[\\/]/, | |
| 137 | - priority: 10, | |
| 138 | - }, | |
| 139 | - }, | |
| 140 | - }, | |
| 141 | - }, | |
| 142 | - externals: function ({ context, request }, callback) { | |
| 143 | - if (env === 'production') { | |
| 144 | - if (/^react$/.test(request)) { | |
| 145 | - return callback(null, 'React', 'react'); | |
| 146 | - } | |
| 147 | - | |
| 148 | - if (/^react-dom$/.test(request)) { | |
| 149 | - return callback(null, 'ReactDOM', 'react-dom'); | |
| 150 | - } | |
| 151 | - } | |
| 152 | - | |
| 153 | - if (/antd.*.(css|less)$/.test(path.resolve(context, request))) { | |
| 154 | - return callback(null, 'antd-style'); | |
| 155 | - } | |
| 156 | - | |
| 157 | - callback(); | |
| 158 | - }, | |
| 159 | - }); | |
| 160 | - // } | |
| 161 | - }, | |
| 162 | - ...userConfig, | |
| 163 | - }); | |
| 164 | - `; | |
| 165 | -}; | |
| 166 | - | |
| 167 | -module.exports = getConfigContent; |
config/vite.config.js
0 → 100644
| 1 | +const { defineConfig } = require('vite'); | |
| 2 | +const process = require('process'); | |
| 3 | +import { viteExternalsPlugin } from 'vite-plugin-externals'; | |
| 4 | +const path = require('path'); | |
| 5 | +const { cwd } = require('process'); | |
| 6 | + | |
| 7 | +module.exports = defineConfig({ | |
| 8 | + server: { | |
| 9 | + proxy: path.resolve(cwd(), './proxy'), | |
| 10 | + }, | |
| 11 | + define: { | |
| 12 | + // By default, Vite doesn't include shims for NodeJS/ | |
| 13 | + // necessary for segment analytics lib to work | |
| 14 | + global: {}, | |
| 15 | + 'process.env': process.env, | |
| 16 | + }, | |
| 17 | + resolve: { | |
| 18 | + extensions: ['.json', '.jsx', '.js', '.ts', '.tsx'], | |
| 19 | + alias: { | |
| 20 | + '@': path.resolve(cwd, './src/'), | |
| 21 | + '@/src': path.resolve(cwd, './src/'), | |
| 22 | + '~@qx': path.resolve(cwd, './node_modules/@qx'), | |
| 23 | + }, | |
| 24 | + }, | |
| 25 | + css: { | |
| 26 | + preprocessorOptions: { | |
| 27 | + less: { | |
| 28 | + javascriptEnabled: true, | |
| 29 | + additionalData: `@import '@/styles/variable.less';`, | |
| 30 | + }, | |
| 31 | + }, | |
| 32 | + }, | |
| 33 | + plugins: [ | |
| 34 | + new viteExternalsPlugin({ | |
| 35 | + react: 'React', | |
| 36 | + 'react-dom': 'ReactDOM', | |
| 37 | + dayjs: 'dayjs', | |
| 38 | + antd: 'antd', | |
| 39 | + }), | |
| 40 | + ], | |
| 41 | +}); | ... | ... |
config/webpack.base.js
0 → 100644
| 1 | +const CopyPlugin = require('copy-webpack-plugin'); | |
| 2 | +const HtmlWebpackPlugin = require('html-webpack-plugin'); | |
| 3 | +const WebpackBar = require('webpackbar'); | |
| 4 | +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); | |
| 5 | +const NodePolyfillPlugin = require('node-polyfill-webpack-plugin'); | |
| 6 | + | |
| 7 | +const process = require('process'); | |
| 8 | +const path = require('path'); | |
| 9 | + | |
| 10 | +const cwd = process.cwd(); | |
| 11 | + | |
| 12 | +module.exports = { | |
| 13 | + output: { | |
| 14 | + filename: './js/[name]-[contenthash].js', | |
| 15 | + libraryTarget: 'umd', | |
| 16 | + clean: true, | |
| 17 | + }, | |
| 18 | + entry: path.resolve(cwd, './src/index.tsx'), | |
| 19 | + module: { | |
| 20 | + rules: [ | |
| 21 | + { | |
| 22 | + test: /\.(js|jsx|ts|tsx)$/, | |
| 23 | + exclude: /node_modules/, | |
| 24 | + use: [ | |
| 25 | + 'thread-loader', | |
| 26 | + { | |
| 27 | + loader: 'babel-loader', | |
| 28 | + options: { | |
| 29 | + presets: [ | |
| 30 | + '@babel/preset-env', | |
| 31 | + '@babel/preset-react', | |
| 32 | + '@babel/preset-typescript', | |
| 33 | + ], | |
| 34 | + }, | |
| 35 | + }, | |
| 36 | + ], | |
| 37 | + }, | |
| 38 | + { | |
| 39 | + test: /\.(png|jpeg|jpg)(\?[a-z0-9=&.]+)?$/, | |
| 40 | + use: { | |
| 41 | + loader: 'file-loader', | |
| 42 | + options: { | |
| 43 | + name: './public/imgs/[name].[ext]', | |
| 44 | + }, | |
| 45 | + }, | |
| 46 | + }, | |
| 47 | + { | |
| 48 | + test: /\.(ttf|eot|woff(2)?)(\?[a-z0-9=&.]+)?$/, | |
| 49 | + use: { | |
| 50 | + loader: 'file-loader', | |
| 51 | + options: { | |
| 52 | + name: './public/fonts/[name].[ext]', | |
| 53 | + }, | |
| 54 | + }, | |
| 55 | + }, | |
| 56 | + { | |
| 57 | + test: /\.less$/i, | |
| 58 | + use: [ | |
| 59 | + MiniCssExtractPlugin.loader, | |
| 60 | + 'css-loader', | |
| 61 | + { | |
| 62 | + loader: 'less-loader', | |
| 63 | + options: { | |
| 64 | + additionalData: `@import '@/styles/variable.less';`, | |
| 65 | + }, | |
| 66 | + }, | |
| 67 | + ], | |
| 68 | + }, | |
| 69 | + | |
| 70 | + { | |
| 71 | + test: /\.css$/i, | |
| 72 | + use: [MiniCssExtractPlugin.loader, 'css-loader'], | |
| 73 | + }, | |
| 74 | + { | |
| 75 | + test: /\.svg$/, | |
| 76 | + use: ['@svgr/webpack', 'url-loader'], | |
| 77 | + }, | |
| 78 | + ], | |
| 79 | + }, | |
| 80 | + resolve: { | |
| 81 | + extensions: ['.json', '.jsx', '.js', '.ts', '.tsx'], | |
| 82 | + alias: { | |
| 83 | + '@': path.resolve(cwd, './src/'), | |
| 84 | + '@/src': path.resolve(cwd, './src/'), | |
| 85 | + }, | |
| 86 | + }, | |
| 87 | + plugins: [ | |
| 88 | + new HtmlWebpackPlugin({ | |
| 89 | + template: path.resolve(cwd, './src/public/index.html'), | |
| 90 | + }), | |
| 91 | + new CopyPlugin({ | |
| 92 | + patterns: [ | |
| 93 | + { | |
| 94 | + from: path.resolve(cwd, './static'), | |
| 95 | + to: 'static', | |
| 96 | + }, | |
| 97 | + ], | |
| 98 | + }), | |
| 99 | + new WebpackBar(), | |
| 100 | + new NodePolyfillPlugin() | |
| 101 | + ], | |
| 102 | +}; | ... | ... |
config/webpack.dev.js
0 → 100644
| 1 | +const { merge } = require('webpack-merge'); | |
| 2 | +const baseConfig = require('./webpack.base'); | |
| 3 | +const path = require('path'); | |
| 4 | +const { cwd } = require('process'); | |
| 5 | + | |
| 6 | +module.exports = merge(baseConfig, { | |
| 7 | + mode: 'development', | |
| 8 | + devServer: { | |
| 9 | + hot: false, | |
| 10 | + headers: { | |
| 11 | + 'Access-Control-Allow-Origin': '*', | |
| 12 | + }, | |
| 13 | + proxy: path.resolve(cwd(), './proxy'), | |
| 14 | + }, | |
| 15 | + externals: {}, | |
| 16 | +}); | ... | ... |
config/webpack.prod.js
0 → 100644
| 1 | +const { merge } = require('webpack-merge'); | |
| 2 | +const baseConfig = require('./webpack.base'); | |
| 3 | +const CssMinimizerWebpackPlugin = require('css-minimizer-webpack-plugin'); | |
| 4 | +const TerserPlugin = require('terser-webpack-plugin'); | |
| 5 | +const CompressionWebpackPlugin = require('compression-webpack-plugin'); | |
| 6 | +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); | |
| 7 | + | |
| 8 | +module.exports = merge(baseConfig, { | |
| 9 | + mode: 'production', | |
| 10 | + externals: { | |
| 11 | + react: 'React', | |
| 12 | + 'react-dom': 'ReactDOM', | |
| 13 | + 'dayjs': 'dayjs', | |
| 14 | + 'antd': 'antd', | |
| 15 | + }, | |
| 16 | + optimization: { | |
| 17 | + minimize: true, | |
| 18 | + minimizer: [ | |
| 19 | + new CompressionWebpackPlugin(), | |
| 20 | + new TerserPlugin({ | |
| 21 | + extractComments: false, | |
| 22 | + test: /\.js(\?.*)?$/i, | |
| 23 | + exclude: /node_modules/, | |
| 24 | + }), | |
| 25 | + new MiniCssExtractPlugin({ | |
| 26 | + filename: './styles/[name]-[contenthash].css', | |
| 27 | + }), | |
| 28 | + new CssMinimizerWebpackPlugin(), | |
| 29 | + ], | |
| 30 | + }, | |
| 31 | +}); | ... | ... |