@qse/edu-scripts 1.14.4 → 1.14.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # 更新日志
2
2
 
3
+ ## 1.14.6 (2024-08-12)
4
+
5
+ - feat: 增加开发环境启动后的消息提示
6
+ - feat: 优化 proxy 配置方式
7
+
8
+ ## 1.14.5 (2024-05-29)
9
+
10
+ - feat: start 增加 process.env.PORT
11
+ - fix: mock 文件夹只相应 .js .ts 文件
12
+
3
13
  ## 1.14.4 (2024-05-11)
4
14
 
5
15
  - feat: 打包时自动压缩图片
package/README.md CHANGED
@@ -14,13 +14,13 @@ nodejs 版本至少 12+
14
14
 
15
15
  ```shell
16
16
  # npm 安装
17
- npm create @qse/edu-app
17
+ npm create @qse/edu-app@latest
18
18
 
19
19
  # 或者 yarn 安装
20
- yarn create @qse/edu-app
20
+ yarn create @qse/edu-app@latest
21
21
 
22
22
  # 或者 pnpm 安装
23
- pnpm create @qse/edu-app
23
+ pnpm create @qse/edu-app@latest
24
24
  ```
25
25
 
26
26
  ## 安装
package/docs/deploy.md CHANGED
@@ -40,6 +40,7 @@ npx ssh-sftp init
40
40
 
41
41
  ```json
42
42
  {
43
+ "$schema": "http://www.zhidianbao.cn:8088/qsxxwapdev/edu-ssh-sftp/sftprc.schema.json",
43
44
  "preset": {
44
45
  "context": "qsxxwapdev"
45
46
  }
package/docs/refactor.md CHANGED
@@ -21,14 +21,11 @@
21
21
 
22
22
  ```html
23
23
  <% if(process.env.NODE_ENV === 'development') { %>
24
- <script src="//www.zhidianbao.cn:8088/qsxxwapdev/edu-scripts/react-dev-preset.js"></script>
25
- <script src="//www.zhidianbao.cn:8088/qsxxwapdev/edu-scripts/moment2.29.1.js"></script>
26
- <script src="//www.zhidianbao.cn:8088/qsxxwapdev/edu-scripts/antd3.26.20.js"></script>
27
-
28
- <!-- 如果用到 @qse/antd -->
29
- <script src="//www.zhidianbao.cn:8088/qsxxwapdev/edu-scripts/qsb-antd.min.js"></script>
30
- <!-- 如果用到 @qse/scheme-render -->
31
- <script src="//www.zhidianbao.cn:8088/qsxxwapdev/edu-scripts/qsb-scheme-render.min.js"></script>
24
+ <script src="https://www.zhidianbao.cn:8443/qsxxwapdev/edu-scripts/react-dev-preset.js"></script>
25
+ <script src="https://www.zhidianbao.cn:8443/qsxxwapdev/edu-scripts/moment2.29.1.js"></script>
26
+ <script src="https://www.zhidianbao.cn:8443/qsxxwapdev/edu-scripts/antd3.26.20.js"></script>
27
+ <script src="https://registry.npmmirror.com/@qse/antd/latest/files/dist/qsb-antd.min.js"></script>
28
+ <script src="https://registry.npmmirror.com/@qse/scheme-render/latest/files/dist/qsb-scheme-render.min.js"></script>
32
29
  <% } else { %>
33
30
  <script src="//static.qsepay.net/lib/react16.14_fastclick1.0.6_natty-storage2.0.2-fetch2.4.2_axios0.21.1_common31.js"></script>
34
31
  <script src="//static.qsepay.net/lib/moment2.29.1.js"></script>
package/docs/static.md CHANGED
@@ -3,15 +3,11 @@
3
3
  ## 开发环境使用的静态资源
4
4
 
5
5
  ```html
6
- <script src="//www.zhidianbao.cn:8088/qsxxwapdev/edu-scripts/react-dev-preset.js"></script>
7
- <script src="//www.zhidianbao.cn:8088/qsxxwapdev/edu-scripts/moment2.29.1.js"></script>
8
- <script src="//www.zhidianbao.cn:8088/qsxxwapdev/edu-scripts/antd3.26.20.js"></script>
9
-
10
- <!-- 下方资源可能存在版本滞后 -->
11
- <!-- @qsb/antd @1.7.2 -->
12
- <script src="//www.zhidianbao.cn:8088/qsxxwapdev/edu-scripts/qsb-antd.min.js"></script>
13
- <!-- @qsb/scheme-render @1.2.3 -->
14
- <script src="//www.zhidianbao.cn:8088/qsxxwapdev/edu-scripts/qsb-scheme-render.min.js"></script>
6
+ <script src="https://www.zhidianbao.cn:8443/qsxxwapdev/edu-scripts/react-dev-preset.js"></script>
7
+ <script src="https://www.zhidianbao.cn:8443/qsxxwapdev/edu-scripts/moment2.29.1.js"></script>
8
+ <script src="https://www.zhidianbao.cn:8443/qsxxwapdev/edu-scripts/antd3.26.20.js"></script>
9
+ <script src="https://registry.npmmirror.com/@qse/antd/latest/files/dist/qsb-antd.min.js"></script>
10
+ <script src="https://registry.npmmirror.com/@qse/scheme-render/latest/files/dist/qsb-scheme-render.min.js"></script>
15
11
  ```
16
12
 
17
13
  ## 生产环境使用的静态资源
@@ -13,3 +13,8 @@ declare module '@qse/edu-login' {
13
13
  // 拓展 config.user
14
14
  }
15
15
  }
