当前位置: 首页 > news >正文

网站与微信结合汕头网站建设公司

网站与微信结合,汕头网站建设公司,点击一个网站跳转到图片怎么做的,台前网站建设公司写一个vite插件去除代码中的console 使用babel做处理。简单处理,复杂情况未考虑。 学习babel写的demo。 项目根目录新建文件 babel-plugin-remove-console.js rollup-plugin-remove-console.js babel-plugin-remove-console.js import { declare } from babel/he…

写一个vite插件去除代码中的console

使用babel做处理。简单处理,复杂情况未考虑。
学习babel写的demo。

项目根目录新建文件
babel-plugin-remove-console.js
rollup-plugin-remove-console.js

在这里插入图片描述

babel-plugin-remove-console.js

import { declare } from '@babel/helper-plugin-utils';const removeConsolePlugin = declare((api, options, dirname) => {api.assertVersion(7);return {visitor: {CallExpression(path) {// 检查是否是console.method()调用const { callee } = path.node;if (callee.type === 'MemberExpression' &&callee.object.type === 'Identifier' &&callee.object.name === 'console' &&callee.property.type === 'Identifier') {// 如果是独立语句 (ExpressionStatement),直接移除整个语句if (path.parent.type === 'ExpressionStatement') {path.parentPath.remove();}// 否则,替换为undefined (避免语法错误)else {path.replaceWith(api.types.identifier('undefined'));}return;}},},};
});export default removeConsolePlugin;

为什么要处理这些呢

 callee.type === 'MemberExpression' &&callee.object.type === 'Identifier' &&callee.object.name === 'console' &&callee.property.type === 'Identifier'

在https://astexplorer.net/ 可以尝试下
在这里插入图片描述

当然也可以写成这样

 visitor: {MemberExpression(path){if(path.node.object.name=='console'){console.log(path.parentPath.node)path.parentPath.remove();}}},

rollup-plugin-remove-console.js

import { createFilter } from '@rollup/pluginutils';
import { transformFromAstSync } from '@babel/core';
import parser from '@babel/parser';
import removeConsolePlugin from './babel-plugin-remove-console';
export default function myPlugin(pluginOptions = {}) {const defaultExclude = /node_modules/;// 如果用户提供了exclude选项,合并默认排除const excludePattern = pluginOptions.exclude? [defaultExclude, pluginOptions.exclude]: defaultExclude;const filter = createFilter(pluginOptions.include || /\.(js|ts|jsx|tsx|vue)$/,excludePattern);return {name: 'rollup-plugin-remove-console',transform(src, id) {if (!filter(id)) {return null;}const ast = parser.parse(src, {sourceType: 'unambiguous',});const { code, map } = transformFromAstSync(ast, src, {plugins: [[removeConsolePlugin]],});return {code,map, // 或者提供一个 sourcemap 对象};},};
}

vite.config.js引入使用

在这里插入图片描述
如果你使用了多个插件,需要把自己定义的这个去除插件放到最后面,等其他代码都转换完毕后,只需要处理js语法即可。
比如我们这里引入了vuejsx,支持vuejsx语法。
在这里插入图片描述

他是怎么处理的呢。
一般vue编译的时候,会把vue文件中的,样式,模版,脚本拆分。
在这里插入图片描述

我这里的jsx写法,所以是lang.jsx
在这里插入图片描述
经过vue,vuejsx插件的加工后,成了这样
在这里插入图片描述
所以我们只需要考虑console本身即可。

扩展

忽略某些

增加配置来处理,如,我们可以配置console的哪些方法不移除或者哪些方法移除。
在这里插入图片描述
在vite插件中,将pluginOptions传递给babel插件,这里文件名起的是rollup-plugin-remove-console.js因为没用到vite的特性hooks所以也支持rollup(按理来说,不过没有测试)。

在这里插入图片描述
在这里插入图片描述
可以看到传递过来的参数。
在这里插入图片描述

怎么获取是log还是warn还是error呢。
在这里插入图片描述

在这里插入图片描述
所以要获取下 const name = path.node.property.name;

import { declare } from '@babel/helper-plugin-utils';
const removeConsolePlugin = declare((api, options, dirname) => {api.assertVersion(7);const ignores = options.ignore || [];return {visitor: {MemberExpression(path) {if (path.node.object.name == 'console') {const name = path.node.property.name;const isIgnore = ignores.includes(name);if (!isIgnore) {path.parentPath.remove();}}},},};
});export default removeConsolePlugin;

或者

import { declare } from '@babel/helper-plugin-utils';
const removeConsolePlugin = declare((api, options, dirname) => {api.assertVersion(7);const ignores = options.ignore || [];return {visitor: {CallExpression(path) {// 检查是否是console.method()调用const { callee } = path.node;if (callee.type === 'MemberExpression' &&callee.object.type === 'Identifier' &&callee.object.name === 'console' &&callee.property.type === 'Identifier') {const name = callee.property.name;const isIgnore = ignores.includes(name);if (!isIgnore) {// 如果是独立语句 (ExpressionStatement),直接移除整个语句if (path.parent.type === 'ExpressionStatement') {path.parentPath.remove();}// 否则,替换为undefined (避免语法错误)else {path.replaceWith(api.types.identifier('undefined'));}}}},},};
});export default removeConsolePlugin;

在这里插入图片描述

替换

比如我们有这样两个个函数。上报数据,上报异常。
在这里插入图片描述
假设,在开发环境我们不需要上报,也就是开发环境不替换,一般也是开发环境不替换。
我们需要在插件运行前获取环境
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
传递给babel插件
在这里插入图片描述
当然其实这一步不用,你可以在babe插件里面直接获取。
在babel插件里面接收下。在这里插入图片描述

如果不是开发环境就执行插件。
在这里插入图片描述
或者我们简单点。

在vite插件中直接不往下走了,不执行babel插件了。
在这里插入图片描述
然后继续完善替换的逻辑。
假设我们的插件是这样传递参数的。
在这里插入图片描述
babel获取下
在这里插入图片描述

替换的逻辑为
当匹配上的时候,把原先的参数带进去,再额外携带一个文件的信息。

在这里插入图片描述

source为来源。
在这里插入图片描述
source大概这样
在这里插入图片描述
然后我们看下效果。
开发环境
在这里插入图片描述

build后
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

完整代码

rollup-plugin-remove-console.js

rollup-plugin-remove-console.js

import { createFilter } from '@rollup/pluginutils';
import { transformFromAstSync } from '@babel/core';
import parser from '@babel/parser';
import removeConsolePlugin from './babel-plugin-remove-console';
export default function myPlugin(pluginOptions = {}) {const defaultExclude = /node_modules/;let isDev = false;// 如果用户提供了exclude选项,合并默认排除const excludePattern = pluginOptions.exclude? [defaultExclude, pluginOptions.exclude]: defaultExclude;const filter = createFilter(pluginOptions.include || /\.(js|ts|jsx|tsx|vue)$/,excludePattern);// console.log(pluginOptions);return {name: 'rollup-plugin-remove-console',options(inputOptions) {isDev = process.env.NODE_ENV === 'development';console.log('isDev', isDev);return inputOptions;},transform(src, id) {if (!filter(id) || isDev) {return null;}const ast = parser.parse(src, {sourceType: 'unambiguous',});const paths = id.split('/');const source = paths[paths.length - 1];console.log(source);const { code, map } = transformFromAstSync(ast, src, {plugins: [[removeConsolePlugin, { ...pluginOptions, source, isDev }]],});return {code,map, // 或者提供一个 sourcemap 对象};},};
}

babel-plugin-remove-console.js

babel-plugin-remove-console.js

import { declare } from '@babel/helper-plugin-utils';
import { types as t } from '@babel/core';const removeConsolePlugin = declare((api, options, dirname) => {api.assertVersion(7);const ignores = options.ignore || [];const replaceList = options.replaceList || [];const source = options.source;let isDev = process.env.NODE_ENV == 'development';if (typeof options.isDev != 'undefined') {isDev = options.isDev;}return {visitor: {MemberExpression(path) {if (path.node.object.name == 'console' && !isDev) {const name = path.node.property.name;const replaceItem = replaceList.find((item) => item[0] === name);if (replaceItem) {const replaceName = replaceItem[1];if (!replaceName) {console.warn('请配置替换的函数');}if (replaceList.length > 0) {const args = path.parentPath.node.arguments;const loggerCall = t.callExpression(t.identifier(replaceName), [...args,t.stringLiteral(source),]);loggerCall.isDone = true;path.parentPath.replaceWith(loggerCall);}}const isIgnore = ignores.includes(name);if (!isIgnore) {path.parentPath.remove();}}},},};
});export default removeConsolePlugin;

vite.config.js

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import rollupPluginRemoveConsole from './rollup-plugin-remove-console.js';
import vueJsx from '@vitejs/plugin-vue-jsx';// https://vite.dev/config/
export default defineConfig({//plugins: [vue(),vueJsx(),rollupPluginRemoveConsole({ignore: ['log', 'error'],replaceList: [['log', 'uploadLog'],['error', 'uploadError'],],}),],base: './',server: {proxy: {'/api': {target: 'http://localhost:3000/',changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, ''),},},},
});

main.js

import { createApp } from 'vue';
import './style.css';
import App from './App.vue';const upData = (type, args) => {fetch(`/api/${type}`, {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify(args),});
};window.uploadLog = (...args) => {upData('log', args);
};
window.uploadError = (...args) => {upData('error', args);// fetch
};createApp(App).mount('#app');
http://www.shuangfujiaoyu.com/news/30232.html

相关文章:

  • 东莞网站推广流程重庆seo搜索引擎优化优与略
  • php可以做移动端网站简述seo的概念
  • php 搭建手机网站最近几天的重大新闻事件
  • 做面食的网站win7优化极致性能
  • 做用户名验证的网站服务器优化公司流程制度
  • 怎么制作网站栏目页主页北京百度快速排名
  • 做网站投广告攻略谷歌怎么推广自己的网站
  • 第二季企业网站开发php中文网太原网站优化公司
  • 上海做公益活动有哪些好的网站搜索引擎优化课程总结
  • 哪个公司制作网站好深圳互联网营销
  • html5 微信网站主流开发技术标准百度推广seo效果怎么样
  • 直播网站网站链接提交
  • 工业设计网站导航seo网络营销技术
  • 网站上的信息可以做证据吗网络优化基础知识
  • 为什么要进行网络整合营销?网络优化推广公司哪家好
  • 房地产网站广告销售怎么做余姚seo智能优化
  • 做网站的工作量百度推广的步骤
  • 上饶市建设局官方网站最好的推广平台是什么软件
  • 南京最新通告今天太原关键词优化服务
  • 网站开发能自学吗百度一下你就知道了百度
  • 刚察网站建设公司新网站怎么推广
  • 学做网站论坛VIP怎么样怎样注册网站
  • 网站的优化策略方案汕头seo按天付费
  • 网站手机版二维码怎么做自己建站的网站
  • 哪些网站有web做昆明seo关键词排名
  • 邢台搜seo内链优化
  • php可以做动态网站吗官网优化哪家专业
  • 天津在线网页制作报价宁波seo网络推广多少钱
  • 那些网站反爬做的好今日新闻最新头条10条摘抄
  • 装修效果图网站推荐济南百度竞价代运营