从0开始写一个简单的vite hmr 插件0. 写在前面唠叨半天,赶紧开始吧
文章插图
1. 初始化项目由于是真从0开始,我们这里不选择vite官方提供的create-vite , 而是通过依赖安装的方式一步步搭建起来一个vite-plugin
按照你习惯的方式初始化项目
mkdir vite-plugin-todo// pnpmpnpm init// yarnyarn init// npmnpm initcd vite-plugin-todo
安装vite// pnpmpnpm add vite// yarnyarn add vite// npmnpm add vite
初始化项目目录// 用来作为vite的入口 , 以及页面展示touch index.html // src文件夹以及main入口mkdir srctouch src/main.ts// plugins文件夹,存放我们的vite插件mkdir plugins// 创建vite配置文件, 以及vite环境配置文件touch vite.config.tstouch src/vite-env.d.ts
在index.html 中添加main.ts 入口【从0开始写一个简单的vite hmr 插件】
// index.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>vite-hmr-plugin-test</title></head><body><!--这里添加main.ts 入口--><script src="https://www.huyubaike.com/src/main.ts" type="module"></script></body></html>
修改package.json 的命令{"name": "vite-plugin-todo","version": "1.0.0","description": "","main": "index.js","scripts": {"dev": "vite dev"},"keywords": [],"author": "","license": "ISC","dependencies": {"@types/node": "^18.8.5","vite": "^3.1.8"}}
为了使得typescript能够解析nodejs模块pnpm add @types/nodejsyarn add @types/nodejsnpm install @types/nodejs
尝试一下pnpm dev
没报错的话就OK了项目的结构如下
文章插图
2. 初识vite plugin2.1 vite 插件是什么2.2 vite 插件的生命周期在说vite插件生命周期之前,我们还是先完善一下vite.config.ts
import { defineConfig } from "vite";export default defineConfig({plugins: [// Plugins],assetsInclude: ["src/**/*.todo"]})
- 定义并导出一个配置
plugins
是用来存放vite插件实例的assetsInclude
是用来指明需要解析的资源路径的,我们这里以.todo
为资源后缀
文章插图
插件生命分为3个阶段,启动时,模块传入时,服务器关闭时
关于这几个模块的具体说明见vite官方文档 。
这里只说我们用到的
transform
从名字可以看出是有关变化的函数,它的作用正是在我们执行导入的时候,提供检测的函数 。
文章插图
每当执行写一个import,vite就会把这个信息传递到每一个插件的transform中
插件根据所需转化自己需要的.
transform接收两个参数,src为导入的文本内容 , 另外一个id则是此模块的绝对路径(可以通过绝对路径进行文件类型判断)
transform(src, id) {return {code: "",// ...}}
2.3 vite 插件是怎么提供其他资源导入的功能的?前面提到的transform函数是一个解析函数,当通过import导入的时候,就会触发,然后经过一定处理之后返回 。所以你应该想到了 , 其他的资源应该是以某种符合js语法的方法导入了 , 而这个处理过程transform实现了这个过程,让一个原本不符合js语法的资源,变的合法了 。
文章插图
那么说到底是怎么实现的呢?
答:通过注入的方法 。
文章插图
在浏览器加载之前,vite先帮你把各种import模块全部转换好,转换为如上的形式,那你说这都定义成变量了,浏览器肯定认啊,对吧!
那你可能会问我还是不明白,到底怎么转换的,其实就是通过transform的返回值来解析转换的 。
transform(src, id) {// 解析这个文件,是不是你要的type// 执行转换// 把转换的结果可以通过 `` 插值到code里面return {code: "", // 转换后的代码// ...}}
2.4 vite插件长什么样?export default function todoParser() {// 插件创建之初的代码,可以在这里配置插件所需的资源return {name: "todo-parser", // 插件名// 生命周期函数transform(src, id) {// 解析这个文件,是不是你要的type// 执行转换// 把转换的结果可以通过 `` 插值到code里面return {code: "", // 转换后的代码// ...}}}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 编写HelloWorld并运行
- 惠普星13Air锐龙版怎么样_惠普星13Air锐龙版性能表现
- 如何编写 Pipeline 脚本
- 我的世界如何去末影之地(我的世界如何从末影之地回家)
- 【C++】从零开始的CS:GO逆向分析3——写出一个透视
- 重写 hashcode真有那么简单嘛?
- 1 Python全栈工程师之从网页搭建入门到Flask全栈项目实战 - ES6标准入门和Flex布局
- Redis高可用之主从复制原理演进分析
- Punched Card 编程架构演化史:远古时代,从打孔卡开始
- <三>从编译器角度理解C++代码编译和链接原理