关于我写了一个vite插件那些事

简介: 在我们开发的过程中有开发模式和生产模式,那有些测试代码会在开发模式的时候使用,在生产环境要删掉,一般是手动删除,另一种就是判断环境变量,但是环境变量不好处理template代码以及css代码,为此我写了一个插件将解决以上问题。

image.png


为什么要写这个插件 解决了什么问题


在我们开发的过程中有开发模式生产模式,那有些测试代码会在开发模式的时候使用,在生产环境要删掉,一般是手动删除,另一种就是判断环境变量,但是环境变量不好处理template代码以及css代码,为此我写了一个插件将解决以上问题。


插件文档 插件下载地址 开源地址


npm 地址 www.npmjs.com/package/vit…

插件下载地址

npm i vite-plugin-isdev


开源地址 github.com/message163/…


插件用法


安装插件 npm i vite-plugin-isdev


vite.config.ts 引入


import comments from 'vite-plugin-isdev'
//plugins注册插件
plugins: [vue(),comments({
    prefix:"xm",
    debugger:false
})],


接受两个配置项


1.prefix 自定义前缀 默认dev


2.debugger 调试该插件是否生效 生效可以看到<!--条件注释-->这一段代码 false则看不到默认false


使用条件注释语法


在template 里面使用 <!--if-dev--> 被包裹的代码将会在生产环境删除 <!--#end-dev-->


在script tsx ts less 使用 //#if-dev//#end-dev


tips 注意如果你设置了自定义前缀例如我上面设置了xm 那代码就应该是这样子 <!--if-xm--><!--#end-xm--> 不设置默认为 dev


案例演示


开发环境dev


<template>
    <div>
        <div>扰乱</div>
        <!--#if-xm-->
        <div>dev1</div>
        <div>dev2</div>
        <!--#end-xm-->
    </div>
    <h2>
        <!--#if-xm-->
        <div>dev</div>
        <!--#end-xm-->
    </h2>
   <xxxx></xxxx>
</template>
<script lang="ts" setup>
import random from "random-words"
import xxxx from './App'
console.log(123)
const a = random(5)
//#if-xm
var b = "__dev__"
//#end-xm
console.log('动次打次')
//#if-xm
console.log(a)
//#end-xm
</script>
<style lang="less">
//#if-xm
body{
   background: red;
}
//#end-xm
</style>
<style scoped>
div{
    color:white
}
</style>


编译之后的代码 生产环境


<template>
    <div>
        <div>扰乱</div>
    </div>
    <h2>
    </h2>
   <xxxx></xxxx>
</template>
<script setup lang='ts' >
import random from "random-words"
import xxxx from './App'
console.log(123)
const a = random(5)
console.log('动次打次')
</script>
<style  lang='less'>
</style>
<style scoped >
div{
    color:white
}
</style>


源码演示


import type { Plugin } from 'vite'
import { parse } from '@vue/compiler-sfc'//vue 处理sfc 的专用库
import type { SFCStyleBlock, SFCScriptBlock } from '@vue/compiler-sfc' //sfc 类型
import { Options, ScriptCode, StyleBlocks } from './type' //类型
let nodeEnv; //当前环境
export default function comments(options: Options = { prefix: "dev", debugger: false}): Plugin {
    //处理template
    const tempReg = new RegExp(`<!--#if-${options.prefix}-->(.*?)<!--#end-${options.prefix}-->`, 'igs');
    const replaceTemplate = (code: string): string => {
        return code.replace(tempReg, options.debugger ? '<!--条件注释template-->' : '');
    }
    const scriptOrStyleOrTsReg = new RegExp(`//#if-${options.prefix}(.*?)//#end-${options.prefix}`, 'igs');
    //处理script
    const replaceScript = (code: SFCScriptBlock): ScriptCode => {
        return {
            content: code.content.replace(scriptOrStyleOrTsReg, options.debugger ? '//条件注释js' : ''),
            setup: code.setup,
            lang: code.lang
        }
    }
    //style 可以有多个
    const replaceStyle = (codes: SFCStyleBlock[]): StyleBlocks[] => {
        return codes.map(style => ({
            content: style.content.replace(scriptOrStyleOrTsReg, options.debugger ? '//条件注释css' : ''),
            scoped: style.scoped,
            lang: style.lang,
            attr: style.attrs
        }))
    }
    //最后重新生成template
    const AssemblyCode = (temp, script: ScriptCode, style: StyleBlocks[]) => {
        let str = ``;
        str += `<template>${temp}</template>\n`;
        str += `<script ${script?.setup ? 'setup' : ''} ${script?.lang ? 'lang=' + `'${script.lang}'` : ''} >${script.content}</script>\n`;
        style.forEach(style => {
            str += `<style ${style?.scoped ? 'scoped' : ''} ${style?.lang ? 'lang=' + `'${style.lang}'` : ''}>${style.content}</style>\n`
        })
        console.log(str)
        return str;
    }
    //处理ts
    const replaceTsOrTsx = (code: string) => {
        return code.replace(scriptOrStyleOrTsReg, options.debugger ? '//条件注释ts' : '')
    }
    return {
        name: "vite-plugin-vue-comments",
        enforce: "pre",
        config(this, config, env) {
            nodeEnv = env //获取环境
        },
        transform(code, id) {
            //code 就是代码  id就是文件路径
            if (/.vue$/.test(id)) {
                const { descriptor } = parse(code)
                const temp = descriptor.template?.content
                const script = descriptor?.scriptSetup;
                const styles = descriptor?.styles
                if(temp && script && styles){
                    const tempCode = replaceTemplate(temp)
                    const scriptCode = replaceScript(script)
                    const styleCode = replaceStyle(styles)
                    const template = AssemblyCode(tempCode, scriptCode, styleCode)
                    return nodeEnv.mode == 'development' ? code :  template
                }else{
                    return code
                }
            }
            //处理ts文件
            if (/.ts$/.test(id)) {
                return nodeEnv.mode == 'development' ? code : replaceTsOrTsx(code)
            }
            //处理tsx文件
            if(/.tsx$/.test(id)){
               return nodeEnv.mode == 'development' ? code : replaceTsOrTsx(code)
            }
            return code
        }
    }
}


