关于我写了一个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
        }
    }
}


目录
相关文章
|
3月前
|
前端开发
Vite——如何配置使用sass
Vite——如何配置使用sass
224 0
|
6月前
|
缓存 前端开发 JavaScript
Vite详解
Vite详解
111 3
|
前端开发 JavaScript 开发者
Vite前端构建工具详解
Vite 是一款新兴的前端构建工具,它的出现带来了前端开发体验的革命性变化。本文将介绍 Vite 的基本概念和核心特性,并通过代码实例来演示其强大功能。
182 0
|
2月前
|
JavaScript
在vue3中(vite)引入unocss,安装配置unocss
在vue3中(vite)引入unocss,安装配置unocss
|
19天前
|
JavaScript 前端开发
将 Babel 插件应用于实际项目中
【10月更文挑战第25天】如果在应用插件过程中出现问题,可以检查 Babel 配置是否正确、插件的依赖是否安装完整、构建工具的集成是否正确等,逐步排查和解决问题。通过以上步骤,就可以将 Babel 插件成功应用到实际项目中,实现特定的代码转换和功能增强。
|
1月前
|
资源调度 JavaScript 前端开发
如何实现一个类似 vite 的脚手架并发布 npm
本文介绍了如何实现一个类似 Vite 的脚手架工具。通过详细解析和实践,文章分享了从零开始构建脚手架的过程,包括技术选型、开发步骤及发布 NPM 包的完整流程。最终目标是让用户能够通过 `yarn create electron-prokit myapp` 快速搭建 Electron 项目。项目源码可在 GitHub 上获取。
23 5
|
2月前
|
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,可在其他项目中引入使用。
|
3月前
|
资源调度 JavaScript 索引
Vue2开发插件并发布到npm
这篇文章介绍了如何使用Vue 3、TypeScript和Vite开发一个下拉框组件`vue-amazing-selector`,并将其发布到npm,包括了项目的创建、组件开发、配置webpack、编写组件代码、导出组件、编译、npm包初始化、发布流程以及在项目中使用该插件的完整步骤。
Vue2开发插件并发布到npm
|
3月前
|
JavaScript 前端开发
什么是前端构建工具?vite和vite脚手架的关系!
【8月更文挑战第1天】前端构建工具简析
84 4
|
4月前
|
JavaScript
Vite 项目中如何去集成 Sass
Vite 项目中如何去集成 Sass
62 0