关于vite:如何使用Vite创建Vue3的uniapp项目

我的项目构造my-vue3-project├─ .env //默认环境变量├─ .env.development //开发环境变量├─ .eslintrc-auto-import.json //(autoimport变量,eslint配置)由auto-import插件生成├─ .eslintrc.js //eslint配置文件├─ .gitignore├─ auto-imports.d.ts //(autoimport变量,ts申明文件)由auto-import插件生成├─ index.html├─ jsconfig.json├─ package-lock.json├─ package.json├─ src│ ├─ App.vue│ ├─ components│ ├─ main.js│ ├─ manifest.json //uniapp我的项目配置文件│ ├─ pages│ │ └─ index│ │ └─ IndexView.vue│ ├─ pages.json //页面配置文件│ ├─ services // 申请后端服务目录│ │ ├─ api.js // 后端api│ │ └─ http.js //申请│ ├─ shime-uni.d.ts│ ├─ static //动态文件目录│ │ └─ logo.png│ ├─ store //pinia全局状态库│ │ └─ useUserStore.js│ ├─ uni.scss│ └─ utils //公共的工具办法└─ vite.config.js创立历程我的项目创立1npx degit dcloudio/uni-preset-vue#vite my-vue3-projectVue3/Vite 版要求 node 版本^14.18.0 || >=16.0.0如果应用 HBuilderX(3.6.7 以下版本)运行 Vue3/Vite 创立的最新的 cli 工程,须要在 HBuilderX 运行配置最底部设置 node 门路 为本人本机高版本 node 门路(留神须要重启 HBuilderX 才能够失效)HBuilderX Mac 版本菜单栏左上角 HBuilderX->偏好设置->运行配置->node 门路HBuilderX Windows 版本菜单栏 工具->设置->运行配置->node 门路我的项目依赖装置EslintEslint 的相干配置可参考文章:Web 我的项目如何配置 Eslint留神:在配置完 Eslint 之后,在我的项目中应用 uni 的时候会报 uni 未被定义的错,需在.eslintrc.js 中加上以下代码 ...

September 11, 2023 · 2 min · jiezi

关于vite:vite-中使用-配置路径别名

1. 关上 vite.config.ts 文件,配置 alias 参数import { defineConfig } from 'vite'import vue from '@vitejs/plugin-vue'const path = require('path');// https://vitejs.dev/config/export default defineConfig({ plugins: [vue()], resolve:{ //设置门路别名 alias: { '@': path.resolve(__dirname, './src'), '*': path.resolve('') }, } })2. 关上 tsconfig.json 文件{ "compilerOptions": { "target": "esnext", "useDefineForClassFields": true, "module": "esnext", "moduleResolution": "node", "strict": true, "jsx": "preserve", "sourceMap": true, "resolveJsonModule": true, "isolatedModules": true, "esModuleInterop": true, "lib": ["esnext", "dom"], "skipLibCheck": true, "baseUrl": ".", "paths": { "@/*": ["src/*"] } }, "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], "references": [{ "path": "./tsconfig.node.json" }]}3. 从新运行4. 应用import Home from '@/views/index/index.vue'

August 31, 2023 · 1 min · jiezi

关于vite:深度剖析Vite配置文件

咱们晓得,Vite 构建环境分为开发环境和生产环境,不同环境会有不同的构建策略,但不论是哪种环境,Vite 都会首先解析用户配置。那接下来,我就与你剖析配置解析过程中 Vite 到底做了什么?即Vite是如何加载配置文件的。 一、流程梳理咱们先来梳理整体的流程,Vite 中的配置解析由 resolveConfig 函数来实现,你能够对照源码一起学习。 1.1 加载配置文件进行一些必要的变量申明后,咱们进入到解析配置逻辑中,配置文件的源码如下: // 这里的 config 是命令行指定的配置,如 vite --configFile=xxxlet { configFile } = configif (configFile !== false) { // 默认都会走到上面加载配置文件的逻辑,除非你手动指定 configFile 为 false const loadResult = await loadConfigFromFile( configEnv, configFile, config.root, config.logLevel ) if (loadResult) { // 解析配置文件的内容后,和命令行配置合并 config = mergeConfig(loadResult.config, config) configFile = loadResult.path configFileDependencies = loadResult.dependencies }}第一步是解析配置文件的内容,而后与命令行配置合并。值得注意的是,前面有一个记录configFileDependencies的操作。因为配置文件代码可能会有第三方库的依赖,所以当第三方库依赖的代码更改时,Vite 能够通过 HMR 解决逻辑中记录的configFileDependencies检测到更改,再重启 DevServer ,来保障以后失效的配置永远是最新的。 1.2 解析用户插件第二个重点环节是 解析用户插件。首先,咱们通过 apply 参数 过滤出须要失效的用户插件。为什么这么做呢?因为有些插件只在开发阶段失效,或者说只在生产环境失效,咱们能够通过 apply: 'serve' 或 'build' 来指定它们,同时也能够将apply配置为一个函数,来自定义插件失效的条件。解析代码如下: ...

July 3, 2023 · 5 min · jiezi

关于vite:Vite-项目性能分析与优化

性能优化始终是前端工程化中陈词滥调的话题,也是前端我的项目优化的重要的优化点。事实上,随着我的项目越来越宏大,稍不留神就会产生显著的性能问题。在不同的场景中,咱们对于我的项目性能的关注点是不一样的。在我的项目开发阶段,咱们须要关注开发体验,重视我的项目构建性能;而在生产环境中,咱们个别更看重我的项目在的线上运行时性能。 对于开发阶段的构建性能问题,Vite 外部曾经做了相当多的优化,实现了我的项目秒级启动与毫秒级热更新,具体实现就不属于本文探讨的领域了,本文所介绍的性能优化次要指线上环境的我的项目加载性能优化,与页面的 FCP、TTI 等指标。 对于Vite我的项目的加载性能优化,常见的优化伎俩重点关注上面三个方面: 网络优化。包含 HTTP2、DNS 预解析、Preload、Prefetch等伎俩。资源优化。包含构建产物剖析、资源压缩、产物拆包、按需加载等优化形式。预渲染优化,本文次要介绍服务端渲染(SSR)和动态站点生成(SSG)两种伎俩。不过,无论是以上哪一类优化形式,都离不开构建工具的反对,也就是说,在这些性能优化的场景中,咱们将高频地应用到 Vite,对 Vite 自身的构建能力进行深度地利用或者定制。 一、网络优化1.1 HTTP2传统的 HTTP 1.1 存在队头阻塞的问题,同一个 TCP 管道中同一时刻只能解决一个 HTTP 申请,也就是说如果以后申请没有解决完,其它的申请都处于阻塞状态,另外浏览器对于同一域名下的并发申请数量都有限度,比方 Chrome 中只容许 6 个申请并发,也就是说申请数量超过 6 个时,多进去的申请只能排队、期待发送。 因而,在 HTTP 1.1 协定中,队头阻塞和申请排队问题很容易成为网络层的性能瓶颈。而 HTTP 2 的诞生就是为了解决这些问题,只有体现在如下的能力上: 多路复用。将数据分为多个二进制帧,多个申请和响应的数据帧在同一个 TCP 通道进行传输,解决了之前的队头阻塞问题。而与此同时,在 HTTP2 协定下,浏览器不再有同域名的并发申请数量限度,因而申请排队问题也失去了解决。Server Push,即服务端推送能力。能够让某些资源可能提前达到浏览器,比方对于一个 html 的申请,通过 HTTP 2 咱们能够同时将相应的 js 和 css 资源推送到浏览器,省去了后续申请的开销。在 Vite 中,咱们能够通过vite-plugin-mkcert在本地 Dev Server 上开启 HTTP2,应用前须要先装置这个插件: npm i vite-plugin-mkcert -D而后,在 Vite 配置中进行应用: // vite.config.tsimport { defineConfig } from "vite";import react from "@vitejs/plugin-react";import mkcert from "vite-plugin-mkcert";export default defineConfig({ plugins: [react(), mkcert()], server: { // https 选项须要开启 https: true, },});插件的原理也比较简单,因为 HTTP2 依赖 TLS 握手,插件会帮你主动生成 TLS 证书,而后反对通过 HTTPS 的形式启动,而 Vite 会主动把 HTTPS 服务降级为 HTTP2。 ...

July 1, 2023 · 3 min · jiezi

关于vite:使用Vite-搭建高可用的服务端渲染SSR工程

在十分晚期的 Web 开发中,大家还在应用 JSP 这种古老的模板语法来编写前端的页面,而后间接将 JSP 文件放到服务端,在服务端填入数据并渲染出残缺的页面内容,能够说那个时代的做法是人造的服务端渲染。但随着 AJAX 技术的成熟以及各种前端框架(如 Vue、React)的衰亡,前后端拆散的开发模式逐步成为常态,前端只负责页面 UI 及逻辑的开发,而服务端只负责提供数据接口,这种开发方式下的页面渲染也叫客户端渲染(Client Side Render,简称 CSR)。 但客户端渲染也存在着肯定的问题,例如首屏加载比较慢、对 SEO 不太敌对,因而 SSR (Server Side Render)即服务端渲染技术应运而生,它在保留 CSR 技术栈的同时,也能解决 CSR 的各种问题。 一、SSR 基本概念首先,咱们来剖析一下 CSR 的问题,它的 HTML 产物构造个别如下。 <!DOCTYPE html><html><head> <meta charset="utf-8" /> <title></title> <link rel="stylesheet" href="xxx.css" /></head><body> <!-- 一开始没有页面内容 --> <div id="root"></div> <!-- 通过 JS 执行来渲染页面 --> <script src="xxx.chunk.js"></script></body></html>接下来,咱们简略的回顾一下浏览器的渲染流程,上面是一个简略的示意图。 当浏览器拿到如上的 HTML 内容之后,其实并不能渲染残缺的页面内容,因为此时的 body 中根本只有一个空的 div 节点,并没有填入真正的页面内容。接下来浏览器才开始下载并执行 JS 代码,经验了框架初始化、数据申请、DOM 插入等操作之后能力渲染出残缺的页面。也就是说,在 CSR 中残缺的页面内容实质上通过 JS 代码执行之后才可能渲染。这会导致两个方面的问题: 首屏加载速度比较慢。首屏加载须要依赖 JS 的执行,下载和执行 JS 都可能是十分耗时的操作,尤其是在一些网络不佳的场景,或者性能敏感的低端机下。对 SEO(搜索引擎优化) 不敌对。页面 HTML 没有具体的页面内容,导致搜索引擎爬虫无奈获取关键词信息,导致网站排名受到影响。那么 SSR 是如何解决这些问题的呢?首先,在 SSR 的场景下,服务端生成好残缺的 HTML 内容,间接返回给浏览器,浏览器可能依据 HTML 渲染出残缺的首屏内容,而不须要依赖 JS 的加载,这样在肯定水平上可能升高首屏渲染的工夫,另一方面也能将残缺的页面内容展示给搜索引擎的爬虫,有利于做SEO。 ...

June 27, 2023 · 8 min · jiezi

关于vite:深入浅出ViteVite打包与拆分

一、背景在生产环境下,为了进步页面加载性能,构建工具个别将我的项目的代码打包(bundle)到一起,这样上线之后只须要申请大量的 JS 文件,大大减少 HTTP 申请。当然,Vite 也不例外,默认状况下 Vite 利用底层打包引擎 Rollup 来实现我的项目的模块打包。 某种意义上来说,对线上环境进行我的项目打包是一个必须的操作。但随着前端工程的日渐简单,单份的打包产物体积越来越宏大,会呈现一系列利用加载性能问题,而代码宰割能够很好地解决它们。 当然,在理论的我的项目场景中,只用 Vite 默认的策略是不够的,咱们会更深刻一步,学习 Rollup 底层拆包的各种高级姿态,实现自定义拆包,同时我也会带大家通过理论案例复现 Rollup 自定义拆包常常遇到的坑——循环援用问题,一起剖析问题呈现的起因,也分享一些本人的解决思路和计划,让大家对 Vite 及 Rollup 的代码宰割有更加深刻的把握。  不过,在正式解说之前,给大家介绍几个业余概念:bundle、chunk、vendor。 bundle:指的是整体的打包产物,蕴含 JS 和各种动态资源。chunk:指的是打包后的 JS 文件,是 bundle 的子集。vendor:是指第三方包的打包产物,是一种非凡的 chunk。二、Code Splitting 解决的问题在传统的单 chunk 打包模式下,当我的项目代码越来越宏大,最初会导致浏览器下载一个微小的文件,从页面加载性能的角度来说,次要会导致两个问题: 无奈做到按需加载,即便是以后页面不须要的代码也会进行加载。线上缓存复用率极低,改变一行代码即可导致整个 bundle 产物缓存生效。首先来看第一个问题,一般而言,一个前端页面中的 JS 代码能够分为两个局部: Initital Chunk和Async Chunk,前者指页面首屏所须要的 JS 代码,而后者并不一定须要,一个典型的例子就是 路由组件,与以后路由无关的组件并不必加载。而我的项目被打包成单 bundle 之后,无论是Initial Chunk还是Async Chunk,都会打包进同一个产物,也就是说,浏览器加载产物代码的时候,会将两者一起加载,导致许多冗余的加载过程,从而影响页面性能。而通过Code Splitting咱们能够将按需加载的代码拆分出独自的 chunk,这样利用在首屏加载时只须要加载Initial Chunk 即可,防止了冗余的加载过程,使页面性能失去晋升。 其次,线上的缓存命中率是一个重要的性能衡量标准。对于线上站点而言,服务端个别在响应资源时加上一些 HTTP 响应头,最常见的响应头之一就是cache-control,它能够为浏览器指定强缓存,比方设置为上面这样。 cache-control: max-age=31536000示意资源过期工夫为一年,在过期之前,拜访雷同的资源 url,浏览器间接利用本地的缓存,并不必给服务端发申请,这就大大降低了页面加载的网络开销。不过,在单 chunk 打包模式上面,一旦有一行代码变动,整个 chunk 的 url 地址都会变动,比方下图所示的场景。 因为构建工具个别会依据产物的内容生成哈希值,一旦内容变动就会导致整个 chunk 产物的强缓存生效,所以单 chunk 打包模式下的缓存命中率极低,根本为零。而进行Code Splitting之后,代码的改变只会影响局部的 chunk 哈希改变,如下图所示: ...

June 12, 2023 · 4 min · jiezi

关于vite:深入理解-Rollup-的插件机制

上一节咱们学会了 Rollup 构建工具的应用,置信你曾经对 Rollup 的根底概念和应用有了根本的把握。同时咱们也晓得,仅仅应用 Rollup 内置的打包能力很难满足我的项目日益简单的构建需要。对于一个实在的我的项目构建场景来说,咱们还须要思考到模块打包之外的问题,比方门路别名(alias) 、全局变量注入和代码压缩等等。 可要是把这些场景的解决逻辑与外围的打包逻辑都写到一起,一来打包器自身的代码会变得非常臃肿,二来也会对原有的外围代码产生肯定的侵入性,混入很多与外围流程无关的代码,不易于前期的保护。因而 ,Rollup 设计出了一套残缺的插件机制,将本身的外围逻辑与插件逻辑拆散,让你能按需引入插件性能,进步了 Rollup 本身的可扩展性。 那接下来,我会带你剖析 Rollup 的插件机制,相熟 Rollup 插件的残缺构建阶段和工作流程,并且联合案例深刻插件开发细节。Rollup 的打包过程中,会定义一套残缺的构建生命周期,从开始打包到产物输入,中途会经验一些标志性的阶段,并且在不同阶段会主动执行对应的插件钩子函数(Hook)。对 Rollup 插件来讲,最重要的局部是钩子函数,一方面它定义了插件的执行逻辑,也就是"做什么";另一方面也申明了插件的作用阶段,即"什么时候做",这与 Rollup 自身的构建生命周期非亲非故。   一、Rollup构建阶段在执行 rollup 命令之后,在 cli 外部的次要逻辑简化如下: // Build 阶段const bundle = await rollup.rollup(inputOptions);// Output 阶段await Promise.all(outputOptions.map(bundle.write));// 构建完结await bundle.close();而Rollup 外部次要经验了 Build 和 Output 两大阶段,如下图所示。 首先,Build 阶段次要负责创立模块依赖图,初始化各个模块的 AST 以及模块之间的依赖关系。上面咱们用一个简略的例子来感受一下: // src/index.jsimport { a } from './module-a';console.log(a);// src/module-a.jsexport const a = 1;而后,执行如下的构建脚本: const rollup = require('rollup');const util = require('util');async function build() { const bundle = await rollup.rollup({ input: ['./src/index.js'], }); console.log(util.inspect(bundle));}build();执行下面的代码,能够看到如下的 bundle对象信息。 ...

May 25, 2023 · 5 min · jiezi

关于vite:彻底搞懂vite-proxy如何解决跨域问题

