webapck搭建环境,让你知道vue中的h函数的作用和虚拟节点如何上树!

简介: webapck搭建环境,让你知道vue中的h函数的作用和虚拟节点如何上树!

搭建环境


npm init 初始化项目


npm i -D snabbdom 安装


npm i -D webpack@5 webpack-cli@3 webpack-dev-server@3  


简单介绍


snabbdom 是一个DOM库.[重要]


不能够直接运行在Node环境中,


我们需要搭建一个webpack和webpack-dev-server的开发环境


需要注意的是必须安装webpck5. 不能够安装webpack4.


因为webpck4中没有读取 exports的能力哈


然后安装:目的是搭建开发的运行环境


npm i -D webpack@5 webpack-cli@3 webpack-dev-server@3  


这个千万不忘记配置呀


创建 webpack.config文件


//这个webpack.config文件在项目的根目录下
// 安装官网配置直接复制 https://webpack.js.org/ 然后做简单的修改
const path = require('path');
module.exports = {
    // 入口,需要靠你去创建
    entry: './src/index.js',
    // 出口
    output: {
      // path: path.resolve(__dirname, 'dist'),
      //虚拟的打包路径 也就是说文件夹不会真正的生成,而是在8080端口虚拟生成的
      // xuni 这个不会真正的生成,在内存中,打包后的文件名是 bundle
      publicPath:'xuni', 
      filename: 'bundle.js',
    },
    <!-- 配置的是 开发服务 -->
    devServer: {
        port: 8080, //端口
        // 静态资源文件夹,你创建一个,跟src 同级,
        contentBase:'www'
    }
};


需要创建的文件


根据上面的配置要求。


我们需要在项目的跟目录下创建 src文件夹,src下有index.js文件


我们需要在项目的跟目录下创建 www文件夹,src下有index.html文件


我们在index.js文件中写


console.log("你好啊,环境已经搭建ok,我好高兴")


这个文件打包后对应的虚拟文件是bundle.js


我们在index.html文件中写


<body>
  <h1>你好啊!</h1>
  <!-- 
      -->
  <div id="container"></div>
</body>
<!--
 bundle.js 是我们生成在内存中的,在物理上看不见。
 我们等会写的xuni/bundle.js 是打包后的。
 它打包前的是 src下有index.js文件
 -->
<script src="xuni/bundle.js"></script>
</html>

更改 package.json 文件配置


在package.json文件中。


我们需要更改一下配置


"scripts": {
   "test": "echo \"Error: no test specified\" && exit 1"
},

更改为

 "scripts": {
  "dev": "webpack-dev-server"
},

这样我们执行 npm  run dev 就会将,


我们下载的 webpack-dev-server服务启动起来


然后简单去走一下 snabbdom的流程


snabbdom的地址:https://github.com/snabbdom/snabbdom  


复制Example。到我们的 index.js文件中


我们会发现有


const container = document.getElementById("container");


所以我们需要在index.html中去创建


这就解释了为啥我们的index.html需要有一个id为container


不过我们刚刚已经创建了


然后我们会发现有两个函数报错 someFn is not  undefined


anotherEventHandler is not  undefined


我们将这两个函数更改为普通函数 就ok了


1425695-20211213211555097-1191347938.png

index.js简单使用h函数


import {
  init,
  classModule,
  propsModule,
  styleModule,
  eventListenersModule,
  h,
} from "snabbdom";
let myVnode1 = h
(
  'a', 
  { props:
    { href: 'https://www.cnblogs.com/IwishIcould/' }
  },
  '我的博客'
)
console.log("myVnode1", myVnode1) //输出来的内容就是虚拟dom节点


这行代码说明了: h函数产生虚拟dom节点

1425695-20211213211813660-1169744742.png


区别


<div>
    <p>123</p>
</div>
转化为这个
let obj={
  'tag':'div',
  'child':[
      'tag':'p',
      'text':'123'
  ]
}


不是h函数做的。


而是模板编译原理做的


使用patch函数让虚拟dom节点上树


import {
  init,
  classModule,
  propsModule,
  styleModule,
  eventListenersModule,
  h,
} from "snabbdom";
let myVnode1 = h('a', { props: { href: 'https://www.cnblogs.com/IwishIcould/' } }, '我的博客')
console.log("myVnode1", myVnode1) //输出来的内容就是虚拟dom节点
// 使用init函数创建 patch函数 
const patch = init([classModule, propsModule, styleModule, eventListenersModule])
const container = document.getElementById('container')
// 让虚拟节点上树
patch(container,myVnode1)


1425695-20211213211906700-162709661.png


init函数创建patch函数


使用init函数创建patch函数 ,init函数接受4个参数。


const patch = init([classModule, propsModule, styleModule,

eventListenersModule])


[类模块,属性模块,style模块,事件模块 ]


patch函数让虚拟dom节点上树


// 让虚拟节点上树
patch(container,myVnode1)


patch函数接受两个参数,上树到哪一个容器下,上树的虚拟节点


一个容器让多个虚拟节点上树,可以使用h函数的嵌套


let myVnode1 = h('ul', {}, [
  h('li', {}, '姓名'),
  h('li', {}, '年龄'),
  h('li', {}, '爱好'),
])
console.log("myVnode1", myVnode1) //输出来的内容就是虚拟dom节点
// 使用init函数创建 patch函数 
const patch = init([classModule, propsModule, styleModule, eventListenersModule])
const container = document.getElementById('container')
// 让虚拟节点上树
patch(container, myVnode1)
console.log("上树后", myVnode1) //输出来的内容就是虚拟dom节点

1425695-20211213211957332-1467926847.png


尾声


如何你觉得我写的还不错的话,


给我点一个推荐或者打赏,这是我写下去的动力。


看官,我已经三个月没有吃辣条了。


给我买一包吧,就一包!求求你了!


diff算法是如何跟新的,看这一篇文章

相关文章
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
232 2
|
12天前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
221 137
|
5月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
663 0
|
5月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
3月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
361 1
|
4月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
165 0
|
4月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
325 1
|
5月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
418 17
|
5月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
242 1
|
5月前
|
存储 JavaScript 前端开发
如何高效实现 vue 文件批量下载及相关操作技巧
在Vue项目中,实现文件批量下载是常见需求。例如文档管理系统或图片库应用中,用户可能需要一次性下载多个文件。本文介绍了三种技术方案:1) 使用`file-saver`和`jszip`插件在前端打包文件为ZIP并下载;2) 借助后端接口完成文件压缩与传输;3) 使用`StreamSaver`解决大文件下载问题。同时,通过在线教育平台的实例详细说明了前后端的具体实现步骤,帮助开发者根据项目需求选择合适方案。
426 0