zoukankan      html  css  js  c++  java
  • 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>
      <!-- 
        这个container 在我们等会使用snabbdom的时候需要,
        我们现在就将他创建好
        -->
      <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了
    

    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节点
    

    区别

    <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)
    

    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节点
    

    尾声

    如何你觉得我写的还不错的话,
    给我点一个推荐或者打赏,这是我写下去的动力。
    看官,我已经三个月没有吃辣条了。
    给我买一包吧,就一包!求求你了!
    diff算法是如何跟新的,看这一篇文章
    

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

    遇见问题,这是你成长的机会,如果你能够解决,这就是收获。

    作者:明月人倚楼
    出处:https://www.cnblogs.com/IwishIcould/

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!

    万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

    想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

    支付宝
    微信
    本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    struts2+Hibernate4+spring3+EasyUI环境搭建之四:引入hibernate4以及spring3与hibernate4整合
    struts2+Hibernate4+spring3+EasyUI环境搭建之三:引入sututs2以及spring与sututs2整合
    struts2+Hibernate4+spring3+EasyUI环境搭建之二:搭建spring
    Log4j
    【maven学习】构建maven web项目
    struts2+Hibernate4+spring3+EasyUI环境搭建之一:准备工作
    高版本myeclipse破解以及优化
    Eclipse&Myeclipse安装反编译插件
    Flask源码阅读-第四篇(flaskapp.py)
    Flask源码阅读-第三篇(flask\_compat.py)
  • 原文地址:https://www.cnblogs.com/IwishIcould/p/15685328.html
Copyright © 2011-2022 走看看