16
+
17
+ declare global {
18
+ interface Window {
19
+ }
20
+ }
@@ -14,7 +14,7 @@ var mockCache = {};
14
14
  var isSetup = false;
15
15
  var setupMock = debounce(function setupMock2() {
16
16
  mockCache = {};
17
- const files = globby.sync(paths.mock);
17
+ const files = globby.sync(paths.mock, { expandDirectories: { extensions: ["js", "ts"] } });
18
18
  if (isSetup) {
19
19
  console.log(chalk.green("Mock files changed, reloaded"));
20
20
  } else {
@@ -11,6 +11,7 @@ var appPkg = require(paths.package);
11
11
  var appConfig = require("../utils/appConfig");
12
12
  var { ESBuildMinifyPlugin } = require("esbuild-loader");
13
13
  var ImageMinimizerPlugin = require("image-minimizer-webpack-plugin");
14
+ var once = require("lodash/once");
14
15
  var jsMainPath = appConfig.grayscale ? `${appPkg.name}/beta/${appPkg.name}` : `${appPkg.name}/${appPkg.name}`;
15
16
  var assetPath = appConfig.grayscale ? `${appPkg.name}/beta/${appPkg.version}` : `${appPkg.name}/${appPkg.version}`;
16
17
  var cssRegex = /\.css$/;
@@ -352,7 +353,16 @@ module.exports = function getWebpackConfig(args, override) {
352
353
  }
353
354
  })
354
355
  ) : [],
355
- process.env.ANALYZE && isProd && new BundleAnalyzerPlugin()
356
+ process.env.ANALYZE && isProd && new BundleAnalyzerPlugin(),
357
+ isDev && !!override.startup && ((compiler) => {
358
+ compiler.hooks.afterDone.tap(
359
+ "edu-scripts-startup",
360
+ once(() => {
361
+ const logger = compiler.getInfrastructureLogger("edu-scripts");
362
+ override.startup({ logger, chalk: require("chalk"), compiler });
363
+ })
364
+ );
365
+ })
356
366
  ].filter(Boolean),
357
367
  optimization: {
358
368
  minimize: isProd && override.minify !== false,
@@ -32,18 +32,41 @@ module.exports = function getWebpackDevServerConfig(args, override) {
32
32
  return middlewares;
33
33
  },
34
34
  proxy: [
35
- ...override.proxy,
36
35
  {
37
36
  context: ["/api"],
38
37
  target: "http://192.168.10.19:3339/qsxxwapdev",
39
38
  changeOrigin: true,
40
- headers: {
41
- host: "www.zhidianbao.cn",
42
- origin: "http://www.zhidianbao.cn"
43
- }
39
+ headers: { host: "www.zhidianbao.cn", origin: "http://www.zhidianbao.cn" }
44
40
  }
45
41
  ],
46
42
  compress: true
47
43
  };