场景形容:本地起了两个服务 前端vue我的项目跑在http://localhost:5173端口后端接口服务跑在http://localhost:3000端口前端我的项目申请后端接口时,浏览器给出了跨域的提醒,接口申请失败。上面给出通过配置前端代理解决跨域问题的办法如果你是vite搭建的vue3我的项目,找到vite.config.ts,增加上面内容: export default defineConfig({ server: { proxy: { '/api': { target: 'http://localhost:3000', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, ''), }, } },})要害的点来了,你的前端发动申请的baseUrl应该是 http://localhost:5173/api 举个例子:前端要申请后端http://localhost:3000/userlist 接口,那么你发动的申请应该是上面的样子: http://localhost:5173/api/userlist这样前端就是从雷同的host 并且雷同的port发动的申请,代理通过前缀"/api"匹配的你要转发的申请,转发到'http://localhost:3000'真正的后端服务,并且把多余的前缀给你替换掉。 对于这个问题,网络上充斥着大量的错误方法,一不小心就会被误导。如果本文帮到了你,就帮忙点个赞吧,有助于让更多的人看到。

May 11, 2023 · 1 min · jiezi

关于vite:前端食堂技术周刊第-80-期Vite-43Nodejs-20TS-51-BetaWindi-CSS-即将落幕

美味值: 口味:东坡肉 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly本期摘要Vite 4.3Node.js 20TypeScript 5.1 BetaWindi CSS 行将闭幕Pretty TypeScript ErrorsESM-CJS interop test负载平衡可视化The JavaScript Oxidation Compilerrrweb 实现原理大家好,我是童欧巴。欢送来到前端食堂技术周刊,咱们先来看下上周的技术资讯。 技术资讯1. Vite 4.3在这次的 migor 版本更新中,Vite 专一于进步开发服务器的性能,解析逻辑失去优化,进步了热门路性能,并为查找 package.json、TS 配置文件和已解析 URL 实现了更智能的缓存。如果你对引擎盖下的原理感兴趣,能够参考这篇博文 如何让 Vite 4.3 变得更快。 对于性能剖析: Vite 团队正在开发一个官网的 Vite 基准测试工具,用于获取每个 Pull Request 的性能指标。vite-plugin-inspect 当初具备更多与性能相干的性能,可帮忙开发者辨认出插件或中间件的性能。应用 vite --profile,而后在页面加载后按 p 键将保留开发服务器启动的 CPU 性能剖析文件,能够在相似 speedscope 的利用中关上它们,来辨认性能问题。 2. Node.js 20次要个性如下: 引入权限模型自定义 ESM 加载器钩子在专用线程上运行,与主线程隔离同步的 import.meta.resolve(),与浏览器行为保持一致V8 降级到 11.3Test Runner 达到稳固状态装备了最新版本的 URL 解析器 Ada 2.0,为 URL 解析带来了显著的性能改良单个可执行利用当初须要注入 BlobWeb Crypto API 函数参数现已依照 WebIDL 的定义,进行强制和验证,晋升了与 Web Crypto API 的其余实现的互操作性官网反对 ARM64 WindowsWASI 的版本须要被指定3. TypeScript 5.1 Beta次要个性如下: ...

April 24, 2023 · 1 min · jiezi

关于vite:vite4admin基于vue3vite4pinia中后台管理系统

前言随着 vite.js 疾速迭代降级,越来越多的开发者偏向于应用vite.js来搭建vue3我的项目。明天给大家分享 vite4+pinia+ve-plus 开发轻量级后盾管理系统我的项目ViteAdmin。 Vite4-Vue3-Admin 应用前端最新技术vite4+pinia+vue-router@4+搭建中后盾治理模板。 技术框架编码工具:Vscode框架技术:vite4.x+vue3+pinia+vue-routerUI组件库:vePlus (基于vue3自定义组件库)款式解决:sass^1.58.3图表组件:echarts^5.4.2国际化计划:vue-i18n^9.2.2富文本编辑器组件:wangeditor^4.7.15markdown编辑器:md-editor-v3^2.11.0 性能个性反对中文+英文+繁体多语言模式切换。反对表格单选/多选、边框/隔行换色、横向/纵向虚构滚动条等性能。搭配高颜值vue3组件库VEPlus,格调更加对立。内置多个模板布局款式反对动静路由权限管制反对keepalive路由缓存... 我的项目构造 vue3组件库ve-plusve-plus:一款基于vue3开发的轻量级高定制化UI组件库,蕴含超过40+罕用性能组件。 至于如何装置应用,大家能够去看看之前的这篇分享文章。https://blog.csdn.net/yanxinyun1990/article/details/129312570 布局模板vite-admin后盾治理提供了4种罕用的布局模板。 <script setup> import { computed } from 'vue' import { appStore } from '@/store/modules/app' // 引入布局模板 import Classic from './layout/classic/index.vue' import Columns from './layout/columns/index.vue' import Vertical from './layout/vertical/index.vue' import Transverse from './layout/transverse/index.vue' const store = appStore() const config = computed(() => store.config) const LayoutConfig = { classic: Classic, columns: Columns, vertical: Vertical, transverse: Transverse }</script><template> <div class="veadmin__container"> <component :is="LayoutConfig[config.layout]" /> </div></template> ...

April 14, 2023 · 7 min · jiezi

关于vite:原理揭秘Vite-是怎么兼容老旧浏览器的你以为仅仅依靠-Babel

作者:京东科技 孙凯 一、前言 对前端开发者来说,Vite 应该不算生疏了,它是一款基于 nobundle 和 bundleless 思维诞生的前端开发与构建工具,官网对它的概括和期待只有一句话:“下一代的前端工具链”。 Vite 最早的版本由尤雨溪公布于3年前,经验了3年多的倒退,Vite 也已逐步迭代成熟,它的稳定性、扩展性、周边生态足以在生产环境中撑持各种业务场景的落地。然而对于Vite的优劣势剖析咱们就戛然而止,不在深刻开展了,这不是本文的重点。 本文的重点在于探索 Vite 如何实现兼容低版本浏览器,这所有还得从那个阳光明媚的午后说起。 二、那个午后本着尝鲜的态度,我在某一个我的项目中用了 Vite,过后还是3.x.x的版本,跟着文档配置,从我的项目启动到我的项目构建,一路都很“德芙”(纵享丝滑),在经验了 Vite 带来的短暂新鲜感后,就始终沉迷在业务模块的开发中了,因为在 Vite 刚公布后的那段时间曾看过相干原理解析,是基于浏览器原生的模块化能力按需构建BALABALA等,所以起初 Vite 的这种新鲜感对我而言并没有放弃多久。 但直到有天下午我开始打包提测,审查页面元素后发现构建产物竟然跟以往 webpack 的产物居然有点不一样,在好奇心的驱使下,于是我开始尝试解谜。 三、跟webpack构建产物到底哪里不一样?1. 筹备工作为了能更好的比照两者产物到底有什么区别,咱们首先要确保咱们的业务代码基本一致,不统一的中央仅仅是应用不同工具( vite 和 webpack)进行构建,这样能力排除最大烦扰因素。 于是咱们别离应用最新版的 Vite 和 webpack 初始化了两个页面,为了做作辨别,两个页面的仅题目和题目背景不统一,他们在浏览器中渲染后的别离长这个样子: 2. 构建工具版本阐明• Vite:v4.1.4 • webpack:v5.75.0 3. 构建工具配置项阐明• Vite (非常简单,啥也没有) // vite.config.jsimport { defineConfig } from 'vite'import legacy from '@vitejs/plugin-legacy'import vue from '@vitejs/plugin-vue'export default defineConfig({ plugins: [ vue(), legacy({ targets: ['ios >= 9', 'android >= 4.2', '> 1%'] }) ], server: { host: '127.0.0.1' }, build: { minify: false }})• webpack(太多了,也比拟惯例,就不在这里贴出来全副配置项了,仅在这里配置好跟 Vite 一样的须要兼容到最低的浏览器版本) ...

April 3, 2023 · 3 min · jiezi

关于vite:unpluginsvgcomponent-助你优雅的使用-svg-图标

前言现如今, 我的项目中的小图标往往会应用 svg 的形式来做, 许多 svg 插件供咱们抉择, 比如说 vite-plugin-svg-icons, 这个插件的应用的范畴是比拟广的, 然而就我应用下来而言, 发现几个痛点: 应用该插件之后必须要本人在新建一个 svg 的( vue/react )组件, 这有些繁琐了;ts 反对无限, 我冀望的是在应用组件的时候可能智能提醒所有的icon图标的名字;不反对 tree-shaking , 未应用的图标仍然会打包到最终的产物中;不反对svg图标的hmr, 每次新增/删除图标都须要重启服务;有色图标的应用问题。而且, 仿佛这个仓库曾经不再保护了。 unplugin-svg-component因而, 基于以上几个痛点, 我便鼓捣出unplugin-svg-component, 我的项目应用Anthony Fu大佬的unplugin我的项目模板, 因而反对 vite, webpack, rollup, esbuild 等多个打包工具, 目前插件次要针对几个痛点做了以下性能: 依据我的项目类型 vue/react, 主动生成对应的组件(这里的原理是检测我的项目中的dependencies是否蕴含 vue/react, 这可能不精确, 所以也反对手动配置);会生成 svg-component.d.ts 文件, 用于组件应用过程中提醒svg的名称, 你只须要把 svg-component.d.ts引入到你的tsconfig.json当中;在生产环境下, 会扫描你应用过的 svg 图标, 把未应用到的图标从你的最终产物中剔除;目前反对在 Vite 的开发环境的 HMR, 其它工具会后续反对;有色图标能够通过配置 preserveColor 来决定哪些svg图标须要保留其色彩。效果图Vue React 结语这个我的项目是我开源的第一个作品, 没有宣传, 也陆陆续续有人star, 这让我有了坚持下去的能源, 如果有同学有 svg 图标应用这方面的需要, 无妨试试这个插件, 心愿能帮忙到你, 也欢送各位同学给我提 issue 和 PR, 收! ...

March 9, 2023 · 1 min · jiezi

关于vite:Vite如何自定义插件

