关于Vue3(vite)对项目的想法
这篇文章是关于Vue在正式成为默认版本后的理解
Vue + Vite的优点
Vue是渐进式框架,在Vue国内大🔥的情况下,衍生了很多UI库: Element UIopen in new window、Vant UIopen in new window等一些UI框架。
在昨天(2022年一月二十日)尤雨溪正式发布博客声明将在开年的第一天工作日进行一个vue
在npm
的默认版本变为3.x同时将要在文档和一些工具都将迁移到3.0时代,在beta
阶段我就尝试过将Vue3
上生产环境,并且取得了不错的效果,我在前不久尝试了一个想法,那就是利用Vite
+jsx
+VantUI
+Tailwindcss
开发了一款H5应用,在此之前我很推崇tailwindcss这种风格的原子css库,在tailwindcss的3.x版本之后立马就尝鲜了时下,在tailwindcss的2.1
之后受windcss启发推出来tailwindcss的JIT
模式并且在3.x成为既有功能。
废话不多说,我来个实际的例子
H5端对Vue3上生产的实际感官体验
由于公司内部有新的项目要启动,并且时间相对来说还算充分,并且用户体量并不大,我就采用了vite
+vue3
+jsx
+tailwindcss
+VantUI
+vue-router
+pinia
的方案, 原本以为tailwindcss在H5端的实际开发体验并不会太好,但是开发的时候发现了妙用!
首先是Vue3对ts支持比较大,并且支持了静态的eslint语法检测,原本计划用由于公司内部ts的使用基本为零的情况下,我退而求其次改为jsx
,并且采用了@antufuopen in new window的插件unplugin-auto-import
自动导入使用的函数、用unplugin-vue-components
进行组件的自动注册和css的按需导入,使用unplugin-icons
进行icon的按需导入,这样项目基础完成了
配置如下:
// vite.config.js
import {
defineConfig
} from 'vite'
import vue from '@vitejs/plugin-vue'
import VueJsx from '@vitejs/plugin-vue-jsx'
// import legacy from '@vitejs/plugin-legacy'
import AutoImport from "unplugin-auto-import/vite";
import IconsResolver from "unplugin-icons/resolver";
import Icons from "unplugin-icons/vite";
import Components from "unplugin-vue-components/vite";
import {
VantResolver
} from "unplugin-vue-components/resolvers";
export default defineConfig({
plugins: [
vue(),
// 兼容不兼容的问题
// legacy(),
VueJsx(),
AutoImport({
imports: ["vue", "vue-router", "pinia"],
resolvers: [VantResolver()],
}),
Components({
dirs: ["src/components"],
include: [/\.vue$/, /\.vue\?vue/, /\.jsx$/, /\.js$/],
resolvers: [
VantResolver({
importStyle: "less"
}),
IconsResolver(),
],
}),
Icons({
autoInstall: true,
}),
]
})
视口的适配我是用postcss插件postcss-pxtorem
做的
module.exports = {
plugins: {
'postcss-pxtorem': {
rootValue: 37.5,
propList: [
'*'
]
}
}
}
由于项目有自己的主题色,这里我对使用的tailwindcss进行了配置变更,增加了主题色的配置增减了部分配置如下
// tailwindcss.config.js
module.exports = {
content: [
'./index.html',
'./src/**/*.{vue,js,ts,jsx,tsx}'
],
theme: {
stroke: {
current: 'currentColor'
},
extend: {
colors: {
// 常规主题色
primary: '#ff6927'
}
}
}
}
下边是vue+vue-router+pinia用vite打包一个空项目(只有一个页面)的输出的文件(包含了响应式的修改font-size的代码)。其中的css的3kb为tailwindcss处理页面的复写的css样式,这部分是必不可少的。
打包出来的css部分代码
页面代码如下
下方为一个正常打包的项目的js
上便可以看到,jingbao.[hash].js
以及tabbar.[hash].js
内联的有小图片,其中内联了8张png,如下方的这张图所示,这部分的代码可以单独调整打包工具,将其不内联为base64
我展示的项目为一个大概12张页面的H5,总体的js是这样的,当然今天的重头戏不算是js的打包体积,其中Vue3的组合式API我会再行文一篇用来描述。
下文会详细描述关于原子样式库的css的打包体积。
当然项目优势不止如此,当你遇到某些页面很小的部分重复的时候,如果配合jsx页面渲染什么的直接导出来函数 类名自带 css不需要额外写 在自定义div会出现多个页面或者多个文件便利性出来了。当然要说直接写成组件更方便 但是很多小东西并不用写组件的!这时候jsx配合原子库的最优场景就来了,你直接将jsx部分包装成一个函数直接导出去,你需要考虑在写一次css吗?
不用!!!比如下方的场景
你有必要写两次吗?大可不必对吧!上代码
对于页面的只言片语的可以完美利用起来,有人说会让页面html过于冗余,那么这种导入这种是不是可以抹除这种劣势,甚至更省html更省css?
下方是个生产项目的示例
看起来会增加HTML的的冗余,过于复杂,原子化的魅力就在于语义化的类名,关于具体优劣仁者见仁智者见智,实践之后再有发言的权利。我有个配置好的Vite
+jsx
+VantUI
+Tailwindcss
空页面仓库,地址:空白项目地址open in new window。
对于UI组件库的思考
说到这里,如果配合自己公司自有组件库,组件库构造也用原子样式,这个css最后项目可以严格控制在20kb以内,项目越大体积的大小越明显的(小)。
我萌生了自己做个有几个组件实例的组件库demo 然后原子样式库,如果采用导入css想必css完整导入不需要10kb吧。如果预处理器导入,可以直接完整打包进项目中,和项目中css共用类名,即使你并不想和项目中的css混用,那么你可以阅读https://tailwindcss.com/docs/plugins#prefix-and-importantopen in new window, 用前缀用来和项目中的css隔离进行作用域分离!!!我虽然安利tailwindcssopen in new window, 并不是说肯定要用这个,这种思维真的不错的,css和项目中的css混合使用,使用统一规范,组件库的css类和项目中的css是不是可以实现某种化学反应?css会更小,在我想象中这个组件库(使用原子样式库规范)的项目,能够尽可能的压缩css减少带宽压力。这不就变相的为企业节省更多的 💰?求求你们不要再卷了,狗头保命!
写在文末
我实现了一个很基本的原子css库支撑的demo,仓库地址https://github.com/guoshuangyang/atom-uiopen in new window