44
+ if (override.proxy) {
45
+ if (Array.isArray(override.proxy)) {
46
+ devServer.proxy = [...override.proxy, ...devServer.proxy];
47
+ } else if (typeof override.proxy === "object") {
48
+ const proxies = Object.entries(override.proxy).map(([context, target]) => {
49
+ const url = new URL(target);
50
+ return {
51
+ context: [context],
52
+ target,
53
+ changeOrigin: true,
54
+ headers: { host: url.host, origin: url.origin }
55
+ };
56
+ });
57
+ devServer.proxy = [...proxies, ...devServer.proxy];
58
+ } else {
59
+ throw new Error("proxy 必须是数组或对象");
60
+ }
61
+ const proxyMap = /* @__PURE__ */ new Map();
62
+ devServer.proxy = devServer.proxy.filter((item) => {
63
+ const key = JSON.stringify([...item.context].sort());
64
+ if (!proxyMap.has(key)) {
65
+ proxyMap.set(key, true);
66
+ return true;
67
+ }
68
+ return false;
69
+ });
70
+ }
48
71
  return devServer;
49
72
  };
package/lib/start.js CHANGED
@@ -19,6 +19,7 @@ module.exports = async function start(args) {
19
19
  }
20
20
  process.env.WDS_SOCKET_PORT = port;
21
21
  args.port = port;
22
+ process.env.PORT = port;
22
23
  const compiler = webpack(getConfig(args));
23
24
  const devServer = new WebpackDevServer(compiler.options.devServer, compiler);
24
25
  devServer.start();
@@ -1,4 +1,5 @@
1
- import type { Configuration } from 'webpack';
1
+ import { Chalk } from 'chalk';
2
+ import type { Compiler, Configuration } from 'webpack';
2
3
  import type { Configuration as DevServerConfiguration, ProxyConfigArray } from 'webpack-dev-server';
3
4
  export type BabelImportPlugin = [
4
5
  'import',
@@ -55,9 +56,14 @@ export type Config = {
55
56
  define?: Record<string, any>;
56
57
  /**
57
58
  * webpack-dev-server proxy
59
+ *
60
+ * context 填写的顺序很重要,前面的会优先匹配。可以重复定义 /api 来覆盖默认的配置
61
+ * @see https://webpack.js.org/configuration/dev-server/#devserverproxy
58
62
  * @default /api -> /qsxxwapdev/api
63
+ * @example { '/api': 'http://localhost:3000' }
64
+ * @example [{ context: ['/api'], target: 'http://localhost:3000' }]
59
65
  */
60
- proxy?: ProxyConfigArray;
66
+ proxy?: ProxyConfigArray | Record<string, string>;
61
67
  extraPostCSSPlugins?: any[];
62
68
  /**
63
69
  * 开启 mock 功能,会自动加载 mock 文件夹下的文件
@@ -66,5 +72,16 @@ export type Config = {
66
72
  * 如果设置 false,会关闭 mock 功能
67
73
  */
68
74
  mock?: boolean;
75
+ /**
76
+ * 开发模式启动后只执行一次的函数,用来展示启动后的提示信息,或者自定义的逻辑
77
+ */
78
+ startup?: (params: {
79
+ /** 控制台输出内容 */
80
+ logger: ReturnType<Compiler['getInfrastructureLogger']>;
81
+ /** 字体颜色相关工具 */
82
+ chalk: Chalk;
83
+ /** webpack compiler 自定义的时候会用到 */
84
+ compiler: Compiler;
85
+ }) => void;
69
86
  };
70
87
  export declare function defineConfig(config: Config): Config;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qse/edu-scripts",
3
- "version": "1.14.4",
3
+ "version": "1.14.6",
4
4
  "author": "Kinoko",
5
5
  "license": "MIT",
6
6
  "description": "教育工程化基础框架",
@@ -34,74 +34,74 @@
34
34
  "extends": "qsb-react"
35
35
  },
