vite 相关实践

正儿八经的用了vite+vue3+ts差不多一个月了,体验感很好,基本会用vue2+webpack的可以快速上手,非常方便,暂时做个记录。

vite和webpack比较

vite突出的就是快速,本地开发秒开,体验感非常好,vite开发环境依赖esbuild进行预构建,生产环境则依赖rollup进行打包,并且充分利用了现代浏览器的特性,比如http2ES modulevite是站在众多巨人肩膀上的一个产物, 类似webpack + webpack-dev-server的结合体,是一个非常棒的前端项目的构建工具。

<script type="module">中,浏览器遇到内部的import引用时,会自动发起http请求,去加载对应的模块。

vite也正是利用了ES module这个特性,使用vite运行项目时,首先会用esbuild进行预构建,将所有模块转换为es module,不需要对我们整个项目进行编译打包,而是在浏览器需要加载某个模块时,拦截浏览器发出的请求,根据请求进行按需编译,然后返回给浏览器。

这样一来,首次启动项目(冷启动)时,自然也就比webpack快很多了,并且项目大小对vite启动速度的影响也很小。

本地开发时,vite会直接请求vue文件,而不是经过打包之后的js文件

生产打包时,利用rollup打包,在vite.config.js中可以对build.rollupOptions打包进行优化

webpack打包为万物皆可打包,从配置文件入口,利用导入导出方法做配合,成为一个大bundle.

vite配置

vite有很多优化点都进行了内置,记录下目前用到的几个点: vite中经常需要和环境变量env打交道,简要记录下

json 复制代码
.env 默认加载
.env.development 开发环境
.env.production 生产环境
.env.test 自定义测试环境

// package.json

"scripts": {
  "dev": "vite", //默认对应development
  "build": "vite build", //默认对应production
  "build:test": "vite build --mode=test",
},
javascript 复制代码
export default defineConfig(({ mode }) => {
    const env = loadEnv(mode, process.cwd())
    const { VITE_APP_BASEURL,VITE_APP_OUTDIR } = env
    return {
        base: VITE_APP_BASEURL, // 开发或生产环境服务的公共基础路径
        plugins: [],
        resolve: {},
        css: {},
        build: {},
        server: { },
    }
})

1.将打包的index文件进行拆分,第三方包拆分出来

javascript 复制代码
// vite.config.js

const dependencies = require('./package.json').dependencies;

build: {
    minify: 'terser',
    terserOptions: {
        compress: {
            //生产环境时移除console
            drop_console: true,
            drop_debugger: true,
        },
    },
    rollupOptions: {
        treeshake: true, // 开启 Tree Shaking,消除未使用的代码,减小最终的包大小
        output: {
            // 根据不同的js库 拆分包,减少index.js包体积
            manualChunks(id) {
                if (id.includes('node_modules')) {
                    // 指定需要拆分的第三方库或模块
                    const dependenciesKeys = Object.keys(dependencies);
                    const match = dependenciesKeys.find((item) => {
                        return id.includes(item);
                    });
                    const notSplit = ['vue', 'ant-design-vue'];
                    if (match && !notSplit.includes(match)) {
                        return match;
                    }
                }
            },
        },
        commonjsOptions: {
            requireReturnsDefault: 'namespace', // 要求ES模块返回其名称空
        }
    },
    outDir: VITE_APP_OUTDIR,
},

2.复制一份public中的html文件,向其中注入变量

php 复制代码
// vite.config.js

import { createHtmlPlugin } from "vite-plugin-html";

plugins: [
    createHtmlPlugin({
        minify: false, // 是否压缩文件 默认true
        inject: {
            data: {
                path: VITE_APP_BASEURL // 注入变量pah
            },
        },
    })
  
],
xml 复制代码
// html文件

<script>
    document.write(
       '<script type="text/javascript" charset="utf-8" src="<%- path %>config.js?v=' +
          new Date().getTime() +
          '"></script>'
    )


</script>
相关推荐
认真学GIS4 分钟前
日尺度地下水水位!全国11897个地下水动态监测站点2005-2021年日尺度地下水水位(地下水埋深)(EXCEL格式)数据
服务器·前端·excel
_DoubleL4 分钟前
Volta启动项目自动切换Node版本
前端·node.js
阿里巴巴终端技术12 分钟前
[第 20 届 D2 倒计时] 7 大专场演讲、44 个精彩话题、D2 之夜畅聊 AI + 终端的发展前景
前端·人工智能·程序员
进击的雷神16 分钟前
前端路由动态渲染、JSON内嵌HTML清洗、展位信息数组化、分页参数固定化——尼日利亚展会爬虫四大技术难关攻克纪实
前端·爬虫·python·json
文心快码BaiduComate23 分钟前
Comate 4.0的自我进化:后端“0帧起手”写前端、自己修自己!
前端·后端·架构
cipher23 分钟前
Web3全栈学习与实战项目
前端·后端·区块链
冴羽25 分钟前
资深前端都在用的 9 个调试偏方
前端·javascript
左夕39 分钟前
深入理解Vue中的插槽:概念、原理与应用
前端·vue.js
我叫蒙奇40 分钟前
flex: 1 vs flex: auto 最通俗的解释
前端
兆子龙41 分钟前
万字解析 OpenClaw 源码架构:从入门到精通
前端·javascript