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就实现了,画面不会重新加载了 。
6. 拓展阅读强烈建议去阅读vite官方文档,写的真的很详细 。
另外,vite的模块解析,有一部分是通过rollup来实现的,所以可以去学学rollup的解析,加深理解 。
7. 代码Mushrr/vite-hmr-plugin-test (github.com)
推荐阅读
- 编写HelloWorld并运行
- 惠普星13Air锐龙版怎么样_惠普星13Air锐龙版性能表现
- 如何编写 Pipeline 脚本
- 我的世界如何去末影之地(我的世界如何从末影之地回家)
- 【C++】从零开始的CS:GO逆向分析3——写出一个透视
- 重写 hashcode真有那么简单嘛?
- 1 Python全栈工程师之从网页搭建入门到Flask全栈项目实战 - ES6标准入门和Flex布局
- Redis高可用之主从复制原理演进分析
- Punched Card 编程架构演化史:远古时代,从打孔卡开始
- <三>从编译器角度理解C++代码编译和链接原理