36
36
  "dependencies": {
37
- "@babel/core": "~7.23.2",
38
- "@babel/plugin-proposal-decorators": "~7.23.2",
39
- "@babel/plugin-transform-runtime": "~7.23.2",
40
- "@babel/preset-env": "~7.23.2",
41
- "@babel/preset-react": "~7.23.2",
42
- "@babel/preset-typescript": "~7.23.2",
43
- "@babel/register": "~7.23.2",
44
- "@babel/runtime": "~7.23.2",
45
- "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10",
37
+ "@babel/core": "~7.24.7",
38
+ "@babel/plugin-proposal-decorators": "~7.24.7",
39
+ "@babel/plugin-transform-runtime": "~7.24.7",
40
+ "@babel/preset-env": "~7.24.7",
41
+ "@babel/preset-react": "~7.24.7",
42
+ "@babel/preset-typescript": "~7.24.7",
43
+ "@babel/register": "~7.24.6",
44
+ "@babel/runtime": "~7.24.7",
45
+ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15",
46
46
  "@qse/ssh-sftp": "^1.0.1",
47
- "@svgr/webpack": "^8.0.1",
47
+ "@svgr/webpack": "^8.1.0",
48
48
  "babel-loader": "^9.1.3",
49
49
  "babel-plugin-import": "^1.13.8",
50
50
  "case-sensitive-paths-webpack-plugin": "^2.4.0",
51
51
  "chalk": "^4.1.2",
52
- "chokidar": "^3.5.3",
52
+ "chokidar": "^3.6.0",
53
53
  "cookie-parser": "^1.4.6",
54
- "css-loader": "^6.8.1",
55
- "cssnano": "^6.0.1",
56
- "debug": "^4.3.4",
54
+ "css-loader": "^6.11.0",
55
+ "cssnano": "^6.1.2",
56
+ "debug": "^4.3.5",
57
57
  "esbuild-loader": "^2.21.0",
58
- "express": "^4.18.2",
58
+ "express": "^4.19.2",
59
59
  "filesize": "^8.0.7",
60
60
  "fs-extra": "^10.1.0",
61
61
  "globby": "^11.1.0",
62
62
  "gzip-size": "^6.0.0",
63
- "html-webpack-plugin": "^5.5.3",
64
- "image-minimizer-webpack-plugin": "^3.0.0",
65
- "inquirer": "^8.2.5",
63
+ "html-webpack-plugin": "^5.6.0",
64
+ "image-minimizer-webpack-plugin": "^3.8.3",
65
+ "inquirer": "^8.2.6",
66
66
  "less": "^3.13.1",
67
67
  "less-loader": "^10.2.0",
68
68
  "lodash": "^4.17.21",
69
69
  "multer": "^1.4.5-lts.1",
70
70
  "open": "^8.4.2",
71
- "path-to-regexp": "^6.2.1",
72
- "postcss": "^8.4.27",
71
+ "path-to-regexp": "^6.2.2",
72
+ "postcss": "^8.4.38",
73
73
  "postcss-flexbugs-fixes": "^5.0.2",
74
- "postcss-loader": "^7.3.3",
74
+ "postcss-loader": "^7.3.4",
75
75
  "postcss-momentum-scrolling": "^3.14.22",
76
76
  "postcss-normalize": "^8.0.1",
77
- "postcss-preset-env": "^9.1.0",
77
+ "postcss-preset-env": "^9.5.14",
78
78
  "prettier": "^2.8.8",
79
79
  "prettier-plugin-tailwindcss": "^0.4.1",
80
- "react-refresh": "^0.14.0",
80
+ "react-refresh": "^0.14.2",
81
81
  "recursive-readdir": "^2.2.3",
82
82
  "rimraf": "^3.0.2",
83
- "semver": "^7.5.4",
84
- "sharp": "^0.32.0",
83
+ "semver": "^7.6.2",
84
+ "sharp": "^0.32.6",
85
85
  "strip-ansi": "^6.0.1",
86
- "style-loader": "^3.3.3",
87
- "tailwindcss": "^3.3.3",
88
- "terser-webpack-plugin": "~5.3.9",
89
- "tmp": "^0.2.1",
90
- "typescript": "^5.1.6",
86
+ "style-loader": "^3.3.4",
87
+ "tailwindcss": "^3.4.4",
88
+ "terser-webpack-plugin": "~5.3.10",
89
+ "tmp": "^0.2.3",
90
+ "typescript": "^5.4.5",
91
91
  "update-notifier": "^5.1.0",
92
92
  "url-loader": "^4.1.1",
93
- "webpack": "^5.88.2",
94
- "webpack-bundle-analyzer": "^4.9.0",
95
- "webpack-dev-server": "^4.15.1",
93
+ "webpack": "^5.92.0",
94
+ "webpack-bundle-analyzer": "^4.10.2",
95
+ "webpack-dev-server": "^4.15.2",
96
96
  "yargs": "^17.7.2"
97
97
  },