目录
相关文章
|
安全 虚拟化
GIC规格学习(一)
GIC规格学习(一)
620 0
|
安全 关系型数据库 MySQL
CentOS8 安装 MySQL8.0(RPM)
环境:Linux centos8 4.18.0-80.el8.x86_64、Mysql8.0.18
9005 0
|
Web App开发 Rust JavaScript
webRTC 实现人脸识别
webRTC主要是帮我们处理多媒体应用,如音视频通话,屏幕共享都可以实现,主要基于浏览器API调用,其底层浏览器会调用native C++ 等一些库帮我们实现的,而我们在应用层掉API 即可。
490 0
webRTC 实现人脸识别
|
算法 数据库 数据安全/隐私保护
摘要认证,使用HttpClient实现HTTP digest authentication
这篇文章提供了使用HttpClient实现HTTP摘要认证(digest authentication)的详细步骤和示例代码。
1089 2
|
Web App开发 存储 JavaScript
浏览器之性能指标-TTI
浏览器之性能指标-TTI
466 0
|
小程序 前端开发 算法
|
存储 前端开发 安全
Nuxt3 实战 (十):使用 Supabase 实现 RESTful 风格 API 接口
这篇文章介绍了如何使用Supabase实现RESTful风格的API接口,用于网站分类和子站点的增删改查(CURD)功能。文章首先阐述了表设计,包括ds_categorys和ds_websites两张表的列名、类型和用途,并提到了为每张表添加的user_id和email字段以支持用户身份识别。接着,文章描述了接口设计,以ds_websites表为例,说明了如何通过RESTful API实现CURD功能,并给出了使用SupabaseClient实现插入数据的相关代码。文章最后提供了项目效果预览和总结,指出学习了Nuxt3创建接口及调用Supabase数据库操作。
429 0
Nuxt3 实战 (十):使用 Supabase 实现 RESTful 风格 API 接口
|
JavaScript 开发工具
vite如何打包vue3插件为JSSDK
【9月更文挑战第10天】以下是使用 Vite 打包 Vue 3 插件为 JS SDK 的步骤:首先通过 `npm init vite-plugin-sdk --template vue` 创建 Vue 3 项目并进入项目目录 `cd vite-plugin-sdk`。接着,在 `src` 目录下创建插件文件(如 `myPlugin.js`),并在 `main.js` 中引入和使用该插件。然后,修改 `vite.config.js` 文件以配置打包选项。最后,运行 `npm run build` 进行打包,生成的 `my-plugin-sdk.js` 即为 JS SDK,可在其他项目中引入使用。
737 6
|
安全 API
Vue3 proxy 解决跨域
jsonp 这种方式在之前很常见,他实现的基本原理是利用了HTML里script元素标签没有跨域限制 动态创建script标签,将src作为服务器地址,服务器返回一个callback接受返回的参数
738 0
Vue3 proxy 解决跨域
|
JavaScript 开发者 内存技术
修改npm源--多种方式
修改npm源--多种方式
6878 0

热门文章

最新文章