根本语法定义比方咱们要开发一个插件 DemoPlugin ,间接新建文件 demp-plugin.ts后写入如下代码: import type { Plugin } from 'vite'export default function DemoPlugin(): Plugin { return { // 插件名称 name: 'DemoPlugin', // 代码转译 transform(code, id, opt) { // todo } }};应用定义好了当前,就和一般的插件一样应用即可,比方在 vite.config.js 文件中: import { defineConfig } from 'vite'import DemoPlugin from './demp-plugin'export default defineConfig({ ... plugins: [DemoPlugin(),...] ...})选项咱们在开发插件的时候,能够配置“插件名称name”和“代码转译transform”等,上面来阐明具体能够配置的内容。 舒适提醒:具体的细节能够去 ‘./node_modules/vite/dist/node/index.d.ts’ 查看。enforcevite 和 rollup 共享值能够是'pre'或'post',用于管制插件的执行机会,具体执行程序如下: alias resolution → enforce: 'pre' plugins → vite core plugins → normal plugins → vite build plugins → enforce: 'post' plugins → vite build post plugins ...

March 7, 2023 · 1 min · jiezi

关于vite:怎么知道-vite-创建的-vue-项目是-vue2还是vue3

每个我的项目上面都有一个 package.json 文件,这个文件外面写了 vue 的版本 比方上面是我用 vite 创立的一个 vue 我的项目 yarn create vite loqnyn --template vue 对应的 package.json 文件内容: { "name": "loqnyn", "private": true, "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "vite build", "preview": "vite preview" }, "dependencies": { "vue": "^3.2.45" }, "devDependencies": { "@vitejs/plugin-vue": "^4.0.0", "vite": "^4.0.0" }}

January 20, 2023 · 1 min · jiezi

关于vite:Turbopack-发布后的各方反应ViteWebpack围观群众

上周整顿了一下 Turbopack 公布后的各方反馈,以便让本人和各位同学下一步做决策的时候能有所参考。接着繁忙的一周过来,我发现博客这周还没更,于是连忙来补一下。 TL;DRTurbopack 的宣传语更多还是“宣传”,实际效果晋升并没有那么微小。Turbopack 目前只反对 Next.js + React,且没有建立健全插件机制,所以没有生态可言,如果咱们的次要开发环境不统一,可能临时用不到。Turbopack 基于 Rust 开发,性能晋升次要来自 SWC,所以有工夫、有趣味的话,间接应用 SWC 替换编译工具就好。非指标开发者群体倡议先不思考迁徙。Turbopack 对于打包过程有不小的改良,值得继续关注。如果你日常应用 React,且想在新技术呈现时斩获先机,早点入手也挺好。2022-10-26首先,10月26日,Vercel 公布了 Turbopack,自命 Webpack 继任者,号称速度比 Wepback 快 700 倍,比 Vite 快 10 倍。 这些是官推亮点: ~700x faster than Webpack -> 比 Webpack 快 700 倍10x faster than Vite -> 比 Vite 快 10 倍Native incremental architecture built with Rust -> 基于 Rust,具备原生可增长架构 ◆ Support for React Server Components -> 反对 React 服务器组件◆ Support for TS, JSX, CSS & more -> 反对 TS、JSX、CSS,以及更多官推:https://twitter.com/vercel/st...官网:https://vercel.com/blog/turbo...尤大观点很快,Vite 作者 @youyuxi 就跟进表白反驳: ...

November 7, 2022 · 4 min · jiezi

关于vite:vite开发环境跳转页面卡住加载慢antdesignvue-按需导入的新组件导致页面加载慢

环境vite: 2.9.9unplugin-vue-components: 0.19.6参考issues: 应用按需引入时,首次启动服务会依赖预构建style#361vite-plugin-ifdef(在vite中应用condition complie)问题形容本地开发时,遇到跳转页面要等10s以上能力跳转胜利,打包后没有这个问题 问题剖析发现跳转到的页面如果有新的antd组件,就会有这个问题 问题起因我的项目中应用了unplugin-vue-components按需引入antd组件,然而在开发环境中有问题,详情可查看issue,理论是按需引入款式导致的问题 解决办法开发环境全局引入款式,正式环境按需引入款式 有问题的vite.config.ts如下(此处省略了局部配置,只关注须要批改的项) import Components from "unplugin-vue-components/vite";import { AntDesignVueResolver } from "unplugin-vue-components/resolvers";export default ({ command, mode }: ConfigEnv): UserConfig => { // ... return { // ... plugins: [ // ... Components({ resolvers: [AntDesignVueResolver()], }), ],};咱们引入一个插件vite-plugin-ifdef,用于辨别开发环境和生产环境,应用yarn或npm装置 yarn add vite-plugin-ifdef而后批改vite.config.ts如下 import Components from "unplugin-vue-components/vite";import { AntDesignVueResolver } from "unplugin-vue-components/resolvers";import ifdef from "vite-plugin-ifdef";/** vite-plugin-ifdef插件的配置项 */type IfdefConfig = { "ifdef-define": any; "ifdef-option": any };export default ({ command, mode }: ConfigEnv): UserConfig & IfdefConfig => { // ... return { // ... plugins: [ ifdef(), // ... Components({ /** * 开发环境(serve命令)若配置importStyle会导致应用ant-design的组件加载工夫长达10s以上, * 故仅在打包环境(build命令)按需加载ant-design的款式,开发环境全量引入款式文件 * https://github.com/antfu/unplugin-vue-components/issues/361 */ resolvers: [AntDesignVueResolver({ importStyle: command === "build" ? "less" : false })], }), ], "ifdef-define": { COMMAND: command, }, // 留神此处有坑,vite-plugin-ifdef的文档中给的键名 ifdef-config 是谬误的 "ifdef-option": { verbose: false, },};在我的项目的入口文件main.js中引入款式 ...

November 1, 2022 · 1 min · jiezi

关于vite:vite-踩坑

1.vite.config.js中报错 vite.defineConfig is not a function起因:vite版本太低了,重新安装一波 npm init vite 我的项目名

October 26, 2022 · 1 min · jiezi

关于vite:P2vue3-创建-vite-简单的前端实例

在console中从新给test56 赋值创立vite我的项目 须要留神本人的npm版本,不同的版本命令不通

October 13, 2022 · 1 min · jiezi

关于vite:如何快速从零开始搭建一个前端项目

2022 年了,如何疾速从零开始搭建一个适合的前端我的项目? 筹备工作首先本地须要装置好 node 环境以及包管理工具,举荐间接应用 pnpm,也能够通过 pnpm 来间接治理 nodejs 版本。 pnpm 装置: # Mac or Linuxcurl -fsSL https://get.pnpm.io/install.sh | sh -# Windowsiwr https://get.pnpm.io/install.ps1 -useb | iex应用 pnpm 装置 nodejs 的 LTS 版本: pnpm env use --global lts我的项目搭建这里咱们以搭建一个 React + TypeScript 我的项目为例 脚手架脚手架方面,新我的项目能够思考间接应用 vite,咱们通过以下命令创立一个基于 vite 的初始化我的项目: pnpm create vite my-react-app --template react-ts进入目录能够看到如下的构造: .├── public├── src├── index.html├── package.json├── tsconfig.json├── tsconfig.node.json└── vite.config.tsESLintESLint 能够通过动态剖析,来审查你代码中的谬误,对于前端我的项目也是不可或缺的存在,这里咱们抉择社区比拟风行的 airbnb 格调的 ESLint 规定,通过以下命令装置根底的配置与插件: pnpm add eslint eslint-config-airbnb-base eslint-plugin-import -D 而后在我的项目根目录中增加 .eslintrc.json 文件: ...

September 18, 2022 · 3 min · jiezi

关于vite:Vite配置如何优雅的代码分割

Vite如何配置宰割代码什么是代码宰割/code spliiting前端生态 rollup 和 webpack都有的概念。如果把所有代码都打包到一起,可能最终的代码十分大。从而影响加载工夫。 而且,很多代码是初始加载时,不须要的。因而,咱们能够依据代码应用的紧急水平,将代码宰割打包后,能够按需加载。 Vite 中 rollup code spliiting宰割默认办法原理// 提前装置rollupnpm i -g rollup案例目录 ├─dist└─src foo.js main.js main1.js1.依照动静导入语句宰割打包测试。 //// foo.jsexport default 'hello foo!';// main.js文件// 动静导入案例1export default function () { import('./foo.js') .then(() => { // console.log(导入胜利); }) .catch(() => {});}执行 rollup src/main.js -f cjs -d dist打包/main.js 生成两个文件 打包后的代码展现 // dist\foo-xxxxxx.js'use strict';var foo = 'hello foo!';exports["default"] = foo;// dist\main.js'use strict';// 动静导入案例1function main () { Promise.resolve().then(function () { return require('./foo-e385385a.js'); }) .then(() => { // console.log(导入胜利); }) .catch(() => {});}module.exports = main;依照动静导入语句宰割打包测试验证胜利。 ...

August 28, 2022 · 2 min · jiezi

关于vite:使用Vite构建工具快速创建Vue项目Vue30项目开发

前段时间介绍了应用Vite构建工具疾速创立Vue我的项目(Vue3.0我的项目创立),本文将进行该项目标开发和公布。目前的Vue版本是3.0.4,通过Vite的打包,就能够部署到服务器进行公布。 我的项目配置1、数据来源于bilibili2、服务器是Nginx3、我的项目目录如下 该我的项目波及到组件、路由等基础知识。我的项目成型后的界面如下: 组件化开发vue我的项目的长处就是组件化开发,将每个性能、或者是每个页面、容器分成各个组件,一方面是便于保护,另一方面是多人开发的时候也是能够提高效率。能够减少代码的复用性、可维护性和可测试性。进步开发效率,不便重复使用,简化调试步骤,晋升整个我的项目的可维护性,便于协同开发,是高内聚、低耦合代码的实际。 代码目录中的 components 目录就是组件的目录,在这里能够依据本人的我的项目去创立各个组件,间接在组件外面写html代码、以及调用vue的api去实现很多性能,例如axios网络申请,同时,组件内也能够写css款式。 如图所示,我的组件目录有4个组件,这四个组件对应的是下图: 组件的创立、注册、挂载1. 创立组件 组件就是一个后缀名为 .vue 的文件,在 components 目录下创立你的 .vue 文件即可创立一个组件。组件外面有固定的格局,以本我的项目 tuijian.vue 为例: <template></template> 标签所蕴含的是模板,外面能够写html的布局,例如div、p、span、li等标签,这是跟一般的html一样,间接在外面写你以后组件的html布局。 <script></script> 标签所蕴含的是以后组件须要应用的vue的一些api去实现的一些性能,成果,例如数据申请,数据渲染等。 <style></style> 标签所蕴含的是以后组件的css款式。其中有一个 scope 是代表这个款式仅限以后组件应用,如果前期这个组件被其余组件复用,援用,那么这个款式是不会影响到其余的组件的。 export default 是将以后组件导出,便于其余组件导入应用。name 是组件名称。data() 是以后组件的数据函数,通过return返回数据供页面应用。 <template> <h1>{{title}}</h1></template><script>export default { name: 'tuijian', data() { return { title:'这是举荐组件' } }}</script><style scope></style>2. 注册组件 当组件创立实现后,通过 export default 将组件导出,其余组件能够导入这个组件,其余组件导入这个主键,须要注册组件。 App.vue作为入口文件,必定是要导入很多咱们写的组件的,那么就以本我的项目的App.vue组件导入其余组件为例。 可见构造就是一个组件的根本构造,首先导入组件,通过import进行导入,前面间接是填写导入的组件的门路。 import Content from './components/Content.vue'通过 components:{} 注册组件,外面间接将导入的组件的名称填进去即可。例如注册 Content 组件。 最初一步就是在模板中嵌入组件即可,<Content /> 间接嵌入到div中。 ...

August 23, 2022 · 3 min · jiezi

关于vite:Vite多页面应用配置使用vitepluginhtml向html模板注入数据或标签

vite配置多页面利用官网的例子: 在开发过程中,简略地导航或链接到 /nested/ - 将会按预期工作,与失常的动态文件服务器体现统一。也就是说,如果你的文件夹有如下层级: { src: { pages: { demo1: { App.vue main.ts }, demo2: { App.vue main.ts }, demo1.html demo2.html } }}那么通过vite的开发服务器拜访你的页面,须要拜访localhost:3000/src/pages/demo1.html#/index这样的链接,打包后index.html也会呈现在dist/src/pages文件夹下,很不不便。 能够通过配置vite.config.ts中的root选项解决 我的项目根目录(index.html 文件所在的地位)。能够是一个绝对路径,或者一个绝对于该配置文件自身的相对路径。// vite.config.jsconst { resolve } = require('path')const { defineConfig } = require('vite')module.exports = defineConfig({ root:'src/pages'})然而配置了root后,vite.config.ts中的大部分地址都会主动从root选项开始,例如: // vite.config.jsComponents({ resolvers: [VantResolver()], dts: 'src/types/components.d.ts' //这里的地址会被解析为src/pages/src/types,导致报错 })这里的地址会被解析为src/pages/src/types,导致报错 no such file or directory, open '/xxxxx/src/pages/src/types/components.d.ts'拼出绝对路径即可: import { join } from 'path'const resolve = dir => join(__dirname, dir)Components({ resolvers: [VantResolver()], dts: resolve('src/types/components.d.ts')})此时的vite.config.ts: ...

August 16, 2022 · 1 min · jiezi

关于vite:vite-vue3-项目ssr架构改造

这可能是最简略的革新计划了 简介SSR是Server Side Render简称。在服务端应用node渲染出html页面,再传输到客户端。惯例单页利用html只返回极少局部dom字符串+script动静生成网页,不利于google 爬虫的抓取。因而为了google更好的搜录网页,须要在服务端(node)执行js以渲染出html给google爬虫收录。 通用代码因为js会在node端执行,所以不能蕴含客户端浏览器植入的对象,比方window,location,localStorage,navigator,document等对象。服务端防止状态净化官网阐明解释: 上面一段代码记录以后用户发动的申请数量 export const http = axios.create({baseURL:'/api'})let count = 0http.interceptors.request.use((config) => { count++ return config})上述写法将使count长久化,当第二个用户发动申请时,会累加第一个用户的count,导致统计不正确。 不能在node端运行setInterval 等代码,因为此类代码对于服务端染没有任何意义,只会造成node内存透露,必须限度在客户端运行。必须的apirenderToString 能够将组件渲染成html字符串(能够用renderToNodeStream等流式渲染办法)Suspense 组件,此组件为node端获取数据后渲染的要害,使得由此组件包裹的后辈组件,能够应用async setup函数vite.ssrLoadModule 利用vite将vue打包后执行,此为调试模式要害。官网示例代码但还有2个问题 如何获取数据后渲染如何将服务端的申请数据长久化,防止客户端二次申请1.获取数据后渲染的办法在About组件中须要获取数据后渲染: <script setup lang="ts">const get = () => { return new Promise(res => { setTimeout(() => { res(Math.random()) }, 3000) })}const b = await get()</script><template><div>{{b}}</div></template>app组件: <template> <Suspense> <About/> </Suspense></template>服务端代码: const ctx = {}const html = await renderToString(App,ctx)上述html会渲染出b的数值。其中在组件中能够应用useSSRContext获取ctx。ctx.modules 含有以后所渲染页面须要的依赖js,css,图片等。可将这些依赖退出预下载,放慢渲染速度。 2. 解决客户端反复申请数据在服务端,申请数据后,将数据保留到window变量中,在客户端再次申请时,发现曾经有数据了,那么就不用在此申请。间接应用window中的数据。是否删除次数据,按照状况而定。此处附一个axios的申请做法。ssrCache.ts import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, Method } from 'axios'import md5 from 'md5'type MapData = { [k: string]: { data: any, count: number }}let map = {} as MapDataconst getKey = (config: AxiosRequestConfig<any>) => { const { url, data, baseURL, params } = config let paramsStr = '' for (let key in params) { if (Object.prototype.hasOwnProperty.call(params, key)) paramsStr += `${key}=${params[key]}` } return md5(baseURL || '' + url + data + paramsStr).substring(0, 8)}export const createProxy = (http: AxiosInstance) => { const ssr = typeof window === 'undefined' const request = async (config: AxiosRequestConfig<any>) => { const key = getKey(config) if (ssr) { if (map[key]) { // 只有当页面的数据申请数据做缓存。并且记录申请次数 map[key].count++ return map[key].data } try { const res = await http(config) let data = res if (res.request) data = res.data map[key] = { data, count: 1 } return res } catch (err) { return Promise.reject(err) } } if (window.__SSRDATA__ !== undefined) { const map = window.__SSRDATA__ if (map[key]) { map[key].count-- if (map[key].count === 0) { delete map[key] } return map[key].data } } return http(config) } const fn = (method: string) => { return (url: string, config: AxiosRequestConfig<any>) => { return request({ url, method, ...config }) } } const set = new Set(["get", "post", "options", "delete", "put", "patch"]) // 此处做一层proxy,因为axios能够axios()应用,也能够axios.get()应用 // 须要将他们转换成一样的申请模式 return new Proxy(http, { get(target, key: keyof AxiosInstance) { if (set.has(key.toLowerCase())) { return fn(key) } return http[key] }, apply(v) { return request(v) } }) as AxiosInstance}export const collect =() => { map={} return () => `<script>window.__SSRDATA__=${JSON.stringify(map)}</script>`}应用: ...

August 11, 2022 · 2 min · jiezi

关于vite:Toplevel-await-is-not-available-in-the-configured-target

Vite2打包报 Top-level await is not available in the configured target environment 间接上计划 在vite.config.ts的加上上面build: { target: "es2019",}或者build: { target: "esnext",}或者build: { target: ['edge90','chrome90','firefox90','safari15','esnext'],}

August 7, 2022 · 1 min · jiezi

关于vite:React-vite2-react17-ts4-项目初始化遇到的问题解决

命令行输出:npm create vite@latest vite-react-ts --template react-ts创立我的项目,应用vscode开发我的项目。(2022年7月15日,当初用vite创立我的项目,默认是react18) 呈现问题1.编译器不意识门路别名"@"解决办法:找到我的项目根目录的tsconfig.json,在compilerOptions下减少 "baseUrl": ".","paths": { "@/*": ["src/*"]} 2.vite编译时不意识门路别名"@"须要在vite.config.ts中plugin、server同级设置一个resolve具体代码如下 resolve: {alias: [ { find: '@', replacement: path.resolve(__dirname, 'src') } ]}留神:这里解析门路用到了node,在ts我的项目中,还须要装置@types/node 3.还会报错:模块 "path"只能在应用 "allowSyntheticDefaultImports" 标记时进行默认导入ts 解决办法:在根目录tsconfig.node.json中给 compilerOptions 对象增加 "allowSyntheticDefaultImports": true 完结。 同步更新到本人的语雀https://www.yuque.com/diracke...

July 15, 2022 · 1 min · jiezi

关于vite:vite项目require语法兼容问题解决-require-is-not-defined

vite我的项目不反对require语法问题解决 require is not definedVite默认应用es6规范的 import 的导入形式,不反对require引入。默认有Vite本人的引入形式https://vitejs.cn/guide/asset... 但在在日常应用Vue3+Ts+Vite构建我的项目中,局部比拟旧的三方插件中默认应用的是require引入(webpack构建能够应用),会呈现require办法报错的兼容性问题 require is not defined 。 1. require和import导入区别 年份出处应用require/exports2009CommonJSconst lodash = require('lodash');import/export2015ECMAScript2015(ES6)import lodash from 'lodash';2. 解决办法Vite 仓库社区生态 https://github.com/vitejs/awe...中有一个 插件 vite-plugin-require-transform。 插件主动转换import xxx from '';办法 引入\装置 yarn add -D vite-plugin-require-transform或者 npm i vite-plugin-require-transform --save-dev应用 // vite.config.ts配置import requireTransform from 'vite-plugin-require-transform'; plugins: [ // ... requireTransform({ fileRegex:/.ts$|.tsx$|.vue$/ // fileRegex:/.js$|.jsx$|.vue$/ }), ]增加之后npm run build打包 npm run preview 预览无异样。

June 26, 2022 · 1 min · jiezi

关于vite:Vite-Vue3-EsLint-Prettier-超简单配置步骤

1、应用vite创立一个我的项目 执行命令: yarn create vite? Project name: 输出你的项目名称?(如: esvue)? Select a framework: 抉择装置的脚手架 (这里选vue) vanilla> vue reactDone. Now run: cd esvue yarn yarn dev2、装置EsLint yarn add -D eslint3、初始化配置EsLint npx eslint --init3.1、抉择模式: (To check syntax and find problems) You can also run this command directly using 'npm init @eslint/config'.? How would you like to use ESLint? ... To check syntax only> To check syntax and find problems To check syntax, find problems, and enforce code style3.2、抉择语言模块: (选JavaScript modules) ...

June 8, 2022 · 4 min · jiezi

关于vite:分析vite2xrollup分包原理解决chunk碎片问题

背景年前开始负责新我的项目开发,是一个h5内嵌到企业微信。技术栈是 vite2.x + vue3.x。随着业务的发展,版本迭代,页面越来越多,第三方依赖也越来越多,打进去的包也越来越大。针对这个问题,很容易就会想到分包这个解决方案。依据 vite 官网文档 提醒,做了 vendor 分包之外,还对路由援用的组件做了异步加载解决,也会产生独立分包。这种配置在某个阶段是没问题的。 遇到问题在 vite 配置文件,通过 build.rollupOptions.output.manualChunks 配合手动分包策略之后,vite 不会主动生成 vendor包当页面越来越多,配置了动静引入页面之后,打包进去会产生 chunk碎片,如几个页面专用的文件 api.js sdkUtils.js http.js 等,这些独立的分包大小都很小,加起来 gzip 之后都不到 1kb,减少了网络申请。最终解决方案通过浏览源码,以及官网文档,剖析了vite和rollup的分包策略,最初得出这个解决方案: rollupOptions: { output: { manualChunks(id: any, { getModuleInfo }) { const cssLangs = `\\.(css|less|sass|scss|styl|stylus|pcss|postcss)($|\\?)`; const cssLangRE = new RegExp(cssLangs); const isCSSRequest = (request: string): boolean => cssLangRE.test(request); // 分vendor包 if ( id.includes('node_modules') && !isCSSRequest(id) && staticImportedByEntry(id, getModuleInfo, cache.cache) ) { return 'vendor'; } else if ( // 分manifest包,解决chunk碎片问题 ((getModuleInfo(id).importers.length + getModuleInfo(id).dynamicImporters.length) > 1) && id.includes('src') ) { return 'manifest'; } } }}export class SplitVendorChunkCache { constructor() { this.cache = new Map(); } reset() { this.cache = new Map(); }}export function staticImportedByEntry( id, getModuleInfo, cache, importStack = []) { if (cache.has(id)) { return !!cache.get(id); } if (importStack.includes(id)) { cache.set(id, false); return false; } const mod = getModuleInfo(id); if (!mod) { cache.set(id, false); return false; } if (mod.isEntry) { cache.set(id, true); return true; } const someImporterIs = mod.importers.some((importer) => staticImportedByEntry( importer, getModuleInfo, cache, importStack.concat(id) ) ); cache.set(id, someImporterIs); return someImporterIs;}上面来看看过后是如何剖析,以及一步一步来揭开默认分包策略的神秘面纱。 ...

May 30, 2022 · 5 min · jiezi

关于vite:使用vite脚手架创建vue3项目配置eslint

疾速配置应用vite的脚手架创立一个我的项目 yarn create vite装置Eslint包 cd vite-projectyarn add yarn add eslint -D配置eslint npx eslint --init 装置依赖包 如果上一步中 Would you like to install them now with npm? 抉择的为yes 则可跳过以后步骤,否则,能够依据上一步骤的提醒对须要的包进行装置yarn add -D eslint-plugin-vue@latest @typescript-eslint/eslint-plugin@latest eslint-config-airbnb-base@latest eslint@^8.2.0 eslint-plugin-import@^2.25.2 @typescript-eslint/parser@latest 执行完以上的步骤根本的eslint配置就实现了,如果应用 vscode 的同学肯定要留神要重启 vscode 能力失效深度定制配置问题解决问题1:当我关上App.vue文件的时候发现上面的谬误,这个规定一看就是vue2 的规定阿 解决办法vue是应用 eslint-plugin-vue 这个插件对vue的格局进行校验的咱们关上它的文档看一下能够看进去 vue3 举荐的是 plugin:vue/vue3-recommended 这个规定,而咱们的 eslintrc.js 中应用的是 plugin:vue/essential 这个,咱们批改代码如下,从新关上 App.vue 问题修复。 module.exports = { extends: [- 'plugin:vue/essential',+ 'plugin:vue/vue3-recommended', 'airbnb-base', ]}问题2:当我装置上 vue-router 在app上应用时,报文件无奈解析 解决办法咱们看到第一个错是 import/no-unresolved查看文档 次要起因是因为咱们的文件名没有文件后缀所以文件不能被 require.resolve 办法所解析,通过增加一下代码,扩大解析器的解析后缀 ...

May 14, 2022 · 1 min · jiezi

关于vite:The-server-responded-with-a-nonJavaScript-MIME-type-oftexthtml

vue3+vite打包当前,我的项目切换路由触发(偶发触发)报:After using vue-router, there is an error in packaging and running # Failed to load module script: The server responded with a non-JavaScript MIME type of "text/html". Strict MIME type checking is enforced for module scripts per HTML spec.Failed to fetch dynamically imported module..... 的确应该是vite2.xx的bug https://github.com/vitejs/vite/issues/863留神: 在应用vue3+vite时候,只发现vue-router切换时触发此景象问题:// vue3+vite此种异步路由引入办法 开发调试时的确没有问题,然而vite打包当前就会触发报错routes: [ { path: "/", name: "Home", component: import(`../views/${view}.vue`) }]解决办法:// 这样援用尽管解决了问题(浏览器会揭示,不必管),然而在一些win10自带的低版本edge浏览器中还是会罕见触发// 应该的确是vite的兼容性bug问题import { defineAsyncComponent } from 'vue'; //异步组挂载器routes: [ { path: "/", name: "Home", component: defineAsyncComponent(() => import('../views/Home.vue')); }, { path: "/about", name: "About", component: defineAsyncComponent(() => import('../views/About.vue')); }]后续继续跟进中...

May 1, 2022 · 1 min · jiezi

关于vite:使用vite创建的vue3项目安装styleresourcesloader后使用scss报错

问题形容:应用vite创立的vue3我的项目,装置style-resources-loader后应用scss报错装置scss:npm init vite 我的项目名 -- --template vue创立后的我的项目package.json如下,默认vue3+ts(按官网提醒创立我的项目即可) vue add style-resources-loader --提醒1:先git提交以后我的项目变动 --提醒2:抉择对应css预处理器即可 --提醒3:在vue.config.js内配置,默认装置完插件主动生成vue.config.js内的配置--vue.config.js配置开始报错:装置好了去App.vue里试试网上确实是应用vue add style-resources-loader命令就能够应用scss,之前用脚手架搭的vue3我的项目里亲测也是装置即可用,至于这里vite创立的vue3我的项目试了装置好几遍重启都不能够解决方案:先执行vue add style-resources-loader命令,再执行npm i sass --save-dev命令,重跑一遍我的项目就能够了相干链接:vue3官网:https://v3.cn.vuejs.org/guide/migration/introduction.html#%E6%A6%82%E8%A7%88

April 30, 2022 · 1 min · jiezi

关于vite:vite优化项目常用插件记录

import vue from '@vitejs/plugin-vue'; // vue文件编译import vueJsx from '@vitejs/plugin-vue-jsx'; // JSX语法编写组件 import legacy from '@vitejs/plugin-legacy'; // 应用它来提供对旧版本浏览器的反对import purgeIcons from 'vite-plugin-purge-icons'; // 便高效的应用Iconify中所有的图标import windiCSS from 'vite-plugin-windicss'; // windi css 款式框架import VitePluginCertificate from 'vite-plugin-mkcert'; // 应用 mkcert 为 vite https 开发服务提供证书反对import vueSetupExtend from 'vite-plugin-vue-setup-extend'; // 使 vue 脚本设置语法反对 name 属性。<script lang="ts" setup name="App"></script>import { createHtmlPlugin } from 'vite-plugin-html'; // HTML 压缩能力;EJS 模版能力;多页利用反对;反对自定义entry;反对自定义templateimport { VitePWA } from 'vite-plugin-pwa'; // 应用pwa性能import { viteMockServe } from 'vite-plugin-mock'; // 提供本地和生产模仿服务import compressPlugin from 'vite-plugin-compression'; // 应用gzip或者brotli 来压缩资源import { createStyleImportPlugin } from 'vite-plugin-style-import'; // 框架按需引入。elementUI、Ant design...import visualizer from 'rollup-plugin-visualizer'; // 可视化并剖析您的 Rollup 捆绑包以查看哪些模块占用了空间import {  viteThemePlugin,  antdDarkThemePlugin,  mixLighten,  mixDarken,  tinycolor,} from 'vite-plugin-theme'; // 用于动静更改界面主题色import viteImagemin from 'vite-plugin-imagemin'; // 压缩图片资源// 当你应用该插件的时候,指定好寄存svg的文件夹。再依照指定的形式去拜访svg图片。就能够再不产生http申请的状况下渲染出svg图片。// 【在main.js】import 'virtual:svg-icons-register'; // 引入svg icon注册脚本import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; // iconify图标// 应用vite-plugin-purge-icons插件https://iconify.design/// windicss css集成框架// 应用vite-plugin-windicsshttps://windicss.org/rollup-plugin-visualizer可视化并剖析您的 Rollup 捆绑包以查看哪些模块占用了空间 ...

April 24, 2022 · 1 min · jiezi

关于vite:naive-admin-打包报错-failed-to-load-config-from-viteconfigts

如果执行yarn build打包命令时,呈现上图的报错,可能是因为env.production 文件配置谬误,确认接口前缀配置正确,生成环境不须要配置VITE_PROXY。

April 13, 2022 · 1 min · jiezi

关于vite:Vite-入门-知识点分享

Home | Vite 官网中文文档社区插件:https://github.com/vitejs/awe...应用感触:Vite 本质是对各场景下的最佳计划的整合react 罕用配置import { defineConfig } from "vite";import path from "path";import reactRefresh from "@vitejs/plugin-react-refresh";import usePluginImport from "vite-plugin-importer";export default defineConfig({ resolve: { alias: { app: path.resolve(__dirname, "./src"), }, }, plugins: [ reactRefresh(), { ...usePluginImport({ libraryName: "xxx/ui", libraryDirectory: "es/components", customName: (name) => { return `@byte-design/ui/es/components/${name.replace( name[0], name[0].toLowerCase() )}`; }, // @ts-ignore usePluginImport 反对,然而类型束缚不正确 transformToDefaultImport: false, camel2DashComponentName: false, style: false, }), apply: "build", }, { ...usePluginImport({ libraryName: "xxx/icons", libraryDirectory: "icons", style: false, camel2DashComponentName: false, }), apply: "build", }, { ...usePluginImport({ libraryName: "xxx/hooks", libraryDirectory: "lib", style: false, camel2DashComponentName: false, }), apply: "build", }, ], build: { lib: { entry: path.resolve(__dirname, "src/index.ts"), name: "brand_components", }, // minify: false, sourcemap: true, rollupOptions: { external: [ "axios", "react", "react-router-dom", "react-dom", /\xxx\/ui/, /\xxx\/icons/, /\xxx\/hooks/, ], }, },});知识点Es Moduleimport - JavaScript | MDN兼容 反对绝大多数古代游览器动态引入// html<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <script src="module1.js" type="module"></script> </body></html>// module1.jsimport { c1 } from './module2.js';console.log(c1())// module2.jsimport { count } from "./module3.js";export const c1 = () => { return count;};动静引入export const c2 = () => { import("./module4.js").then((res) => { console.log(res.count2); });};引申:React 组件动静引入意义:将一些应用场景较少的组件动静引入,缩小外围代码的体积import React, { Suspense, lazy, useState } from 'react';const Head = lazy(() => { return import('@byted/brand-components').then((res) => { return { default: res.Head, }; });});const Loading = () => { return <div>loading</div>;};const LoadHead = () => { return ( <Suspense fallback={Loading}> <Head handleLangChange={() => console.log(11)} ssoUrl="dasd" projectType="aegir" /> </Suspense> );};export default LoadHead;[React lazy/Suspense应用及源码解析](https://zhuanlan.zhihu.com/p/...) ...

March 25, 2022 · 2 min · jiezi

关于vite:Vite打包组件库

动机去年应用vue3 + TSX封装组件,后果卡在了打包上,直到最近发现,vite提供了tsx的打包插件。 组件筹备手把手创立Vue3组件库 在packages/index.ts中引入相干的组件、工具库、款式。 Vite配置// bin/build.js// node包,commonjs标准const path = require('path')const { defineConfig, build } = require('vite')const vue = require('@vitejs/plugin-vue') const vueJsx = require('@vitejs/plugin-vue-jsx')// 打包的入口文件const entryDir = path.resolve(__dirname, '../packages')// 进口文件夹const outDir = path.resolve(__dirname, '../lib')// vite根底配置const baseConfig = defineConfig({ configFile: false, publicDir: false, plugins: [vue(), vueJsx()]})// rollup配置const rollupOptions = { // 确保内部化解决那些你不想打包进库的依赖 external: [ 'vue' ], output: { // 在 UMD 构建模式下为这些内部化的依赖提供一个全局变量 global: [ vue: 'Vue' ] }}// 全量打包构建const buildAll = async () => { await build({ ...baseConfig, build: { rollupOptions, lib: { entry: path.resolve(entryDir, 'index.ts'), name: '', // umd的变量名 fileName: (format) => `index.${format}.js`, // 输入文件名 formats: ['es', 'umd'], }, outDir } })}const build = async () => { await buildAll()}build()pkg#scripts"scripts": { "build:lib": "node ./bin/build.js"}申明组件模块避免typescript中引入module报错// packages/vue.d.tsdeclare module '*.vue' { import { DefineComponent } from 'vue' const component: DefineComponent<{}, {}, any> export default component}

March 23, 2022 · 1 min · jiezi

关于vite:在-Vue3-Vite2-按需使用-SVG-图标的另一种方式

须要最初达到的应用目标 <!-- 引入 mdi 下的 account 图标作为图标 --><v-icon icon="mdi-account" /><!-- 引入 src/icons/dashboard.svg 自定义图标作为图标 --><v-icon icon="dashboard" /><!-- 引入 mdi 下的 arrow-up-bold-circle 图标作为前置按钮图标 --><v-button prepend-icon="mdi-arrow-up-bold-circle">按钮</v-button>VIcon 组件假如咱们首先封装一个 v-icon 组件在 src/components/VIcon.vue 。 <template> <i class="v-icon"> <slot /> </i></template><style scoped> .v-icon { display: inline-block; width: 1em; height: 1em; font-size: 1em; } .v-icon > svg { width: 100%; height: 100%; }</style>应用 unplugin-icons 作为图标按需加载在目前的解决方案中,可能会应用 unplugin-icons 插件在 SFC 中动态按需加载图标。 <script setup> import IconAccessibility from '~icons/carbon/accessibility'</script><template> <v-icon> <icon-accessibility /> </v-icon></template>配合 unplugin-vue-components 主动导入省去 script 的 import 局部。 ...

March 22, 2022 · 3 min · jiezi

关于vite:Vite-实战手把手教你写一个-Vite-插件

哈喽,很快乐你能点开这篇博客,本博客是针对 Vite 的体验系列文章之实战篇,认真看完后置信你也能如法炮制写一个属于本人的 vite 插件。 Vite 是一种新型的前端构建工具,可能显著晋升前端开发体验。我将会从 0 到 1 实现一个 vite:markdown 插件,该插件能够读取我的项目目录中的 markdown 文件并解析成 html,最终渲染到页面中。 如果你还没有应用过 Vite,那么你能够看看我的前两篇文章,我也是刚体验没两天呢。(如下) Vite + Vue3 初体验 —— Vite 篇Vite + Vue3 初体验 —— Vue3 篇本系列文件还对 Vite 源码进行了解读,往期文章能够看这里: Vite 源码解读系列(图文联合) —— 本地开发服务器篇Vite 源码解读系列(图文联合) —— 构建篇Vite 源码解读系列(图文联合) —— 插件篇实现思路其实 vite 插件的实现思路就是 webpack 的 loader + plugin,咱们这次要实现的 markdown 插件其实更像是 loader 的局部,然而也会利用到 vite 插件的一些钩子函数(比方热重载)。 我须要先筹备一个对 markdown 文件进行转换,转换成 html 的插件,这里我应用的是 markdown-it,这是一个很风行的 markdown 解析器。 其次,我须要辨认代码中的 markdown 标签,并读取标签中指定的 markdown 文件,这一步能够应用正则加上 node 的 fs 模块做到。 ...

March 16, 2022 · 4 min · jiezi

关于vite:vitetypescript项目配置-alias

1. 配置vite.config.ts//因为node.js暂不反对ts,须要先装置@types/node,能力应用path模块//npm install @types/node -D import { resolve } from "path";...module.exports = { ... resolve: { ... alias: { "@api": path.join(__dirname, 'api'), "@utils": path.join(__dirname, 'utils') } }}2. 配置tsconfig.json{ "compilerOptions": { ... "baseUrl": ".", //未设置 "baseUrl" 时,不容许应用非相对路径。 "paths": { "@api/*": ["src/api/*"], // 应用别名下的模块 "@utils/*": ["src/utils/*"], "@utils": ["src/utils/index.ts"] } }, ...}

March 5, 2022 · 1 min · jiezi

关于vite:Vite-源码解读系列图文结合-插件篇

哈喽,很快乐你能点开这篇博客,本博客是针对 Vite 源码的解读系列文章,认真看完后置信你能对 Vite 的工作流程及原理有一个简略的理解。 Vite 是一种新型的前端构建工具,可能显著晋升前端开发体验。我将会应用图文联合的形式,尽量让本篇文章显得不那么干燥(显然对于源码解读类文章来说,这不是个简略的事件)。 如果你还没有应用过 Vite,那么你能够看看我的前两篇文章,我也是刚体验没两天呢。(如下) Vite + Vue3 初体验 —— Vite 篇Vite + Vue3 初体验 —— Vue3 篇本篇文章是 Vite 源码解读系列的第三篇文章,往期文章能够看这里: Vite 源码解读系列(图文联合) —— 本地开发服务器篇Vite 源码解读系列(图文联合) —— 构建篇本篇文章解读的次要是 vite 源码本体,在往期文章中,咱们理解到: vite 在本地开发时通过 connect 库提供开发服务器,通过中间件机制实现多项开发服务器配置,没有借助 webpack 打包工具,加上利用 rollup (局部性能)调度外部 plugin 实现了文件的转译,从而达到小而快的成果。vite 在构建生产产物时,将所有的插件收集起来,而后交由 rollup 进行解决,输入用于生产环境的高度优化过的动态资源。本篇文章,我会针对贯通前两期文章的 vite 的插件 —— @vitejs/plugin-vue 来进行源码解析。 好了,话不多说,咱们开始吧! vite:vuevite:vue 插件是在初始化 vue 我的项目的时候,就被主动注入到 vite.config.js 中的插件。(如下) import { defineConfig } from 'vite'import vue from '@vitejs/plugin-vue'// https://vitejs.dev/config/export default defineConfig({ plugins: [ vue() ]});该插件导出了几个钩子函数,这几个钩子函数,局部是用于 rollup,局部是 vite 专属。(如下图) ...

March 5, 2022 · 5 min · jiezi

关于vite:vue3tsvite-问题汇总

1、vscode vue3插件与vue2插件抉择注意事项(待欠缺)2、ts 函数重载(待欠缺)

February 27, 2022 · 1 min · jiezi

关于vite:记一次vite2x打包优化过程

背景最近做的需要是在客户端webview内嵌h5,应用的 vite2.x 和 vue3 来开发,在第一版提测的时候,发现打包之后,总包大小有 4M 多,有很大的优化的空间。 工具链阐明目前 vite2.x 是基于 rollup 打包的,而不是 esbuild,详见这里应用 rollup-plugin-visualizer 进行打包剖析,打包之后,会在根目录默认生成一个 stats.html 文件应用 vite-plugin-imagemin 进行图片压缩。每次打包都会压缩一次,会占用构建耗时,有值得优化的空间,此处先不作探讨@vitejs/plugin-legacy vite默认对浏览器反对的基线是反对 ESM 的古代浏览器,这个插件就是用来兼容不反对 ESM 的浏览器,详见这里本文波及到的配置文件和脚本都放在我的仓库了:https://github.com/Rockergmail/imagemin-script优化前 vite.config.js 配置如下 import { UserConfigExport, ConfigEnv } from 'vite';import vue from '@vitejs/plugin-vue';import { viteVConsole } from 'vite-plugin-vconsole';import { resolve } from 'path';import legacy from '@vitejs/plugin-legacy';import { visualizer } from 'rollup-plugin-visualizer';export default ({ mode }: ConfigEnv): UserConfigExport => { return { plugins: [ vue(), styleImport({ libs: [ { libraryName: 'vant', esModule: true, resolveStyle: (name) => `vant/es/${name}/style` } ] }), viteVConsole({ entry: resolve(__dirname, './src/main.ts').replace(/\\/g, '/'), localEnabled: mode !== 'prod', // dev environment enabled: mode !== 'prod', // build production config: { maxLogNumber: 1000, theme: 'light' } }), legacy({ targets: ['ie >= 11'], additionalLegacyPolyfills: ['regenerator-runtime/runtime'], renderLegacyChunks: true, polyfills: [ 'es.symbol', 'es.array.filter', 'es.promise', 'es.promise.finally', 'es/map', 'es/set', 'es.array.for-each', 'es.object.define-properties', 'es.object.define-property', 'es.object.get-own-property-descriptor', 'es.object.get-own-property-descriptors', 'es.object.keys', 'es.object.to-string', 'web.dom-collections.for-each', 'esnext.global-this', 'esnext.string.match-all' ] }, visualizer() ], build: { target: 'es2015', outDir: './dist/', cssCodeSplit: true } };};打包输入信息如下: ...

February 26, 2022 · 11 min · jiezi

关于vite:Vite-源码解读系列图文结合-构建篇

哈喽,很快乐你能点开这篇博客,本博客是针对 Vite 源码的解读系列文章,认真看完后置信你能对 Vite 的工作流程及原理有一个简略的理解。 Vite 是一种新型的前端构建工具,可能显著晋升前端开发体验。我将会应用图文联合的形式,尽量让本篇文章显得不那么干燥(显然对于源码解读类文章来说,这不是个简略的事件)。 如果你还没有应用过 Vite,那么你能够看看我的前两篇文章,我也是刚体验没两天呢。(如下) Vite + Vue3 初体验 —— Vite 篇Vite + Vue3 初体验 —— Vue3 篇本篇文章是 Vite 源码解读系列的第二篇文章,往期文章能够看这里: Vite 源码解读系列(图文联合) —— 本地开发服务器篇本篇文章解读的次要是 vite 源码本体,上一篇文章中提到 vite 通过 connect 库提供开发服务器,通过中间件机制实现多项开发服务器配置。而 vite 在本地开发时没有借助 webpack 或是 rollup 这样的打包工具,而是通过调度外部 plugin 实现了文件的转译,从而达到小而快的成果。 本篇文章,我会针对 vite 的生产产物构建,也就是 vite build 命令进行具体解析。 好了,话不多说,咱们开始吧! vite build在运行 vite build 命令时,外部调用了 doBuild 办法,该办法最终应用 rollup 来进行利用构建。 resolveConfig和本地开发服务相似,doBuild 第一步先进行了配置信息的收集。在这一步中,resolveConfig 办法做了这几件事件: 解决插件执行程序合并插件配置解决 alias读取环境变量配置导出配置最终将配置导出后,用于接下来的构建操作,上面是导出的配置详情,感兴趣的同学能够本人打断点查看。(如下图) 接下来,是对一些变量的定义,以及输入以后 vite 版本。(如下图) 配置项阐明config.buildvite 的构建选项input我的项目入口文件,默认是我的项目根目录下的 index.htmloutDir构建产物的输入目录ssr生成面向 SSR 的构建libOptions/lib构建为库时才须要整合插件而后,vite 整合了我的项目配置的插件和 vite 自带的插件,用于后续 rollup 的编译工作。(如下图) ...

February 25, 2022 · 1 min · jiezi

关于vite:Vite-源码解读系列图文结合-本地开发服务器篇

哈喽,很快乐你能点开这篇博客,本博客是针对 Vite 源码的解读系列文章,认真看完后置信你能对 Vite 的工作流程及原理有一个简略的理解。 Vite 是一种新型的前端构建工具,可能显著晋升前端开发体验。我将会应用图文联合的形式,尽量让本篇文章显得不那么干燥(显然对于源码解读类文章来说,这不是个简略的事件)。 如果你还没有应用过 Vite,那么你能够看看我的前两篇文章,我也是刚体验没两天呢。(如下) Vite + Vue3 初体验 —— Vite 篇Vite + Vue3 初体验 —— Vue3 篇本篇文章解读的次要是 vite 源码本体,vite 通过 connect 库提供开发服务器,通过中间件机制实现多项开发服务器配置。而 vite 在本地开发时没有借助 webpack 或是 rollup 这样的打包工具,而是通过调度外部 plugin 实现了文件的转译,从而达到小而快的成果。 好了,话不多说,咱们开始吧! vite dev我的项目目录本文浏览的 Vite 源码版本是 2.8.0-beta.3,如果你想要和我一起浏览的话,你能够在这个地址下载 Vite 源码。 咱们先来看看 Vite 这个包的我的项目目录吧。(如下图) 这是一个集成治理的我的项目,其外围就是在 packages 外面的几个包,咱们来别离看看这几个包是做什么的吧。(如下) 包名作用viteVite 主库,负责 Vite 我的项目的本地开发(插件调度)和生产产物构建(Rollup 调度)create-vite用于创立新的 Vite 我的项目,外部寄存了多个框架(如 react、vue)的初始化模板plugin-vueVite 官网插件,用于提供 Vue 3 单文件组件反对plugin-vue-jsxVite 官网插件,用于提供 Vue 3 JSX 反对(通过 专用的 Babel 转换插件)。plugin-reactVite 官网插件,用于提供残缺的 React 反对plugin-legacyVite 官网插件,用于为打包后的文件提供传统浏览器兼容性反对playgroundVite 内置的一些测试用例及 Demo这几个源码仓库其实有浏览的价值,然而咱们这次还是先专一一下咱们本期的主线 —— Vite,从 Vite 开始吧。 ...

February 23, 2022 · 3 min · jiezi

关于vite:Day-30100-Vuecli-改为-Vite20

1、需要Vue3我的项目开发时,随着我的项目模块的变多启动很慢,HRM的更新也挺慢的。想变快一些。 2、Vue-cli 改为 Vite应用webpack-to-vite将webpack 转为vite的形式。 1)装置及转化命令 npm install @originjs/webpack-to-vite -gwebpack-to-vite <project path>2)装置后 cd ocrnpm installnpm run serve-vite3、title报错须要在配置文件.env.development中增加title = 'VDS'的配置 参考链接1、官网https://cn.vitejs.dev/guide/w... 2、webpack-to-vitehttps://github.com/originjs/w...

February 22, 2022 · 1 min · jiezi

关于vite:基于Vue3ViteTS二次封装elementplus业务组件

download:基于Vue3+Vite+TS,二次封装element-plus业务组件有时候咱们会有这样的一个需要:咱们定义了一个 Python 的方法,方法接收一些参数,然而调用的时候想将这些参数用命令行暴露出来。比方说这里有个爬取方法:import requests def scrape(url, timeout=10): response = requests.get(url, timeout=timeout)print(response.text)复制代码这里定义了一个 scrape 方法,第一个参数接收 url,即爬取的网址,第二个参数接收 timeout,即指定超时工夫。调用的时候咱们可能这么调用:scrape('https:///www.baidu.com', 10)复制代码如果咱们想改参数换 url,那就得改代码对吧。所以有时候咱们就想把这些参数用命令行暴露出来,这时分咱们可能就用上了 argparse 等等的库,挨个申明各个参数是干嘛的,非常繁琐,代码如下:parser = argparse.ArgumentParser(description='Scrape Function')parser.add_argument('url', type=str, help='an integer for the accumulator')parser.add_argument('timeout', type=int, help='sum the integers (default: find the max)')if name == '__main__': args = parser.parse_args()scrape(args.url, args.timeout)复制代码这样咱们才能顺利地使用命令行来调用这个脚本:python3 main.py https://www.baidu.com 10复制代码是不是感觉非常麻烦?argparse 写起来又臭又长,想想就费劲。Fire但接下来咱们要介绍一个库,用它咱们只需要两行代码就可能做到如上操作。这个库的名字叫做Fire,它可能疾速为某个 Python 方法或者类增加命令行的参数反对。先看看安装方法,使用 pip3 安装即可:pip3 install fire复制代码这样咱们就安装好了。使用上面咱们来看几个例子。方法反对第一个代码示例如下:import fire def hello(name="World"):return "Hello %s!" % name if name == '__main__':fire.Fire(hello)复制代码这里咱们定义了一个 hello 方法,而后接收一个 name 参数,默认值是 World,接着输入了 Hello 加 name 这个字符串。而后接着咱们导入了 fire 这个库,调用它的 Fire 方法并传入 hello 这个方法申明,会发生什么事件呢?咱们把这段代码保存为 demo1.py,接着用 Python3 来运行一下:python3 demo1.py复制代码运行后果如下:Hello World!复制代码看起来并没有什么不同。但咱们这时分如果运行如下命令,就可能看到一些神奇的事件了:python3 demo1.py --help ...

February 20, 2022 · 1 min · jiezi

关于vite:关于Vite配置preprocessorOptionsscssadditionalData全局引入scss文件无效问题

在vite我的项目中,有时候咱们须要全局引入css变量、scss变量,或者引入全局scss款式文件,vite提供了以下这种配置形式 //vite.config.jscss: { preprocessorOptions: { //define global scss variable scss: { additionalData: `@import '@/styles/variables.scss';`, }, },}这种写法没有任何问题,并且我曾经在一些我的项目中实际过了,可有一次我创立新我的项目的时候却有效了,在浏览器上也没有看到任何相干的款式,然而在main.js中引入又是失常的 我先是排查写法和门路是否有问题,而后排查sass或者vite的版本是否有问题,排查几个小时下来发现都没有问题,纳闷不已,惟一能确定的是vite的问题 于是我就想,兴许他人也碰到过这种问题,当我找遍各大博客网站都没答案后(一大堆斗争说间接在main.js引入就好的),我筹备去Vite仓库提各Issue 当我尝试查一下有没有相似的Issue时,发现居然有好几个相似的Issue,还是敞开状态,难道这个问题曾经解决了?我一个一个点开看,终于在其中一个Issue中找到了答案 #issue5682 原来这不是一个bug,只有在main.js引入一个其余scss文件或者在.vue文件中应用<style lang="scss"><style>,并且外面有内容,则 scss.additionalData 配置的全局scss文件就能够正确引入了,还倡议咱们在 scss.additionalData 引入的文件最好只写scss变量,别写css变量,因为css变量是运行时属性 至此,这个问题算是圆满解决了 最近我开源了一个Vite+Vue3+NaiveUI+Pinia的轻量级后盾治理模板,十分实用于中小型我的项目或者集体我的项目,感兴趣的能够看下,欢送参加开源、star、fork 文章: Vite+Vue3+NaiveUI+Pinia搭建一套优雅的后盾治理模板,真香 - 掘金 (juejin.cn) 预览: template.qszone.com 源码: github:(https://github.com/zclzone/vue-naive-admin) gitee:(https://gitee.com/zclzone/vue-naive-admin)

February 18, 2022 · 1 min · jiezi

关于vite:vite配置项目路径别名

webpack中能够通过resolve.alias定义我的项目门路别名,这样能够在引入文件时,不再须要应用相对路径,对立以根门路(/src/)作为终点。 vite同样反对门路别名的定义: // vite.config.js/tsimport { join } from "path";import { defineConfig } from 'vite'// https://vitejs.dev/config/export default defineConfig({ resolve: { alias: { '@': join(__dirname, "src"), } }})如果我的项目是TypeScript编写,还须要批改一下TypeScript的配置: { // ... "compilerOptions": { // ...其余配置 "baseUrl": ".", "paths": { "@/*": ["src/*"] } }, // ...}如果你是刚创立的TypeScript我的项目,有可能会遇到找不到模块“path”或其相应的类型申明的谬误提醒,装置@types/node即可。 npm install @types/node --save-dev

February 16, 2022 · 1 min · jiezi

关于vite:记录一下vite打包vue3组件库使用组件库时报-reading-isCE-错误问题

之前用vue3写了一个【国际化的手机区号、国籍代码抉择组件】,之前苦于打包配置出错始终未能公布至npm中,最近把打包配置搞好了,也公布至npm上了,过了几天有人应用上了我的组件,但却报错了,这让我十分头疼,在我本地跑没问题,在他的环境上却会报错,而后就开始各种查找材料,最终还是找到问题所在了1、报错报错内容为:Cannot read properties of null (reading 'isCE'),如图: 呈现这个问题的起因为:应用了两个不同版本的 Vue 2、解决问题:第一步解决这个问题的第一步:不能将Vue自身打包进组件库代码中 以下是至关重要的配置(这里应用vite打包):vite.build.config.js export default { input: 'xxxx.js', output: { globals: { vue: 'Vue' // 咱们的仓库理论依赖vue, vue是不须要打包的,所以这里阐明咱们用了一个全局变量vue }, name: 'xxxx', file: `lib/xxx.ems.min.js`, format: 'esm', }, /******这一步至关重要,如果不配置 external: ['vue'],则组件库中会蕴含vue代码******/ // 不将vue代码打包进咱们的组件库代码中,如果将vue代码打包进组件库中则会报错 external: ['vue']}2、解决问题:第二步解决问题的第二步:将Vue从package.json中的dependencies中移除掉 Vue3的依赖能够增加到devDependencies中,然而不能增加到dependenciespackage.json { "dependencies": {}, "devDependencies": { ... "vite": "2.2.3", "vue": "^3.2.29" },}如果dependencies中有Vue依赖,那么在我的项目中应用时就有可能会报 Cannot read properties of null (reading 'isCE') 谬误,因为我的项目中依赖的Vue版本与你组件库中依赖的可能不一样。 至此,Cannot read properties of null (reading 'isCE') 谬误就解决了! 3、分享下我的组件代码仓库:vue3-country-intl装置:npm install vue3-country-intl -S性能:抉择各国手机区号/国籍代码、展现各国国旗 ...

February 16, 2022 · 1 min · jiezi

关于vite:vue2项目迁移到vite

背景为什么选用vite,其实就是为了解决官网说的2个起因 迟缓的服务器启动迟缓的更新危险剖析为什么不必vue3?生产环境须要兼容到ie11,很显著vue3不会反对,同时vue2迁徙起来老本较小 vite对ie11的兼容性反对官网有 @vitejs/plugin-legacy反对传统浏览器 社区反对社区曾经有vue2+vite的例子,能够间接调试,减低学习老本vite-vue2-simple-starter 迁徙老本因为是尝鲜,因而先迁徙子系统,把坑都踩了,不便前面深刻优化

February 15, 2022 · 1 min · jiezi

关于vite:ViteVue3NaiveUIPinia搭建一套优雅的后台管理模板真香

趁着春节放假,欠缺了一下春节前本人搭建的后盾治理模板的文档,在欠缺文档的同时又删改了局部不是bug的代码,讲真,有强迫症和代码洁癖的我搭建这套模板的进度属实是有点慢了,然而究竟还是实现了,只管这是第一个版本 首先申明,这个模板参考了多个风行的Vue3后盾治理模板,次要是Vben Admin,毫无疑问这是一个十分优良且风行的后盾治理模板,然而对老手并不敌对,学习老本较高,甚至对一个中级前端来说要间接上手二次开发也是有肯定难度的 简介Vue Naive Admin,一个基于 Vue3.0、Vite、Naive UI 的后盾治理模板,相较于其余比拟风行的后盾治理模板,此我的项目绝对简洁、轻量,没有集成 TypeScript,没有集成国际化,没有集成简单的主题配置,学习老本非常低,对老手极其敌对。不过麻雀虽小五脏俱全,权限、Mock、菜单、axios 封装、pinia、我的项目配置、款式配置、环境配置,以及一些常常用的根底组件封装等等这些该有的都有,通过参考多个 vue3 后盾治理模板后以最简洁优雅的形式实现,十分实用于中小型我的项目或者集体我的项目,当然,以此模板进行二次封装革新用于大型项目也未尝不可。 为什么要开发这个模板Vue3 和 Vite 曾经趋于成熟,学习 vite 和 vue3 十分有必要,通过开发模板进行学习是一个很好的形式,事实也证实我的确从中获益良多目前支流的 Vue3+Vite 后盾治理模板都绝对简单,甚至感觉有点花里胡哨(没有贬斥的意思,大部分的架构设计都很优良,只是感觉集成了太多不实用的货色)本人搭的模板开发起来才最棘手。自己很恶感拿他人的模板间接上手开发,如果非要拿他人的模板开发也会尽量先吃透再用,不吃透就没有代码的掌控感和安全感性能 集成 Naive UI,尤大举荐的 UI 组件库,很香,https://www.naiveui.com 集成登陆、登记及权限验证(暂只反对角色页面权限,后续思考增加按钮权限) 集成多环境配置,dev、测试、预公布和生产 集成 eslint + prettier,代码束缚和格式化对立 集成 Mock 接口服务,dev 环境和公布环境都反对,可动静配置是否启用 mock 服务,不启用时不会加载 mock 包,缩小打包体积 集成 unocss,antfu 大神开源的原子化 css 解决方案,十分轻量,目前我是本人写 scss 款式搭配着 unocss 应用的,很香 集成 pinia,Vuex 的代替计划,轻量、简略、易用,很香 集成 axios,反对多 axios 实例,反对线上环境免从新打包批改 baseURL 二次封装全局 Dialog、Message、LoadingBar 组件 二次封装 localStorage 和 sessionStorage,反对设置过期工夫源码github: https://github.com/zclzone/vu...gitee: https://gitee.com/zclzone/vue...预览https://template.qszone.com 文档羽雀文档:Vue Naive Admin ...

February 10, 2022 · 1 min · jiezi

关于vite:vitevue3vuerouter项目中vuerouter报错的问题

vite当初创立的vue我的项目曾经默认为vue3了,然而在引入vue-router时,会有个坑,十分坑。就是vue-router报错问题,始终提醒createRouter为undefined或者其余的对于vue-router报错的问题,次要原始是vue-router版本问题,间接降级到最新版本即可:npm i vue-router@4当然,装置最新版本前要先卸载之前的版本,而后重启我的项目,解决!

January 30, 2022 · 1 min · jiezi

关于vite:Vite-Vue3-初体验-Vite-篇

Vite 和 Vue3 在 2022 年应该不算个新事物了,但应该也有很多像我一样还没有接触过这两个 “陈腐玩意” 的。 这两样(Vite + Vue3)给我的感觉是完完全全的陈腐玩具,是新时代的潮流。 看着手里的 webpack + Vue2,想着会不会像几年前的 angularjs + gulp 一样,成为历史。 邻近年关,也有了一些空闲工夫,来认识一下被人安利屡次的新型前端构建工具 Vite + 全新降级的 Vue3 吧! 从 Vite 开始先来看看 Vite 的官网介绍吧。 能够看出,在本地开发时,Vite 应用了 原生 ES 模块:古代浏览器(比方最新版谷歌)曾经不须要依赖 webpack 治理包模块,而是能够和 Nodejs 一样具备模块治理能力,这就是 原生 ES 模块 能力。 所以,在本地开发时,Vite 省略了一些耗时的编译过程,热更新天然快。 在构建生产产物时,能够构建古代浏览器产物,也能够通过 Rollup 输入生产环境的高度优化过的动态资源。—— 这个高度优化到什么水平,咱们能够在前面的文章里去探讨一下。 上手Vite 的上手应用很简略,间接运行 npm create vite@latest 命令即可。 npm create 其实就是 npm init 命令,而 npm init 命令带上包名执行的就是 npm exec,也就是执行 vite 包的默认命令 —— 初始化。输出命令后,须要增加项目名称和技术栈,能够看到可供选择的技术栈有这么几种(如下图) ...

January 22, 2022 · 2 min · jiezi

关于vite:vite-vue3-ts-使用总结

现阶段开发 vue3 我的项目应用 vite + ts 应该已成为规范范式了吧,新的语法体验 vue composition api 再配合 script setup 谁用谁晓得啊,开发和构建方面,vite 作为下一代构建工具,想必大家也有所理解,应用 ES6 module + ESbuild 反对本地开发,速度和效率腾飞啊,就一个字——爽,对于 TypeScript,感觉都没必要说了,当初还没上车的连忙的了~ <!-- more --> 前言vite 作为一个构建工具,咱们目前理解如何应用即可,该工具足够优良,默认对很多性能都做到了反对(css module、less、scss),且其作为 vue之父尤大大的作品,对于 vue也有着较好的反对,目前使用率也曾经很高了,nuxt等多个大我的项目都已反对,联合文档和社区,目前应用足够了,也无需放心疑难杂症~,快上车~ vue3,感觉变动最大的就是全面拥抱了函数式编程,联合 composition api 当初真的能够做到对于简单业务代码的轻松治理,摈弃以前的 this this 一大堆,不敌对的mixin ,应用当初的 hooks解决,逻辑复用、功能模块拆分几乎太不便了,语法、api应用上也优雅不便了很多,很值得一试 另一大亮点就是 vue3对 TS的良好反对,当初我的项目能够全面拥抱 TS写法了,而后与 setup 再联合我接下来举荐的几款工具,组合起来应用,几乎不要太爽 对于 TS,首先要做到对类型的定义,这是和传统写JS有所不同的中央,然而这一步却是很必要也很值得的,这对你接下来的工作或者说对于这个我的项目的当前都是有很大的益处 如这样一个场景,和后端接口对接: 在后期,咱们拿到接口文档,依照格局和类型定义好对应 TS类型,并联合 Mock写好接口和业务逻辑,应用时通过TS能够高效的实现代码开发,同时能够极大的防止犯错,对于前期保护迭代有很大的保障 import.meta应用 vite做为构建工具,能够通过 import.meta获取对应办法不便疾速的解决业务 环境变量获取import.meta.env // console.log(import.meta.env){ "BASE_URL": "/", "MODE": "development", "DEV": false, "PROD": true, "SSR": false}留神: 配合.env/.env.development/.env.production等文件设置环境变量应用时,变量Key应该以VITE_为前缀 { "script":{ "dev": "vite --mode development" }}为了避免意外透露 env 变量给客户端,只有以 VITE_为前缀的变量才会裸露给 Vite 解决的代码。只会向您的客户端源代码VITE_SOME_KEY公开import.meta.env.VITE_SOME_KEY,但DB_PASSWORD不会。批量解决文件import.meta.globEager ...

January 17, 2022 · 3 min · jiezi

关于vite:vite-vue3-setup-pinia-ts-项目实战

介绍一个应用 vite + vue3 + pinia + ant-design-vue + typescript 残缺技术路线开发的我的项目,秒级开发更新启动、新的vue3 composition api 联合 setup纵享丝滑般的开发体验、全新的 pinia状态管理器和优良的设计体验(1k的size)、antd无障碍过渡应用UI组件库 ant-design-vue、平安高效的 typescript类型反对、代码标准验证、多级别的权限治理~ 前言前两天接到了一个需要,就是把原来的一个我的项目的次要功能模块和用户模块权限零碎抽出来做一个新后盾我的项目,并迭代新增一些新性能,看起来如同也没啥货色 拿到源码看了下我的项目,好家伙,原我的项目是个微利用我的项目,主利用用户模块是react技术栈,子利用模块是vue2技术栈,这间接 CV大法看样子是不行了,我这要做的毕竟是个单页面利用,确定一个技术路线即可,具体看下代码逻辑并跑起来看看 跑起来试了下,两个我的项目根本都是1分钟左右启动,看代码vue我的项目整个业务逻辑代码都拧在一块写了 想到之前问老大要源码的时候,说那个是老我的项目了,从新搭一个写应该会快点 这话没故障啊,话不多说,间接开整,这次间接上 vite + vue3 个性✨脚手架工具:高效、疾速的 Vite前端框架:眼下最时尚的 Vue3状态管理器:vue3新秀 Pinia,犹如 react zustand般的体验,敌对的api和异步解决开发语言:政治正确 TypeScriptUI组件:antd开发者无障碍过渡应用 ant-design-vue,相熟的配方相熟的滋味css款式:less 、postcss代码标准:Eslint、Prettier、Commitlint权限治理:页面级、菜单级、按钮级、接口级✊依赖按需加载:unplugin-auto-import,可主动导入应用到的vue、vue-router等依赖组件按需导入:unplugin-vue-components,无论是第三方UI组件还是自定义组件都可实现主动按需导入以及TS语法提醒我的项目目录├── .husky // husky git hooks配置目录 ├── _ // husky 脚本生成的目录文件 ├── commit-msg // commit-msg钩子,用于验证 message格局 ├── pre-commit // pre-commit钩子,次要是和eslint配合├── config // 全局配置文件 ├── vite // vite 相干配置 ├── constant.ts // 我的项目配置 ├── themeConfig.ts // 主题配置├── dist // 默认的 build 输入目录├── mock // 前端数据mock├── public // vite我的项目下的动态目录└── src // 源码目录 ├── api // 接口相干 ├── assets // 公共的文件(如image、css、font等) ├── components // 我的项目组件 ├── directives // 自定义 指令 ├── enums // 自定义 常量(枚举写法) ├── hooks // 自定义 hooks ├── layout // 全局布局 ├── router // 路由 ├── store // 状态管理器 ├── utils // 工具库 ├── views // 页面模块目录 ├── login // login页面模块 ├── ... ├── App.vue // vue顶层文件 ├── auto-imports.d.ts // unplugin-auto-import 插件生成 ├── components.d.d.ts // unplugin-vue-components 插件生成 ├── main.ts // 我的项目入口文件 ├── shimes-vue.d.ts // vite默认ts类型文件 ├── types // 我的项目type类型定义文件夹├── .editorconfig // IDE格局标准├── .env // 环境变量├── .eslintignore // eslint疏忽├── .eslintrc // eslint配置文件├── .gitignore // git疏忽├── .npmrc // npm配置文件├── .prettierignore // prettierc疏忽├── .prettierrc // prettierc配置文件├── index.html // 入口文件├── LICENSE.md // LICENSE├── package.json // package├── pnpm-lock.yaml // pnpm-lock├── postcss.config.js // postcss├── README.md // README├── tsconfig.json // typescript配置文件└── vite.config.ts // vite开发我的项目初始化如果应用vscode编辑器开发vue3,请务必装置Volar插件与vue3配合应用更佳(与本来的Vetur不兼容)应用 vite cli 疾速创立我的项目 ...

January 17, 2022 · 7 min · jiezi

关于vite:用-vite-构建项目同时支持微前端

得益于 esbuild 的超高性能,vite 在诞生之初就备受关注,且始终放弃着沉闷的开发迭代。截至目前,vite 曾经迭代到了 2.7.10 版本,各方面也根本具备了在生产应用的条件。这段时间,我在我的项目中尝试了应用 vite 进行打包构建,本文就是这次构建的过程记录。 根底配置首先应用vite 官网脚手架生成我的项目。 yarn create vite vite-demo --template react-ts下面这行命令应用 react-ts 模板创立了一个叫 vite-demo 的我的项目。因为我在的团队日常应用 react 和 typescript 开发居多,因而抉择了 react-ts 这个模板,vite 官网反对的模板还有很多,能够在 create-vite 中查看。我的项目初始化实现当前,目录构造如下: .|____index.html|____.gitignore|____package.json|____tsconfig.json|____vite.config.ts|____src| |____App.tsx| |____main.tsx| |____App.css| |____index.css| |____vite-env.d.ts| |____logo.svg| |____favicon.svg其中 vite.config.ts 内容如下: import { defineConfig } from 'vite'import react from '@vitejs/plugin-react'// https://vitejs.dev/config/export default defineConfig({ plugins: [react()]})能够看出,vite 官网曾经做了比较完善的封装,相较于之前版本,开发体验晋升了很多。依照批示装置完依赖,启动利用当前,速度的确很快。当初咱们来做一些根本革新。 我通常应用 less 来写款式,vite 曾经做了很好的反对,在装置完依赖当前,只须要间接在代码中援用 xxx.less 即可。对于一个久经考验的开发者来说,款式还是要引入作用域的,通常应用 css modules。 装置 less 预处理器, yarn add --dev less而后批改 vite.config.ts 文件,增加 css modules 配置: ...

January 14, 2022 · 3 min · jiezi

关于vite:基于Vue3ViteTS二次封装elementplus业务组件

基于Vue3+Vite+TS,二次封装element-plus业务组件为什么要对SpringBoot返回对立的标准格局在默认情况下,SpringBoot的返回格局常见的有三种: 第一种:返回 String @GetMapping("/hello")public String getStr(){ return "hello,javadaily";}download复制代码此时调用接口获取到的返回值是这样: hello,javadaily复制代码第二种:返回自定义对象 @GetMapping("/aniaml")public Aniaml getAniaml(){ Aniaml aniaml = new Aniaml(1,"pig"); return aniaml;}复制代码此时调用接口获取到的返回值是这样: { "id": 1, "name": "pig"}复制代码第三种:接口异样 @GetMapping("/error")public int error(){ int i = 9/0;return i;}复制代码此时调用接口获取到的返回值是这样: { "timestamp": "2021-07-08T08:05:15.423+00:00", "status": 500, "error": "Internal Server Error", "path": "/wrong"}复制代码基于以上种种情况,如果你和前端开发人员联调接口她们就会很懵逼,因为咱们没有给他一个对立的格局,前端人员不知道如何处理返回值。 还有甚者,有的同学比如小张喜爱对后果进行封装,他使用了Result对象,小王也喜爱对后果进行包装,然而他却使用的是Response对象,当出现这种情况时我相信前端人员肯定会抓狂的。 所以咱们我的项目中是需要定义一个对立的标准返回格局的。download定义返回标准格局一个标准的返回格局至多蕴含3部分: status 状态值:由后端对立定义各种返回后果的状态码message 描述:本次接口调用的后果描述data 数据:本次返回的数据。{ "status":"100", "message":"操作胜利", "data":"hello,javadaily"}复制代码当然也可能按需加入其余扩大值,比如咱们就在返回对象中增加了接口调用工夫 timestamp: 接口调用工夫定义返回对象@Datapublic class ResultData<T> { /* 后果状态 ,具体状态码参见ResultData.java/ private int status; private String message; private T data; private long timestamp ; public ResultData (){ ...

January 5, 2022 · 1 min · jiezi

关于vite:一份关于viteconfigts项目常用项配置

vite.config.ts残缺的配置我已上传GitHub,点击查看 这是通过这个配置打包好的我的项目地址 : 演示地址 开启JSX编写高性能的组件,JSX列子组件 new Vue({ el: '#demo', render: function (h) { return ( <AnchoredHeading level={1}> <span>Hello</span> world! </AnchoredHeading> ) } })import vueJsx from '@vitejs/plugin-vue-jsx'export { vueJsx}配置多页面rollupOptions: { input: { example: path.resolve(process.cwd(), 'index.html'), // 把页面放在里面,门路简短 避免src/packages/web/index.html ,倡议vite把key(web、lib)可也阔以映射成页面门路,就防止这个问题 lib: path.resolve(process.cwd(), 'lib.html') },}压缩最小输入rollupOptions: { // 两种形式 // 一,也能够指定包名打包 // output: { // manualChunks: { // "vxe-table": ["vxe-table"], // "echarts": ["echarts"], // "xe-utils": ["xe-utils"], // "lodash": ['lodash'], // "ant-design-vue": ['ant-design-vue'], // "@antv/g2plot": ['@antv/g2plot'], // "@antv/g2": ['@antv/g2'], // } // }, // 二,主动宰割包名输入 chunkSizeWarningLimit 配置大小 output: { chunkFileNames: 'assets/js/[name]-[hash].js', entryFileNames: 'assets/js/[name]-[hash].js', assetFileNames: 'assets/static/[name]-[hash].[ext]', manualChunks(id: any) { if (id.includes('node_modules')) { return id.toString().split('node_modules/')[1].split('/')[0].toString(); } } },},移除consoleterserOptions: { compress: { drop_console: true, drop_debugger: true, },}配置别名resolve: { alias: { // 如果报错__dirname找不到,须要装置node,执行yarn add @types/node --save-dev "@": path.resolve(__dirname, "src"), "__ROOT__": path.resolve(__dirname, ""), "comps": path.resolve(__dirname, "src/components"), }},当配置了别名的时候,为了让编辑器能更好的辨认别名,须要配置jsconfig.json文件,放在vite.config.ts同级别即可,编辑器会主动读取 ...

December 30, 2021 · 2 min · jiezi

关于vite:vitepluginvconsole在windows不生效的原因排查

背景在Vite应用vConsole,不便挪动端的本地开发。官网文档见这里:https://github.com/vadxq/vite...。 场景复现windows客户端"vite-plugin-vconsole": "^1.1.0""vite": "^2.7.0","vconsole": "^3.9.5",node v12.18.3yarn 1.22.15vite.config.js配置如下: import { resolve } from 'path';...viteVConsole({ entry: resolve(__dirname, './src/main.ts'), // entry file localEnabled: mode !== 'prod', // dev environment enabled: mode !== 'prod', // build production config: { // vconsole options maxLogNumber: 1000, theme: 'light' }})...尝试计划认为本人配置错了。重复比照官网配置和他人的模板,没有谬误。跑一下他人搭建好的模板。也是不失效。谷歌搜寻过关键字,依然没有人提出官网github issue也没有人提出源码剖析间接关上vite-plugin-vconsole的源码 "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/index.tsfunction viteVConsole(opt) { let viteConfig; let isDev = false; const {entry, enabled = true, localEnabled = false, config = {}} = opt; return { name: "vite:vconsole", enforce: "pre", configResolved(resolvedConfig) { viteConfig = resolvedConfig; isDev = viteConfig.command === "serve"; }, transform(_source, id) { if (id === entry && localEnabled && isDev) { return `${_source};import VConsole from 'vconsole';new VConsole(${JSON.stringify(config)});`; } if (id === entry && enabled && !isDev) { return `${_source};import VConsole from 'vconsole';new VConsole(${JSON.stringify(config)});`; } return _source; } };}exports.viteVConsole = viteVConsole;看了下源码,总体来说很简略,就是依据一些参数判断,而后把vConsole新建实例的源码注入。目前没有失效,所以就要看看参数哪里对不上,于是献上console大法 ...

December 13, 2021 · 2 min · jiezi

关于vite:基于Vue3ViteTS二次封装elementplus业务组件fsaf

download:基于Vue3+Vite+TS,二次封装element-plus业务组件name = "Raymond" age = 22 born_in = "Oakland, CA" string = "Hello my name is {0} and I'm {1} years old. I was born in {2}.".format(name, age, born_in) print(string)返回tuple元组 Python容许你在一个函数中返回多个元素,这让生存更简略。然而在解包元组的时候出出线这样的常见谬误: def binary(): return 0, 1result = binary() zero = result[0] one = result[1]这是没必要的,你残缺可能换成这样: def binary(): return 0, 1zero, one = binary()要是你需要所有的元素被返回,用个下划线 _ : zero, _ = binary()就是这么高效率! 拜访Dict字典 你也会常常给 dicts 中写入 key,value (键,值)。 如果你试图拜访一个不存在的于 dict 的 key ,可能会为了避免 KeyError 谬误,你会偏向于这样做: ...

December 8, 2021 · 2 min · jiezi

关于vite:vite-支持optional-Chaining可选链判断运算符-和-nullishCoalescingOperator

vite 反对optional Chaining(可选链判断运算符 ?.)和 nullishCoalescingOperator (空值合并运算符 ??)装置 babel 可选链判断运算符,空值合并运算符 兼容依赖yarn add @babel/plugin-proposal-optional-chaining --devyarn add @babel/plugin-proposal-nullish-coalescing-operator -devvite.config.ts 增加配置import { defineConfig } from "vite";import react from "@vitejs/plugin-react";import checker from "vite-plugin-checker";import vitePluginImp from "vite-plugin-imp";import path from "path";// https://vitejs.dev/config/export default defineConfig(({ mode }) => { return { plugins: [ react({ babel: { plugins: [ "@babel/plugin-proposal-optional-chaining", "@babel/plugin-proposal-nullish-coalescing-operator", ], }, }), ], };});vue 请应用 @vitejs/plugin-vue [未测试]

November 24, 2021 · 1 min · jiezi

关于vite:vite安装vue项目报错

. 最近尝试应用vite,初始化vue我的项目之后,运行 npm run dev 报错,问题剖析以及解决方案记录一下。. 而后执行node ./node_modules/esbuild/install.js 还是不对找不到node_modules/esbuild/esbuild.exe文件. 最初依照https://www.cnblogs.com/tolingsoft/p/15155869.html,删除 node_modules文件夹和 package-lock.json 从新install i 然而要加上--force 强制装置OK了

September 17, 2021 · 1 min · jiezi

关于vite:Vite-从入门到精通玩转新时代前端构建法则

download:Vite 从入门到精通,玩转新时代前端构建法令<configurationFile>D:/GitFile/ka-product/ka-product-soa/src/main/resources/generatorConfig.xml</configurationFile> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> </plugin> generatorConfig.xml <?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEgeneratorConfigurationPUBLIC"-//mybatis.org//DTDMyBatisGeneratorConfiguration1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!--数据库驱动:抉择你的本地硬盘下面的数据库驱动包--> <classPathEntrylocation="E:\repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar"/> <contextid="DB2Tables"targetRuntime="MyBatis3"> <commentGenerator> <propertyname="suppressDate"value="true"/> <!--是否去除主动生成的正文true:是false:否--> <propertyname="suppressAllComments"value="true"/> </commentGenerator> <!--数据库链接URL,用户名、明码--> <jdbcConnectiondriverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://192.168.147.35:3306/ka_product"userId="root"password="123456"/> <javaTypeResolver> <propertyname="forceBigDecimals"value="false"/> </javaTypeResolver> <!--生成模型的包名和地位--> <javaModelGeneratortargetPackage="site.muhu.cmp.ucenter.model"targetProject="src/main/java"> <propertyname="enableSubPackages"value="true"/> <propertyname="trimStrings"value="true"/> </javaModelGenerator> <!--生成映射文件的包名和地位--> <sqlMapGeneratortargetPackage="mapping"targetProject="src/main/resources"> <propertyname="enableSubPackages"value="true"/> </sqlMapGenerator> <!--生成DAO的包名和地位--> <javaClientGeneratortype="XMLMAPPER"targetPackage="site.muhu.cmp.ucenter.mapper"targetProject="src/main/java"> <propertyname="enableSubPackages"value="true"/> </javaClientGenerator> </generatorConfiguration>

September 10, 2021 · 1 min · jiezi

关于vite:Vite-从入门到精通玩转新时代前端构建法则

download:Vite 从入门到精通,玩转新时代前端构建法令@RestControllerpublic class GreetingController { //解析application/json@RequestMapping(value = "/hello", method = RequestMethod.POST)public Object getJson(@RequestBody Object obj) { return obj;}} 客户端,原生ajax var xhr = new XMLHttpRequest()xhr.onreadystatechange = function (ev) { console.log(xhr.readyState); if (xhr.readyState === 4){ if (xhr.status === 200){ console.log(xhr.responseText); } else { console.error(xhr.statusText); } }};xhr.open('POST','/hello');xhr.setRequestHeader('Content-Type', 'application/json');xhr.send(JSON.stringify({ name:'zhuwei', age:'25', hobby:'ball'}))阅读器请求详情 1534052079504.png application/x-www-form-urlencoded 服务端,springboot @RestControllerpublic class GreetingController { //解析application/x-www-form-urlencoded@RequestMapping(value = "/helloFormUrl", method = RequestMethod.POST)public String getForm(@RequestParam("name") String name,@RequestParam("age") String age) { return "name="+name+"&"+"age="+age;}} 客户端,html form 表单 ...

September 9, 2021 · 1 min · jiezi

关于vite:vite不支持optional-Chaining链判断运算符和-nullishCoalescingOperator

链判断运算符特地好用,我就不多说了,搭建vite时,发现用了很多办法,都不能反对 办法一:@vitejs/plugin-react-refresh配置parserPlugins,不失效 import { defineConfig } from 'vite';import reactRefresh from '@vitejs/plugin-react-refresh';export default defineConfig({ plugins: [ reactRefresh({ parserPlugins: ['optionalChaining', 'nullishCoalescingOperator'] }) ]});办法二:vite-babel-plugin加babel,不失效 import { defineConfig } from 'vite';import reactRefresh from '@vitejs/plugin-react-refresh';import babel from 'vite-babel-plugin';export default defineConfig({ plugins: [ babel(), reactRefresh({ parserPlugins: ['optionalChaining', 'nullishCoalescingOperator'] }) ]});办法三:@rollup/plugin-babel加babel,不失效 import { defineConfig } from 'vite';import reactRefresh from '@vitejs/plugin-react-refresh';import babel from '@rollup/plugin-babel';export default defineConfig({ plugins: [ babel({ babelHelpers: 'runtime', plugins: [ '@babel/plugin-proposal-nullish-coalescing-operator', '@babel/plugin-proposal-optional-chaining' ] }), reactRefresh({ parserPlugins: ['optionalChaining', 'nullishCoalescingOperator'] }) ]});办法四:改tsconfig.json,仍然没成果 ...

September 1, 2021 · 1 min · jiezi

关于vite:收下这7款插件让你在使用vite的时候如虎添翼

置信曾经有不少小伙伴曾经开始用 Vue3 做开发了,也肯定应用上 Vite 了,而我明天要介绍的这几款插件,能让你在应用 Vite 做开发时锦上添花。 vite-plugin-restart通过监听文件批改,主动重启 vite 服务。 最罕用的场景就是监听 vite.config.js 和 .env.development 文件,咱们晓得,批改 vite 配置文件和环境配置文件,是须要重启 vite 才会失效,通过这个插件,咱们将从重复重启中解脱进去。 unplugin-vue-components组件主动按需导入。 依照官网的例子,咱们能够间接在代码中调用组件,而无需导入并注册,这个插件会主动帮忙咱们做这些事,你能够间接这样编写代码: <template> <div> <HelloWorld msg="Hello Vue 3.0 + Vite" /> </div></template><script>export default { name: 'App'}</script>而代码最终会编译成这样: <template> <div> <HelloWorld msg="Hello Vue 3.0 + Vite" /> </div></template><script>import HelloWorld from './src/components/HelloWorld.vue'export default { name: 'App', components: { HelloWorld }}</script>这个插件根本让咱们辞别全局组件注册了,因为有时候为了偷懒,咱们会将组件注册到全局,这样在应用的时候就无需导入并注册,弊病就是如果全局组件过多会导致首页加载较慢,而这个插件就很奇妙的解决了这一问题。 vite-plugin-svg-icons用于生成 svg 雪碧图,不便在我的项目中应用 .svg 文件。 依照文档配置好后,搭配阿里巴巴矢量图标库应用,只需把下载好的 svg 文件丢到指定目录,而后就能够我的项目中欢快的应用了。 vite-plugin-spritesmithcss 雪碧图生成。 这是一个濒临淘汰的技术,因为 HTTP/2 里多路复用个性,曾经不太须要应用精灵图合并了。当然如果你仍旧有这应用需要,这个插件能够满足你的须要。 vite-plugin-mock提供了本地和生产 mock 服务。 ...

September 1, 2021 · 1 min · jiezi

关于vite:Vite-从入门到精通玩转新时代前端构建法则

download:Vite 从入门到精通,玩转新时代前端构建法令/** 图片搜寻为进步搜寻的精确度,举荐应用配套工具截图 http://www.xnx3.com/software/... */public static void imageSearch(){ Robot robot = new Robot();robot.setSourcePath(RobotDemo.class); //设置此处是为了让程序能主动找到要搜寻的图片文件。图片文件在以后类下的res文件夹内 //在以后屏幕上搜寻search.png图片,看起是否存在List<CoordBean> list1 = robot.imageSearch("search.png", Robot.SIM_ACCURATE);System.out.println(list1.size()>0? "搜寻到了"+list1.size()+"个指标":"没搜寻到");if(list1.size()>0){ for (int i = 0; i < list1.size(); i++) { CoordBean coord = list1.get(i); System.out.println("搜寻到的第"+(i+1)+"个坐标:x:"+coord.getX()+",y:"+coord.getY()); }} //在屏幕上指定的区域:左上方x100,y100, 右下方x300,y300的范畴内搜寻多个图像List<CoordBean> list2 = robot.imageSearch(100, 100, 300, 300, "search.png|L.png", Robot.SIM_BLUR_VERY);System.out.println(list2.size()>0? "搜寻到了"+list2.size()+"个指标":"没搜寻到");if(list2.size()>0){ for (int i = 0; i < list2.size(); i++) { CoordBean coord = list2.get(i); System.out.println("搜寻到的第"+(i+1)+"个坐标:x:"+coord.getX()+",y:"+coord.getY()); }}}

August 18, 2021 · 1 min · jiezi

关于vite:使用vite搭个中后台系统的脚手架

搭个中后盾零碎的脚手架仓库地址 https://github.com/percy507/v...搭建脚手架目标 学习 vite、recoil 等新技术封装我的项目中罕用的较简单的组件学习肯定的前端架构能力构建命令npm 与 yarn 对新版 husky(v7.0.1+)的配置形式不太雷同,咱们这里只应用 npm https://typicode.github.io/hu... npm i -d # 装依赖npm run dev # 本地开发npm run build:dev # 开发服务器生产环境打包npm run build:test # 测试服务器生产环境打包npm run build:prod # 生产服务器生产环境打包npm run preview # 本地打包并预览打包后的页面npm run deploy # 将打包后的代码推送到github近程仓库,以便预览# deploy 这里应用了 gh-pages依赖# 因为 github pages 的局限性,我的项目里只能应用 HashRouter,理论我的项目可替换为 BrowserRouter外围依赖# 次要应用到的依赖Vite v2.1.0+ 一种新型前端构建工具React v17.0.0+ 前端框架recoil v0.4.0 React 状态治理库antd v4.16.10+ React UI 组件库Typescript v4.2.1+ 为JavaScript提供弱小的类型零碎留神: recoil v0.4.0 还不是稳定版,审慎用于生产环境 When Recoil is going to stop being experimental? ...

August 15, 2021 · 1 min · jiezi

关于vite:前端构建这十年

写在后面前端模块化/构建工具从最开始的基于浏览器运行时加载的 RequireJs/Sea.js 到将所有资源组装依赖打包 webpack/rollup/parcel的bundle类模块化构建工具,再到当初的bundleless基于浏览器原生 ES 模块的 snowpack/vite,前端的模块化/构建工具倒退到当初曾经快 10 年了。 本文次要回顾 10 年间,前端模块化/构建工具的倒退历程及其实现原理。 (因波及一些历史、趋势,本文观点仅代表集体主观认识) 基于浏览器的模块化CommonJS所有的开始要从CommonJS标准说起。 CommonJS 原本叫ServerJs,其指标原本是为浏览器之外的javascript代码制订标准,在那时NodeJs还没有出世,有一些零散的利用于服务端的JavaScript代码,然而没有残缺的生态。 之后就是 NodeJs 从 CommonJS 社区的标准中吸取经验创立了自身的模块零碎。 RequireJs 和 AMDCommonJs 是一套同步模块导入标准,然而在浏览器上还没法实现同步加载,这一套标准在浏览器上显著行不通,所以基于浏览器的异步模块 AMD(Asynchronous Module Definition)标准诞生。 define(id?, dependencies?, factory); define("alpha", ["require", "exports", "beta"], function ( require, exports, beta) { exports.verb = function () { return beta.verb(); //Or: return require("beta").verb(); };});AMD标准采纳依赖前置,先把须要用到的依赖提前写在 dependencies 数组里,在所有依赖下载实现后再调用factory回调,通过传参来获取模块,同时也反对require("beta")的形式来获取模块,但实际上这个require只是语法糖,模块并非在require的时候导入,而是跟后面说的一样在调用factory回调之前就被执行,对于依赖前置和执行机会这点在过后有很大的争议,被 CommonJs社区所不容。 在过后浏览器上利用CommonJs还有另外一个流派 module/2.0, 其中有BravoJS的 Modules/2.0-draft 标准和 FlyScript的 Modules/Wrappings标准。 代码实现大抵如下: module.declare(function (require, exports, module) { var a = require("a"); exports.foo = a.name;});奈何RequireJs如日中天,基本争不过。 ...

August 11, 2021 · 4 min · jiezi

关于vite:Vite-从入门到精通玩转新时代前端构建法则

Vite 从入门到精通,玩转新时代前端构建法令超清原画 残缺无密 下载地址:网盘下载 Vite 因为其跨前端框架的能力和极其优越的性能,被称为下一代前端构建工具。如果你想在将来几年有更好的倒退空间,那么最好尽早学会 Vite。 咱们将从如何配置应用动手,深刻到Vite的场景、插件以及源码,帮忙大家零碎把握 Vite,全面晋升对前端构建的认知,更能自行构建我的项目,为进阶前端架构师打下松软的根底。 适宜人群想要学习前端构建的开发者想要进阶前端架构的从业者技术储备理解根底的HTTP申请接触过 Vue 或 React 等框架,理解 Node.js 更佳 章节目录:第1章 Vite 的概要介绍 试看 3 节 | 25分钟本章将向大家介绍什么是 Vite、Vite 的特色,并辅以介绍前端构建工具的倒退历史进行比照,帮忙同学们对 Vite 有个初步的印象。 收起列表视频:1-1 对于课程你须要理解的都在这里 (08:44)试看视频:1-2 什么是 Vite (07:15)视频:1-3 Vite 比照其余构建工具的劣势 (08:52)第2章 Vite 的根底利用 试看 9 节 | 111分钟本章中咱们会学习,如何应用 Vite 搭建不同前端框架的我的项目,如何配置一些常见的性能比方 CSS、动态文件等来达到日常应用的目标。 收起列表视频:2-1 Vite 的劣势 (10:22)视频:2-2 Vite 创立 Vue3 我的项目 (12:22)视频:2-3 Vite 创立 Vue2 的我的项目 (08:30)视频:2-4 Vite 创立 React 的我的项目 (07:21)视频:2-5 Vite 中应用 CSS 的各种性能 (15:47)试看视频:2-6 Vite 中应用 Typescript (21:19)视频:2-7 Vite 中解决动态资源的办法 (09:44)视频:2-8 Vite 集成 eslint 和 prettier (12:38)视频:2-9 Vite 中得 env 环境变量 (12:21)第3章 Vite 的高级利用 试看 8 节 | 118分钟本章解说 Vite 的一些高级性能,比方热更新,服务端渲染,集成到 node 服务中等,让同学们在遇到一些非凡状况时也可能得心应手。 ...

August 4, 2021 · 2 min · jiezi

关于vite:Vite-从入门到精通玩转新时代前端构建法则

download:Vite 从入门到精通,玩转新时代前端构建法令import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.HashMap;import java.util.Map; import net.sf.json.JSONObject; /***短信API服务调用示例代码 - 聚合数据*在线接口文档:http://www.juhe.cn/docs/54**/ public class JuheDemo { public static final String DEF_CHATSET = "UTF-8";public static final int DEF_CONN_TIMEOUT = 30000;public static final int DEF_READ_TIMEOUT = 30000;public static String userAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";//配置您申请的KEYpublic static final String APPKEY ="*************************";//1.屏蔽词查看测public static void getRequest1(){ String result =null; String url ="http://v.juhe.cn/sms/black";//申请接口地址 Map params = new HashMap();//申请参数 params.put("word","");//须要检测的短信内容,须要UTF8 URLENCODE params.put("key",APPKEY);//利用APPKEY(利用具体页查问) try { result =net(url, params, "GET"); JSONObject object = JSONObject.fromObject(result); if(object.getInt("error_code")==0){ System.out.println(object.get("result")); }else{ System.out.println(object.get("error_code")+":"+object.get("reason")); } } catch (Exception e) { e.printStackTrace(); }}//2.发送短信public static void getRequest2(){ String result =null; String url ="http://v.juhe.cn/sms/send";//申请接口地址 Map params = new HashMap();//申请参数 params.put("mobile","");//接管短信的手机号码 params.put("tpl_id","");//短信模板ID,请参考集体核心短信模板设置 params.put("tpl_value","");//变量名和变量值对。如果你的变量名或者变量值中带有#&=中的任意一个特殊符号,请先别离进行urlencode编码后再传递,<a href="http://www.juhe.cn/news/index/id/50" target="_blank">具体阐明></a> params.put("key",APPKEY);//利用APPKEY(利用具体页查问) params.put("dtype","");//返回数据的格局,xml或json,默认json try { result =net(url, params, "GET"); JSONObject object = JSONObject.fromObject(result); if(object.getInt("error_code")==0){ System.out.println(object.get("result")); }else{ System.out.println(object.get("error_code")+":"+object.get("reason")); } } catch (Exception e) { e.printStackTrace(); }}public static void main(String[] args) {}/** * * @param strUrl 申请地址 * @param params 申请参数 * @param method 申请办法 * @return 网络申请字符串 * @throws Exception */public static String net(String strUrl, Map params,String method) throws Exception { HttpURLConnection conn = null; BufferedReader reader = null; String rs = null; try { StringBuffer sb = new StringBuffer(); if(method==null || method.equals("GET")){ strUrl = strUrl+"?"+urlencode(params); } URL url = new URL(strUrl); conn = (HttpURLConnection) url.openConnection(); if(method==null || method.equals("GET")){ conn.setRequestMethod("GET"); }else{ conn.setRequestMethod("POST"); conn.setDoOutput(true); } conn.setRequestProperty("User-agent", userAgent); conn.setUseCaches(false); conn.setConnectTimeout(DEF_CONN_TIMEOUT); conn.setReadTimeout(DEF_READ_TIMEOUT); conn.setInstanceFollowRedirects(false); conn.connect(); if (params!= null && method.equals("POST")) { try { DataOutputStream out = new DataOutputStream(conn.getOutputStream()); out.writeBytes(urlencode(params)); } catch (Exception e) { // TODO: handle exception } } InputStream is = conn.getInputStream(); reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET)); String strRead = null; while ((strRead = reader.readLine()) != null) { sb.append(strRead); } rs = sb.toString(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { reader.close(); } if (conn != null) { conn.disconnect(); } } return rs;}//将map型转为申请参数型public static String urlencode(Map<String,Object>data) { StringBuilder sb = new StringBuilder(); for (Map.Entryi : data.entrySet()) { try { sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return sb.toString();}} ...

July 29, 2021 · 2 min · jiezi

关于vite:记录如何造一个vite插件1

在此之前,先做个定位,这不是一篇纯正的技术性文章,能够把它了解成一个叙述文章,记录我开发插件的过程。 开始前简略的吹个牛vue2 也写了很多年了,多人单干始终避不开用到他人的组件。要害是有些组件没有文档看起来是真的吃力。props还能够间接通过组件看进去,emit,ref,slot代码一多看起来就比拟吃力了。也想过一些解决方案,比方每个组件写一个 readme。这就有一个问题,工夫太紧了,谁来给你写 readme 哦,开玩笑。 所以如果有一个可能主动解析 vue 组件的货色就好了。在网上搜寻了一下,vue 主动生成文档,还真的有这么个货色vuese,根本满足要求,然而有几点不是很称心。 不反对 vue3每次生成文档须要 run 一下命令,当然也能够用 nodemon 监听。但就是感觉有点 lowui 不是很难看(这个有点鸡蛋挑骨头,也是前面开始本人造 vite 插件的起因)总体来说 vuese 是一个很好的我的项目,我的插件外面很多的思路都是参考(其实就是抄 )了 vuese,我列出他的不好的,只是单纯的给本人找个理由造个轮子。。。说了这么多你可能曾经猜到我要造一个什么插件了,总结一下: 主动解析 vue,并且反对 vue3反对热更新,写了代码能立刻看到实时预览难看的 ui,最好可能让他人一看到文档就感觉我写的代码很 nb,先不说代码好不好,就看文档就要能唬住人 那么为什么是 vite 插件南? 刚进去没多久,相比于 webpack 轮子比拟少初步理解如同大多数轮子都是用 ts 写的,所以蹭着机会,学一波 ts。vite 介绍比传统快 10-100 倍,初步体验的确比拟快。不过这不是次要起因,次要的是他比拟新呀,轮子少,我能够趁势蹭一波热度,说不定火了,就涨工资了。吹了牛,需要也明确了始终认为做一个开源最难的不是开发,而是弄到一个好一点的需要。然而这个 vite 插件的开发,还真的有点麻烦,差点就颠覆了我的想法。刚一开始就遇到了一个问题 如何从 vue 文件中获取到 props,slots?在此之前没有做过相似的我的项目,也没有遇到过相似的问题,齐全不晓得如何下手。初步想法是用正则去匹配,认真想了哈,感觉不是很靠谱,次要是因为我的正则不行。 我想不到怎么去实现,总有人晓得怎么做嘛,去瞅瞅vuese怎么实现的。首先看哈 package.json 外面用了那些插件,把不意识的插件全副搜一下,理解有些啥作用。最初发现了这么几个库,能够将 js 代码解析成 ast 语法树,完满的解析 vue。 { "dependencies": { "@babel/parser": "^7.10.3", "@babel/traverse": "^7.10.3", "@babel/types": "^7.3.0", "vue-template-compiler": "^2.6.11" }}常常听到 bable 这个货色,却没有深刻理解过,没想到 vue 是用 bable 解析进去的,看来还是不行呀言归正传,一一列举一下他们的作用 ...

July 20, 2021 · 2 min · jiezi

关于vite:Vite-Vue3-项目总结一

最近应用Vite + Vue3 做了一个小我的项目,此文记录我的项目中遇到的一些问题,报错以及一些应用办法等。 1. 控制台正告:[Vue warn]: Extraneous non-emits event listeners (sendMsg) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option. 正告起因:在应用组件传递事件时,没有在子组件接管 Vue3.x 须要在emits定义自定义事件,相似接管props app.component('custom-form', { emits: ['inFocus', 'submit']})2. Vite中如何应用sassnpm install sass --save-dev能够在vite.config.js中引入全局变量 export default defineConfig({ plugins: [vue()], css: { preprocessorOptions: { scss: { additionalData: `@import 'src/styles/variables.scss';` } } }})3. style scoped应用 scoped 后,父组件的款式将不会渗透到子组件中。不过一个子组件的根节点会同时受其父组件的 scoped CSS 和子组件的 scoped CSS 的影响。这样设计是为了让父组件能够从布局的角度登程,调整其子组件根元素的款式scss中批改子组件款式用/deep/和>>>都有效,应用::v-deep报正告,正确用法: ...

July 6, 2021 · 2 min · jiezi

关于vite:vite-中动态引入图片路径

vite 官网默认的配置,打包后会把图片名加上 hash值,然而间接通过 :src="imgSrc"形式引入并不会在打包的时候解析,导致开发环境能够失常引入,打包后却不能显示的问题,示例如下:打包后门路: <img src="static/icon/123.jpg">理论打包后的图片门路:static/icon/123.hash.jpg 能够尝试以下办法解决: HTML: <img :src="getSrc('123')">JS: const getSrc = (name) => { const path = `/static/icon/${name}.svg`; const modules = import.meta.globEager("/static/icon/*.svg"); return modules[path].default; };

June 17, 2021 · 1 min · jiezi

关于vite:vitevue3ts搭建通用后台管理系统

通用后盾管理系统整体架构计划(Vue)我的项目创立,脚手架的抉择(vite or vue-cli)vue-cli基于webpack封装,生态十分弱小,可配置性也十分高,简直可能满足前端工程化的所有要求。毛病就是配置简单,甚至有公司有专门的webpack工程师专门做配置,另外就是webpack因为开发环境须要打包编译,开发体验实际上不如vite。vite开发模式基于esbuild,打包应用的是rollup。急速的冷启动和无缝的hmr在开发模式下取得极大的体验晋升。毛病就是该脚手架刚起步,生态上还不迭webpack。本文次要解说应用vite来作为脚手架开发。(入手能力强的小伙伴齐全能够应用vite做开发服务器,应用webpack做打包编译放到生产环境) 为什么抉择vite而不是vue-cli,不论是webpack,parcel,rollup等工具,尽管都极大的进步了前端的开发体验,然而都有一个问题,就是当我的项目越来越大的时候,须要解决的js代码也呈指数级增长,打包过程通常须要很长时间(甚至是几分钟!)能力启动开发服务器,体验会随着我的项目越来越大而变得越来越差。 因为古代浏览器都曾经原生反对es模块,咱们只有应用反对esm的浏览器开发,那么是不是咱们的代码就不须要打包了?是的,原理就是这么简略。vite将源码模块的申请会依据304 Not Modified进行协商缓存,依赖模块通过Cache-Control:max-age=31536000,immutable进行协商缓存,因而一旦被缓存它们将不须要再次申请。 软件巨头微软周三(5月19日)示意,从2022年6月15日起,公司某些版本的Windows软件将不再反对以后版本的IE 11桌面应用程序。所以利用浏览器的最新个性来开发我的项目是趋势。$ npm init @vitejs/app <project-name>$ cd <project-name>$ npm install$ npm run dev根底设置,代码标准的反对(eslint+prettier)vscode 装置 eslint,prettier,vetur(喜爱用vue3 setup语法糖能够应用volar,这时要禁用vetur) 关上vscode eslint eslintyarn add --dev eslint eslint-plugin-vue @typescript-eslint/parser @typescript-eslint/eslint-pluginprettieryarn add --dev prettier eslint-config-prettier eslint-plugin-prettier.prettierrc.jsmodule.exports = { printWidth: 180, //一行的字符数,如果超过会进行换行,默认为80 tabWidth: 4, //一个tab代表几个空格数,默认为80 useTabs: false, //是否应用tab进行缩进,默认为false,示意用空格进行缩减 singleQuote: true, //字符串是否应用单引号,默认为false,应用双引号 semi: false, //行位是否应用分号,默认为true trailingComma: 'none', //是否应用尾逗号,有三个可选值"<none|es5|all>" bracketSpacing: true, //对象大括号间接是否有空格,默认为true,成果:{ foo: bar } jsxSingleQuote: true, // jsx语法中应用单引号 endOfLine: 'auto'}.eslintrc.js//.eslintrc.jsmodule.exports = { parser: 'vue-eslint-parser', parserOptions: { parser: '@typescript-eslint/parser', // Specifies the ESLint parser ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features sourceType: 'module', // Allows for the use of imports ecmaFeatures: { jsx: true } }, extends: [ 'plugin:vue/vue3-recommended', 'plugin:@typescript-eslint/recommended', 'prettier', 'plugin:prettier/recommended' ]}.settings.json(工作区){ "editor.codeActionsOnSave": { "source.fixAll.eslint": true }, "eslint.validate": [ "javascript", "javascriptreact", "vue", "typescript", "typescriptreact", "json" ]}目录构造范例├─.vscode // vscode配置文件├─public // 无需编译的动态资源目录├─src // 代码源文件目录│ ├─apis // apis对立治理│ │ └─modules // api模块│ ├─assets // 动态资源│ │ └─images │ ├─components // 我的项目组件目录│ │ ├─Form│ │ ├─Input│ │ ├─Message│ │ ├─Search│ │ ├─Table│ ├─directives // 指令目录│ │ └─print│ ├─hooks // hooks目录│ ├─layouts // 布局组件│ │ ├─dashboard│ │ │ ├─content│ │ │ ├─header│ │ │ └─sider│ │ └─fullpage│ ├─mock // mock apu寄存地址,和apis对应│ │ └─modules│ ├─router // 路由相干│ │ └─helpers│ ├─store // 状态治理相干│ ├─styles // 款式相干(前面降到css架构会波及具体的目录)│ ├─types // 类型定义相干│ ├─utils // 工具类相干│ └─views // 页面目录地址│ ├─normal │ └─system└─template // 模板相干 ├─apis └─pageCSS架构之ITCSS + BEM + ACSS事实开发中,咱们常常漠视CSS的架构设计。后期对款式架构的疏忽,随着我的项目的增大,导致呈现款式净化,笼罩,难以追溯,代码反复等各种问题。因而,CSS架构设计同样须要器重起来。 ...

May 31, 2021 · 9 min · jiezi

关于vite:vite中使用

overview我在开发vite的我的项目时,遇到rollup无奈解析门路中的@。先应用相对路径解析,然而不认为是一个好办法。起初的找到了另一种解决方案——应用@rollup/plugin-alias。 装置依赖npm i @rollup/plugin-alias -D 批改rollup.config.jsimport { defineConfig } from 'vite';import vue from '@vitejs/plugin-vue';import path from 'path';const srcPath = path.resolve(__dirname, 'src');// https://vitejs.dev/config/export default defineConfig({ plugins: [ vue(), ], resolve: { alias: [ { find: '@', replacement: srcPath }, ], },});

May 21, 2021 · 1 min · jiezi

关于vite:electron12vite2vadmin基于vue3xelectron中后台桌面管理系统Electron后台模板

零碎简介vite2-electron-admin 一套轻量级的中后盾零碎解决方案。它整合了vite.js + electron12开发实现。应用了最新的前端技术栈,蕴含了 i18n 国际化语言,动静权限路由,提供了多功能表格/表单业务性能。 技术框架vue3技术:vite.js+vue3.0+vuex4+vue-router@4跨端框架:electron^12.0.4打包工具:vue-cli-plugin-electron-builderUI组件库:element-plus (饿了么vue3组件库)表格拖拽:sortablejs图表组件:echarts^5.1.1国际化:vue-i18n^9.1.6模仿数据:mockjs 我的项目构造如下 特色反对PC及平板自适应布局最新前端技术Vite2、Vue3、Electron12、Element Plus、Vue-i18n、Echarts5.x反对组件式+指令式两种权限认证形式反对中英文/繁体国际化计划反对表格拖拽排序、全屏、树形表格等性能反对多主题换肤切换 electron-vite-admin 还反对新开多窗口,以如下换肤窗口为例,后面曾经有过相干分享文章,这里就不具体介绍。 import { createWin } from '@/windows/actions'// 换肤窗口const handleOpenTheme = () => { createWin({ title: '主题换肤', route: '/skin', width: 750, height: 480, })}electron+vite仿mac格调导航栏 如上图:为了我的项目UI一致性,顶部导航栏采纳了自定义组件实现,格调有些相似mac导航。 <template> <WinBar zIndex="1000"> <template #wbtn> <MsgMenu /> <Lang /> <a class="wbtn" title="换肤" @click="handleSkinWin"><i class="iconfont icon-huanfu"></i></a> <Setting /> <a class="wbtn" title="刷新" @click="handleRefresh"><i class="iconfont el-icon-refresh"></i></a> <a class="wbtn" :class="{'on': isAlwaysOnTop}" :title="isAlwaysOnTop ? '勾销置顶' : '置顶'" @click="handleAlwaysTop"><i class="iconfont icon-ding"></i></a> <Avatar @logout="handleLogout" /> </template> </WinBar></template>至于具体的实现形式,这里不作过多介绍了。之前有过一些相干分享文章。 ...

May 17, 2021 · 3 min · jiezi

关于vite:vite-开箱使用及特点

vite 几个特点: 疾速的冷启动即时的模块热更新真正的按需编译疾速构建npm create vite-app project-namenpm i npm run dev 能够看到生成的目录十分简洁 index.html变动是入口文件导入形式这样main.js中就能够应用ES6 Module形式组织代码 vite中能够间接导入.css文件,款式将影响导入的页面,最终会被打包到style.css。image.png eslint 的应用借助eslint标准我的项目代码,通过prettier做代码格式化。首先在我的项目装置依赖, 配置eslint规定 .eslintrc.js module.exports = { root: true, env: { node: true, }, extends: ["plugin:vue/vue3-essential", "eslint:recommended", "@vue/prettier"], parserOptions: { parser: "babel-eslint", }, rules: { "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", "prettier/prettier": [ "warn", { // singleQuote: none, // semi: false, trailingComma: "es5", }, ], },};如果有必要还能够配置prettier.config.js批改prettier的默认格式化规定 ...

April 29, 2021 · 1 min · jiezi