71 lines
2.2 KiB
JavaScript
71 lines
2.2 KiB
JavaScript
/*
|
||
* @Author: 系统生成
|
||
* @Date: 2025-01-XX
|
||
* @Description: 移除 console 插件 - 在生产环境构建时移除所有 console 语句
|
||
*/
|
||
|
||
export default function createRemoveConsole() {
|
||
return {
|
||
name: 'remove-console',
|
||
enforce: 'post',
|
||
apply: 'build', // 只在构建时应用
|
||
transform(code, id) {
|
||
// 只处理 JS/TS/Vue 文件
|
||
if (!/\.(js|ts|vue)$/.test(id)) {
|
||
return null
|
||
}
|
||
|
||
// 移除 console.log, console.warn, console.info, console.debug
|
||
// 保留 console.error(错误日志在生产环境也应该保留)
|
||
|
||
// 匹配 console.xxx() 调用,支持多行参数
|
||
// 使用更精确的正则,匹配括号内的内容(包括嵌套括号)
|
||
const removeConsolePattern = (method) => {
|
||
// 匹配 console.method(...) 或 console.method(...);
|
||
// 支持单行和多行,处理嵌套括号
|
||
const pattern = new RegExp(
|
||
`console\\.${method}\\s*\\([^()]*(?:\\([^()]*(?:\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*;?`,
|
||
'g'
|
||
)
|
||
return pattern
|
||
}
|
||
|
||
const methodsToRemove = ['log', 'warn', 'info', 'debug', 'group', 'groupEnd', 'table']
|
||
|
||
let transformedCode = code
|
||
|
||
// 更简单但更可靠的方法:逐行处理
|
||
const lines = transformedCode.split('\n')
|
||
const processedLines = lines.map(line => {
|
||
let processedLine = line
|
||
|
||
// 对于每个要移除的方法
|
||
methodsToRemove.forEach(method => {
|
||
// 匹配 console.method(...) 或 console.method(...);
|
||
// 使用更简单的模式,匹配到行尾或分号
|
||
const pattern = new RegExp(`console\\.${method}\\s*\\([^)]*\\)\\s*;?`, 'g')
|
||
processedLine = processedLine.replace(pattern, '')
|
||
})
|
||
|
||
return processedLine
|
||
})
|
||
|
||
transformedCode = processedLines.join('\n')
|
||
|
||
// 清理空行(可选,保持代码整洁)
|
||
// transformedCode = transformedCode.replace(/^\s*\n/gm, '')
|
||
|
||
// 如果代码有变化,返回转换后的代码
|
||
if (transformedCode !== code) {
|
||
return {
|
||
code: transformedCode,
|
||
map: null
|
||
}
|
||
}
|
||
|
||
return null
|
||
}
|
||
}
|
||
}
|
||
|