feat: enhance dropLogLevel build config (#6376)

* feat: 增强droplog功能

* fix: 修改warn说明

* fix: 补充md文件

---------

Co-authored-by: ClarkXia <xiawenwu41@gmail.com>
This commit is contained in:
spicylemonhaha 2023-07-07 18:02:56 +08:00 committed by GitHub
parent ae705c03e8
commit f58e0c16d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 76 additions and 32 deletions

View File

@ -185,7 +185,7 @@ const userConfig = [
},
{
name: 'dropLogLevel',
validation: 'string',
validation: 'boolean|array|string',
setConfig: (config: Config, dropLogLevel: UserConfig['dropLogLevel']) => {
const levels = {
trace: 0,
@ -195,17 +195,38 @@ const userConfig = [
warn: 3,
error: 4,
};
const level = levels[dropLogLevel];
if (typeof level === 'number') {
if (typeof dropLogLevel === 'string') {
const level = levels[dropLogLevel];
if (typeof level === 'number') {
return mergeDefaultValue(config, 'minimizerOptions', {
compress: {
pure_funcs: Object.keys(levels)
.filter((methodName) => levels[methodName] <= level)
.map((methodName) => `console.${methodName}`),
},
});
} else {
logger.warn(
`If you use a string as the attribute value of dropLogLevel you should enter one of the following strings [${Object.keys(
levels,
).join(',')}]`,
);
}
} else if (dropLogLevel === true) {
return mergeDefaultValue(config, 'minimizerOptions', {
compress: {
pure_funcs: Object.keys(levels)
.filter((methodName) => levels[methodName] <= level)
.map(methodName => `console.${methodName}`),
drop_console: true,
},
});
} else {
logger.warn(`dropLogLevel only support [${Object.keys(levels).join(',')}]`);
} else if (Array.isArray(dropLogLevel)) {
const pureFuncs = dropLogLevel.map((method) => `console.${method}`);
return mergeDefaultValue(config, 'minimizerOptions', {
compress: {
pure_funcs: pureFuncs,
},
});
} else if (dropLogLevel !== false) {
logger.warn('dropLogLevel support boolean, array and string');
}
},
},
@ -218,16 +239,21 @@ const userConfig = [
if (customValue === true) {
compileRegex = /node_modules\/*/;
} else if (customValue && customValue.length > 0) {
compileRegex = new RegExp(customValue.map((dep: string | RegExp) => {
if (dep instanceof RegExp) {
return dep.source;
} else if (typeof dep === 'string') {
// add default prefix of node_modules
const matchStr = `node_modules/?.+${dep}/`;
return matchStr;
}
return false;
}).filter(Boolean).join('|'));
compileRegex = new RegExp(
customValue
.map((dep: string | RegExp) => {
if (dep instanceof RegExp) {
return dep.source;
} else if (typeof dep === 'string') {
// add default prefix of node_modules
const matchStr = `node_modules/?.+${dep}/`;
return matchStr;
}
return false;
})
.filter(Boolean)
.join('|'),
);
}
if (compileRegex) {
config.compileIncludes = [compileRegex];
@ -363,7 +389,9 @@ const userConfig = [
setConfig: (config: Config, codeSplitting: UserConfig['codeSplitting'], context: UserConfigContext) => {
const { originalUserConfig } = context;
if ('splitChunks' in originalUserConfig) {
logger.warn('splitChunks is deprecated, please use codeSplitting instead.https://ice.work/docs/guide/basic/config#codesplitting');
logger.warn(
'splitChunks is deprecated, please use codeSplitting instead.https://ice.work/docs/guide/basic/config#codesplitting',
);
} else {
// When codeSplitting is set to false / router, do not config splitChunks.
if (codeSplitting === false || codeSplitting === 'page') {
@ -466,8 +494,4 @@ function defineConfig(config: UserConfig | (() => UserConfig)) {
return config || defaultUserConfig;
}
export {
defineConfig,
userConfig,
cliOption,
};
export { defineConfig, userConfig, cliOption };

View File

@ -30,6 +30,8 @@ interface IgnorePattern {
type DistType = 'javascript' | 'html';
type DropType = 'trace' | 'debug' | 'log' | 'info' | 'warn' | 'error';
interface Fetcher {
packageName: string;
method?: string;
@ -140,7 +142,7 @@ export interface UserConfig {
* `console.*` will be dropped when build.
* @see https://v3.ice.work/docs/guide/basic/config#droploglevel
*/
dropLogLevel?: 'trace' | 'debug' | 'log' | 'info' | 'warn' | 'error';
dropLogLevel?: DropType[] | DropType | boolean;
/**
* Minify build output, it only works in prod mode by default.
* @see https://v3.ice.work/docs/guide/basic/config#minify
@ -248,9 +250,11 @@ export interface UserConfig {
* generate additional assets for request data, default is true
* @see https://v3.ice.work/docs/guide/basic/config#dataloader
*/
dataLoader?: {
fetcher?: Fetcher;
} | Boolean;
dataLoader?:
| {
fetcher?: Fetcher;
}
| Boolean;
/**
* Enable cross-origin loading of chunks.
* @see https://v3.ice.work/docs/guide/basic/config#crossoriginloading

View File

@ -240,11 +240,27 @@ export default defineConfig(() => ({
### dropLogLevel
- 类型:`'trace' | 'debug' | 'log' | 'warn' | 'error'`
- 默认值:`null`,不移除任何 console 代码
- 类型:`boolean | DropType[] | DropType`
- 默认值:`false`,不移除任何 console 代码
压缩代码时移除 console.* 相关代码,比如配置了 log 则会移除 console.trace
、console.debug、console.log 代码。
压缩代码时移除 console.* 相关代码配置为true时移除所有console.*相关代码。当想移除部分console代码例如想要移除console.log和console.error时可以配置为
```js
import { defineConfig } from '@ice/app';
export default defineConfig(() => ({
dropLog: ['error', 'log'],
}));
```
也可以根据console等级来进行移除
```js
// console 等级为 trace < debug < log < info < warn < error
// 例如想要移除trace、debug、log时可以像下面这样配置
import { defineConfig } from '@ice/app';
export default defineConfig(() => ({
dropLog: 'log',
}));
```
### compileDependencies