useConsole的封装,vue,react,htmlscript标签,通用

之前用了接近hack的方式实现了console的封装,目标是获取console.log函数的执行(调用栈所在位置)所在的代码行数。

例如以下代码,执行window.mylog(1)时候,console.log实际是在匿名的箭头函数()=>{//这里执行的}

复制代码
const mylog = (...arg) => console.log(...arg)
mylog("window.mylog")

如果代码改为以下,

复制代码
const mylog2={
    log:console.log
}
mylog2.log("test")

因为log返回的是conosle.log本身,并且它并没有在函数内执行,这里理解把console.log这个函数的内存地址赋值给mylog2.log,执行mylog2.log就是执行console.log

调试1

用谷歌调试工具,断点来查看演示上面效果:

mylog:

mylog2:

再次调试:

代码:

复制代码
const mylog = () => {
    return {
        logx: (...arg) => {
            return console.log(...arg)
        }
    }
}

const mylog2 = () => {
    return {
        logx: console.log
    }
}

const MyLog = mylog();
const MyLog2 = mylog2();
MyLog.logx("window.mylog")
MyLog2.logx("window.mylog2")

效果:

调试:

结果:

mylog.logx执行的函数就是logx,而mylog2.logx执行的是console.log函数

封装hooks

复制代码
const useConsole = function (...arg) {
    window.console.log("outside", this)
    return {
        log: window.console.log,
        warn: window.console.log,
    }
}

使用:

复制代码
const Console = useConsole();
Console.log(111, 6666, 222)
Console.warn(111, 6666, 222)
Console.test(111, 6666, 222)

上面代码,vue,react,和script标签内都适用

弊端

打包发布时候,压缩代码插件无法移除Console.log或者Console.warn,需要手动配置,例如uglifyjs-webpack-plugin 就是配置pure_funcs属性

复制代码
//  引入uglifyjs-webpack-plugin
const UglifyPlugin = require('uglifyjs-webpack-plugin')
 
module.exports = {
    configureWebpack: (config) => {
         let optimization = {
            minimizer: [new UglifyPlugin({
              // 删除console
                uglifyOptions: {
                    parallel: true,
                    warnings: false,
                    compress: {
                      drop_console: false, //是否清除所有console
                      drop_debugger: true,//是否清除debugger
                      pure_funcs: ['Console.log','Console.warn'] //drop_console 设置false,需要特殊清除的
                    }
                }
             })]
          }
          Object.assign(config, {
            optimization
          })
    }
}
相关推荐
阳火锅10 小时前
💡 告别类名地狱!Tailwind CSS 语义化转换神器来了
前端·css·vue.js
用户1257585243611 小时前
XYGo Admin 即时通讯与异步任务实战:WebSocket 长连接 + 消息队列驱动后台处理
vue.js
PBitW11 小时前
组件封装注意事项
前端·vue.js
i220818 Faiz Ul12 小时前
高校教务|教务管理|基于springboot+vue的高校教务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·高校教务系统
漂移的电子13 小时前
【el-tree】外层多选,某个属性内层单选
前端·javascript·vue.js
sheeta199815 小时前
Vue 前端基础笔记
前端·vue.js·笔记
前端那点事15 小时前
别再写垃圾组件!Vue3 如何设计「真正可复用」的高质量通用组件
前端·vue.js
SwJieJie16 小时前
Day1 从 0 搭建 VueDemo Web Admin 项目环境:技术栈、插件链与自动化脚本全解析
前端·vue.js·学习
xuankuxiaoyao16 小时前
Vue.js 插槽、作用域插槽、商品、阶段案例
android·vue.js·flutter
EF@蛐蛐堂16 小时前
TanStack NPM攻击 揭秘及应对方案
前端·vue.js·npm·安全威胁分析