98
98
  "devDependencies": {
99
99
  "@types/fs-extra": "^9.0.13",
100
100
  "@types/jest": "^28.1.8",
101
- "@types/yargs": "^17.0.24",
102
- "dumi": "^1.1.50",
101
+ "@types/yargs": "^17.0.32",
102
+ "dumi": "^1.1.54",
103
103
  "eslint-config-qsb-react": "^1.1.1",
104
- "father": "^4.3.5",
104
+ "father": "^4.4.4",
105
105
  "jest": "^28.1.3"
106
106
  }
107
107
  }
@@ -13,3 +13,8 @@ declare module '@qse/edu-login' {
13
13
  // 拓展 config.user
14
14
  }
15
15
  }
16
+
17
+ declare global {
18
+ interface Window {
19
+ }
20
+ }
@@ -23,7 +23,7 @@ const setupMock = debounce(function setupMock() {
23
23
  // clean
24
24
  mockCache = {}
25
25
 
26
- const files = globby.sync(paths.mock)
26
+ const files = globby.sync(paths.mock, { expandDirectories: { extensions: ['js', 'ts'] } })
27
27
 
28
28
  if (isSetup) {
29
29
  console.log(chalk.green('Mock files changed, reloaded'))
@@ -9,7 +9,8 @@ const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin')
9
9
  const appPkg = require(paths.package)
10
10
  const appConfig = require('../utils/appConfig')
11
11
  const { ESBuildMinifyPlugin } = require('esbuild-loader')
12
- const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin");
12
+ const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin')
13
+ const once = require('lodash/once')
13
14
 
14
15
  const jsMainPath = appConfig.grayscale
15
16
  ? `${appPkg.name}/beta/${appPkg.name}`
@@ -378,21 +379,33 @@ module.exports = function getWebpackConfig(args, override) {
378
379
  )
379
380
  : []),
380
381
  process.env.ANALYZE && isProd && new BundleAnalyzerPlugin(),
382
+ isDev &&
383
+ !!override.startup &&
384
+ ((compiler) => {
385
+ compiler.hooks.afterDone.tap(
386
+ 'edu-scripts-startup',
387
+ once(() => {
388
+ const logger = compiler.getInfrastructureLogger('edu-scripts')
389
+ override.startup({ logger, chalk: require('chalk'), compiler })
390
+ })
391
+ )
392
+ }),
381
393
  ].filter(Boolean),
382
394
  optimization: {
383
395
  minimize: isProd && override.minify !== false,
384
396
  minimizer: [
385
- override.minifyImage && new ImageMinimizerPlugin({
386
- minimizer: {
387
- implementation: ImageMinimizerPlugin.sharpMinify,
388
- options: {
389
- encodeOptions: {
390
- // Your options for `sharp`
391
- // https://sharp.pixelplumbing.com/api-output
397
+ override.minifyImage &&
398
+ new ImageMinimizerPlugin({
399
+ minimizer: {
400
+ implementation: ImageMinimizerPlugin.sharpMinify,
401
+ options: {
402
+ encodeOptions: {
403
+ // Your options for `sharp`
404
+ // https://sharp.pixelplumbing.com/api-output
405
+ },
392
406
  },
393
407
  },
394
- },
395
- }),
408
+ }),
396
409
  override.minify === 'esbuild' &&
397
410
  new ESBuildMinifyPlugin({
398
411
  pure: override.pure_funcs ?? ['console.log'],
@@ -39,19 +39,45 @@ module.exports = function getWebpackDevServerConfig(args, override) {
39
39
  return middlewares
40
40
  },
41
41
  proxy: [
42
- ...override.proxy,
43
42
  {
44
43
  context: ['/api'],
45
44
  target: 'http://192.168.10.19:3339/qsxxwapdev',
46
45
  changeOrigin: true,
47
- headers: {
48
- host: 'www.zhidianbao.cn',
49
- origin: 'http://www.zhidianbao.cn',
50
- },
46
+ headers: { host: 'www.zhidianbao.cn', origin: 'http://www.zhidianbao.cn' },
51
47
  },
52
48
  ],
53
49
  compress: true,
54
50
  }
55
51
 
52
+ if (override.proxy) {
53
+ if (Array.isArray(override.proxy)) {
54
+ devServer.proxy = [...override.proxy, ...devServer.proxy]
55
+ } else if (typeof override.proxy === 'object') {
56
+ const proxies = Object.entries(override.proxy).map(([context, target]) => {
57
+ const url = new URL(target)
58
+ return {
59
+ context: [context],
60
+ target: target,
61
+ changeOrigin: true,
62
+ headers: { host: url.host, origin: url.origin },
63
+ }
64
+ })
65
+ devServer.proxy = [...proxies, ...devServer.proxy]
66
+ } else {
67
+ throw new Error('proxy 必须是数组或对象')
68
+ }
69
+
70
+ // 清理重复的代理配置
71
+ const proxyMap = new Map()
72
+ devServer.proxy = devServer.proxy.filter((item) => {
73
+ const key = JSON.stringify([...item.context].sort())
74
+ if (!proxyMap.has(key)) {
75
+ proxyMap.set(key, true)
76
+ return true
77
+ }
78
+ return false
79
+ })
80
+ }
81
+
56
82
  return devServer
57
83
  }
package/src/start.js CHANGED
@@ -25,6 +25,7 @@ module.exports = async function start(args) {
25
25
  }
26
26
  process.env.WDS_SOCKET_PORT = port
27
27
  args.port = port
28
+ process.env.PORT = port
28
29
 
29
30
  const compiler = webpack(getConfig(args))
30
31
  const devServer = new WebpackDevServer(compiler.options.devServer, compiler)
@@ -1,4 +1,5 @@
1
- import type { Configuration } from 'webpack'
1
+ import { Chalk } from 'chalk'
2
+ import type { Compiler, Configuration } from 'webpack'
2
3
  import type { Configuration as DevServerConfiguration, ProxyConfigArray } from 'webpack-dev-server'
3
4
 
4
5
  export type BabelImportPlugin = [
@@ -52,14 +53,19 @@ export type Config = {
52
53
  * 打包时压缩图片资源
53
54
  * @default true
54
55
  */
55
- minifyImage?:boolean
56
+ minifyImage?: boolean
56
57
  /** 自定义全局参数 */
57
58
  define?: Record<string, any>
58
59
  /**
59
60
  * webpack-dev-server proxy
61
+ *
62
+ * context 填写的顺序很重要,前面的会优先匹配。可以重复定义 /api 来覆盖默认的配置
63
+ * @see https://webpack.js.org/configuration/dev-server/#devserverproxy
60
64
  * @default /api -> /qsxxwapdev/api
65
+ * @example { '/api': 'http://localhost:3000' }
66
+ * @example [{ context: ['/api'], target: 'http://localhost:3000' }]
61
67
  */
62
- proxy?: ProxyConfigArray
68
+ proxy?: ProxyConfigArray | Record<string, string>
63
69
  extraPostCSSPlugins?: any[]
64
70
  /**
65
71
  * 开启 mock 功能,会自动加载 mock 文件夹下的文件
@@ -68,6 +74,17 @@ export type Config = {
68
74
  * 如果设置 false,会关闭 mock 功能
69
75
  */
70
76
  mock?: boolean
77
+ /**
78
+ * 开发模式启动后只执行一次的函数,用来展示启动后的提示信息,或者自定义的逻辑
79
+ */
80
+ startup?: (params: {
81
+ /** 控制台输出内容 */
82
+ logger: ReturnType<Compiler['getInfrastructureLogger']>
83
+ /** 字体颜色相关工具 */
84
+ chalk: Chalk
85
+ /** webpack compiler 自定义的时候会用到 */
86
+ compiler: Compiler
87
+ }) => void
71
88
  }
72
89
  export function defineConfig(config: Config) {
73
90
  return config