回到vite.config.ts中,在plugins数组内部直接执行todoParser(),实现插件的装载
在main.ts 中接收这个导入的资源,并且赋值到document中
import { data } from './assets/journey.todo'import './style.css'; // 样式,这里消除了li的一般样式 list-style: noneconsole.log(data);document.body.innerHTML = data;

文章插图
- 上面的预览图可以发现我们实现了功能,但是每次一写完,整个页面就会全部刷新,这可不太好,所以还需要HMR

文章插图
注意,vite中server和client是可以相互通信!这里只需要server向client发送消息
4.1 server 发送vite服务器实例的获取有很多种方法:
- 直接通过vite钩子 configureServer(server) {}获取
一般用来给vite服务器添加中间件
- 通过处理更新的钩子获取 handleHotUpdate({file, server, modules}){}
async handleHotUpdate({ server, file, modules }) {let fileData = https://www.huyubaike.com/biancheng/await fs.readFile(modules[0].id as string);server.ws.send({type:'custom',event: 'special-update', // 事件名data: {msg: "Update from server",updateVal: fileData.toString()}})console.log(`${file} should be updated`);return [];}
通过node的fs模块读取到了文本的数据随后通过server.ws.send()向client发送的数据,其中更新之后的数据存放在data.updateVal中
4.2 client 获取在vite中,模块热更新以事件的形式抛出,具体来说是
import.meta.hot.on('xxx事件', () => {} /*事件回调*/)
我们这里编写如下代码if (import.meta.hot) {import.meta.hot.on('special-update', (data) => {data = https://www.huyubaike.com/biancheng/parser(data.updateVal);document.body.innerHTML = data;})}
如果更新了,那么就执行parser,解析数据,最后把数据赋值到document.body.innerHtml上 。那这个代码应该写在哪儿呢?
答应该写在,模块导入的未知,也就是
transform
函数的返回值
中这样才能保证每一个
.todo
模块都能够热更新!// 完整的parserexport default function todoParser(): Plugin {let todoFileRegex = /\.(todo)$/;// local variablefunction log(msg) {console.log(msg);}return {name: "todo-parser",transformIndexHtml(html) {return html.replace(/<title>(.*?)<\/title>/, '<title>TODO Parser</title>');},transform(src, id) {// module injectconsole.log(id);if (todoFileRegex.test(id)) {return {code: `export let data = "https://www.huyubaike.com/biancheng/${parser(src)}"export ${parser}if (import.meta.hot) {import.meta.hot.on('special-update', (data) => {data = parser(data.updateVal);document.body.innerHTML = data;})}`,};}},async handleHotUpdate({ server, file, modules }) {let fileData = https://www.huyubaike.com/biancheng/await fs.readFile(modules[0].id as string);server.ws.send({type:'custom',event: 'special-update',data: {msg: "Update from server",updateVal: fileData.toString()}})console.log(`${file} should be updated`);return [];}}}

文章插图
- 如此简单的HMR就实现了,画面不会重新加载了 。
经验总结扩展阅读
- 2023年10月12日入学好不好 2023年10月12日适合入学吗
- 2023年10月12日举行成年礼行吗 2023年10月12日举行成年礼好不好
- 2023年10月12日开学行吗 2023年10月12日适合开学吗
- 2023年10月12日开学典礼好不好 2023年10月12日是开学典礼的黄道吉日吗
- 2023年10月12日上学好不好 2023年10月12日上学吉日一览表
- 2023年10月12日堵蚂蚁洞黄道吉日 2023年10月12日适合堵蚂蚁洞吗
- 2023年10月12日适合堵蚁穴吗 2023年10月12日堵蚁穴好不好
- 2023年10月12日剃头好吗 2023年10月12日是剃头吉日吗
- 2022年数九什么时候开始什么时候结束 2022到2023年数九时间表
- 2023年农历八月廿八洗澡吉日 2023年农历八月廿八宜洗澡吗