vite总结

vite这玩意相对于webpack来讲确实是打包速度更快,但是生态还没有webpack成熟,但是未来应该是有发展潜力的,所以这里来记录一下vite的相关知识。

官网:为什么选 Vite {#why-vite} | Vite中文网

一. vite和webpack的区别

为什么使用vite,其实最主要的原因就是打包速度更快。其原理是按需打包。

webpack支持多种导入格式,import和require,在开始编译之前会将他们都读一遍统一化为webpakc_require()。

而vite只支持es6的import,从而支持按需打包。

一个兼容性更强,一个更加快捷。

下图为区别示意。

 二. 初体验

yarn init 

yarn add vite -D

安装之后为了方便在json中配置script。

{
  "name": "vite",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "scripts": {
    "dev":"vite"
  },
  "devDependencies": {
    "vite": "^3.0.9"
  }
}

 三. vite预编译

vite在dev环境打包会将需要的模块预编译,例如将common.js转换为es6.

在pro环境打包,会全权交给rollup。

为了防止网络多包的情况,vite还会把多包引用集成到一个js中。 

四. vite 配置

1.基本配置

目录结构:

 vite.config.js

这里使用defineConfig 是为了获得语法提示,内部是做了ts。

这里主要是涉及到了环境变量的使用。

import { defineConfig, loadEnv } from "vite"
import viteBaseConfig from "./vite/vite.base.config"
import viteDevConfig from "./vite/vite.dev.config"
import viteProdConfig from "./vite/vite.prod.config"
//策略模式
const envResolver = {
    "build": () => ({ ...viteBaseConfig, ...viteDevConfig }),
    "serve": () => ({ ...viteBaseConfig, ...viteProdConfig })
}
//commond根据我们的指令会变成对应的值
export default defineConfig(({ command,mode }) => {
    //cwd用于返回node的工作进程 第三个参数默认值为.env 肯定解析
    //mode 为development 或 production
    //当mode为 xxx时会读取env.[xxx]进行解析,并且合并原来的env
    //vite会将环境变量注入到import.meta.eny中 这里我在index.js中打印
    //但是vite会先做一层拦截 防止隐私变量被直接注入,不是以vite开头就不会被直接注入
    //想要更改前缀可以在envPrefix配置
    const env=loadEnv(mode,process.cwd(),"")
    console.log(env,"@@@");
    return envResolver[command]()
})

修改前缀实例:在vite.base.config.js

import {defineConfig} from "vite"
export default defineConfig({
    optimizeDeps:{
        exclude:[]
    }
})

2. vite原理

实现简单的vite开发服务器

3. vite对css以及css模块化的处理

vite天生支持对css的处理。

原理就是vite读取入口文件时,会读到引用的css,将其添加到html的style标签里。

使用css模块化处理css样式冲突。

 使用方法

import add from "./count";
import "./style/base.css";
import demo1 from "./style/demo1.module.css"
console.log("index");
console.log(add(1, 3, 6, 2));
console.log(demo1);
let demo=document.createElement("div")
demo.className=demo1.demo1
document.body.appendChild(demo)

效果

 原理就是,凡是module.css,再塞到style里之前,将类名使用类名+hash替换,同时创建一个映射对象。

当使用less或者scss等使用的css预处理时。同样支持上面的模块化。

以less为例,安装less预处理。

yarn add less

后面操作一致。

css配置流程

import { defineConfig } from "vite"
export default defineConfig({
    optimizeDeps: {
        exclude: []
    },
    css: {
        //最终丢给postcss
        modules: {
            //用来配置css模块化映射对象是驼峰还是横线
            localsConvention: "camelCase",
            //配置module.css是模块还是全局 默认就是我们一开始的local
            //设置全局的化就不会加hash值
            scopeBehaviour: "local",
            //生成类名格式 下面是示例 也可以使用函数的形式自定义
            generateScopedName: "[name]_[local]_[hash:5]",
            //hash前缀
            // hashPrefix:"Ts",
            //不想参与模块化的路径 纯没用
            globalModulePaths:[]
        }
    }
})

配置css预处理器的全局参数和sourcemap

import { defineConfig } from "vite"
export default defineConfig({
    optimizeDeps: {
        exclude: []
    },
    css: {
        //最终丢给postcss
        modules: {
            //用来配置css模块化映射对象是驼峰还是横线
            localsConvention: "camelCase",
            //配置module.css是模块还是全局 默认就是我们一开始的local
            //设置全局的化就不会加hash值
            scopeBehaviour: "local",
            //生成类名格式 下面是示例 也可以使用函数的形式自定义
            generateScopedName: "[name]_[local]_[hash:5]",
            //hash前缀
            // hashPrefix:"Ts",
            //不想参与模块化的路径 纯没用
            globalModulePaths: []
        },
        //预处理器
        preprocessorOptions: {
            less: {
                math:"always",
                globalVars:{
                    //全局变量
                    mainColor:"pink"
                }
            },
            scss: {},
        },
        //css 的 sourcemap
        devSourcemap:true
    }
})

vite使用postcss

安装postcss预环境

npm i postcss-preset-env -D

在vite中使用

      postcss: {
            plugins: [postcssPresetEnv()]
        },

例子

编译前

.demo1{
    /* 设置宽度为30% 最小不小于100px 最大不大于200px */
    width: clamp(100px,30%,200px);
    height: 100px;
    background-color: red;
    user-select: none;
}

编译后效果

 4. vite对静态资源的处理

路径别名

    resolve: {
        //路径别名
        alias: {
            "@": path.resolve(__dirname)
        }
    },

vite在生产环境对静态资源的处理。

配置rollup构建策略

    build: {
        rollupOptions: {
            //配置rollup打包构建策略
            output: {
                //控制输出
                assetFileNames: "[hash].[name].[ext]"
            },
        },
        assetsInlineLimit: 4096000, //4000kb小于都打包为base64 大于就是静态
        // outDir: "", //输出目录
        assetsDir: "static", //静态资源目录
    }

5. vite插件使用

(1)自动别名插件

GitHub - Subwaytime/vite-aliases: Alias auto generation for Vite

生成例子

 使用就完全按照文档就好。

(2)动态修改html title

其实合webpack-html-plugin功能一样,但是大部分vite内部已经配置好了比如设置template。

https://github.com/vbenjs/vite-plugin-html

yarn add vite-plugin-html -D

使用也是对应文档即可。

(3)vite-plugin-mock

模拟数据

我用不上就不装了

(4)总结

插件使用

之前使用的插件

    plugins: [
        ViteAliases(),
        createHtmlPlugin({
            inject: {
                data: {
                    title: "666"
                }
            }
        })
    ],

plugin本身是附带很多api的

vite和vue差不多 也有插件中的生命周期钩子。

6. vite和ts

vite对于ts天生支持。

让ts错误展示在控制台

用来阻塞开发

使用 vite-plugin-checker

Getting Started | vite-plugin-checker

注意这个插件依赖于ts 所以要按照ts

npm i typescript

创建tsconfig.json

效果

 不管是打包还是开发过程都会直接语法报错,阻塞过程。

使用三斜线指令进行环境变量提示

/// <reference types="vite/client" />
interface ImportMetaEnv {
    readonly VITE_URL: string
}

这样就可以在其他地方的import.meta.env处出现属性提示。(在ts文件有效)

在ts里使用第三方包按模块引入可能会没有提示,这个就是按上面警告按照对应的ts类型提示就行。 

 7. vite性能优化

(1)开发方面的构建速度优化。

分包策略

分包是为了将不会经常变动的代码进行单独打包,为了防止浏览器不读缓存频繁请求。

例如我们不希望多次读取node_modules的文件

  build: {
        rollupOptions: {
            //配置rollup打包构建策略
            output: {
                //控制输出
                assetFileNames: "[hash].[name].[ext]",
                //配置分包
                manualChunks:(id)=>{
                    if(id.includes("node_modules")){
                        return "vendor"
                    }
                }
            },
        },
        assetsInlineLimit: 4096000, //4000kb小于都打包为base64 大于就是静态
        // outDir: "", //输出目录
        assetsDir: "static", //静态资源目录
        emptyOutDir: true, //清除输出目录
        minify:false,//是否压缩代码
    }

那么最后生成的文件就会是这样

(2)页面性能指标  fcp首屏渲染时间   lcp最大元素时长。

<think>嗯,用户让我介绍一下Vite,我需要先回忆一下Vite的相关知识。Vite是一个前端构建工具,对吧?它是由Vue.js的作者尤雨溪开发的,主要特点是速度快,尤其是在开发服务器启动和热更新方面。我记得它利用了浏览器原生ES模块导入的特性,所以不需要打包,直接按需加载,这样开发环境下的启动速度特别快。 接下来要组织一下回答的结构。用户可能需要知道Vite是什么,核心优势,使用场景,基本用法,还有可能和Webpack这样的传统工具对比。不过用户没有明确说要对比,可能先重点介绍Vite本身。 用户可能对Vite的优势比较感兴趣,比如快速的冷启动、即时热模块替换(HMR)、支持多种框架如Vue、React、Svelte等。另外,生产环境构建方面,Vite使用Rollup,这也是一个优势,因为Rollup在打包方面效率很高。 可能需要提到Vite的插件生态系统,虽然相比Webpack可能还不够丰富,但正在快速发展。还有Vite的配置相对简单,对新手友好,这也是一个卖点。 然后,用户可能想知道如何开始使用Vite,所以需要给出一个简单的示例,比如创建项目的命令,以及目录结构和基本配置。可能还要提到vite.config.js这个配置文件,以及如何通过插件扩展功能。 还要注意用户可能的背景,比如是否是前端开发者,是否熟悉现有的构建工具。如果用户之前用过Webpack,可能会关心迁移到Vite的难易程度,或者Vite解决了哪些痛点。不过用户的问题只是介绍,所以可能不需要深入比较,但简要提一下差异还是有帮助的。 另外,用户可能关心Vite适合什么样的项目,比如单页应用(SPA)、库开发,或者是否需要特定的框架支持。可以提到Vite默认支持TypeScript、CSS预处理器等,这些都是现代前端开发的常见需求。 需要确认一下最新的Vite版本是否有新特性,比如是否支持SSR(服务器端渲染)或者其他的优化。不过作为一般介绍,可能不需要太深入,保持基础信息准确即可。 最后,可能需要给出一些资源链接,比如官方文档,或者社区推荐的插件,但用户的问题里没有要求,所以可能不需要,但可以建议查阅官方文档获取更多信息。 总结一下,回答的结构应该是:定义、核心优势、适用场景、基本用法、简单示例,可能的话,加上生态系统和配置说明。确保用中文,口语化,避免技术术语堆砌,但必要的术语需要解释清楚。</think>Vite 是一款**现代化前端构建工具**,由 Vue.js 作者尤雨溪主导开发,专注于提升开发体验和构建效率。以下是其核心特性和使用场景的详细介绍: --- ### **一、核心优势** 1. **闪电般的启动速度** - 利用浏览器原生支持的 **ES Modules**(ESM),开发服务器无需打包整个项目,实现**按需编译**。 - 冷启动时间通常**秒级完成**,尤其适合大型项目。 2. **即时热更新(HMR)** - 模块热替换速度极快,修改代码后几乎**无感知刷新**,保持应用状态不丢失。 3. **开箱即用的功能** - 内置对 **TypeScript、CSS 预处理器(Sass/Less)、PostCSS** 的支持。 - 默认支持 **JSX、Vue、React、Svelte** 等多种框架。 4. **高效的生产构建** - 生产环境使用 **Rollup** 进行打包,自动优化代码(如 Tree-shaking、代码分割)。 --- ### **二、适用场景** - **单页应用(SPA)**:快速原型开发或企业级项目。 - **库开发**:轻量级构建,生成多种格式的模块(ESM、CommonJS)。 - **多框架支持**:Vue、React、Lit 等均可无缝集成。 --- ### **三、基础使用** 1. **创建项目** ```bash # 使用 npm npm create vite@latest # 选择框架(如 Vue/React)和模板 ``` 2. **目录结构** ``` my-project/ ├─ src/ │ ├─ main.js # 入口文件 ├─ public/ # 静态资源 ├─ vite.config.js # 配置文件 ``` 3. **常用命令** ```bash npm run dev # 启动开发服务器 npm run build # 构建生产版本 npm run preview # 本地预览生产构建 ``` --- ### **四、配置示例(`vite.config.js`)** ```javascript import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' export default defineConfig({ plugins: [vue()], server: { port: 3000, // 自定义端口 open: true // 自动打开浏览器 }, build: { minify: 'terser' // 代码压缩方式 } }) ``` --- ### **五、与传统工具(如 Webpack)对比** | **特性** | Vite | Webpack | |----------------|--------------------------|-----------------------| | **启动速度** | 极快(按需编译) | 较慢(全量打包) | | **HMR 速度** | 毫秒级 | 依赖项目规模 | | **配置复杂度** | 简单,约定大于配置 | 复杂,需手动配置 | | **生产构建** | Rollup(高效但插件较少) | 自研生态(插件丰富) | --- ### **六、生态系统** - **官方插件**:支持 Vue、React、Lit 等框架。 - **社区插件**:如 `vite-plugin-pwa`(PWA 支持)、`unplugin`(统一插件格式)。 --- 如果你需要进一步探索,可以参考 [Vite 官方文档](https://vitejs.dev/),其设计哲学是**“为开发者提供更愉悦的体验”** 🚀。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值