现代 JavaScript 框架存在的主要原因

替换 JavaScript 依赖库/组件的快速工具 我们将使用 Node.js 平台和 npm 包管理器来开发这个工具。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,而 npm 是 Node.js 的默认包管理器,用于安装和管理 JavaScript 包。搜索指定依赖库/组件的现有版本;列出可用的替代版本;自动替换项目中的依赖库/组件;生成报告,包括替换的依赖库/组件列表和相关统计信息。 阅读详情

简评:现代 JavaScript 框架的出现最主要是解决哪个问题?这篇文章很好的解释了这个问题。

我见过许多人盲目地使用像 React,Angular 或 Vue.js 这样的现代框架。这些框架提供了许多有趣的东西,通常人们会忽略这些框架存在最主要的原因,这些原因不是:

  • 它们基于组件;
  • 它们有一个强大的社区;
  • 它们有很多第三方库;
  • 它们有很多有用的第三方组件;
  • 它们有浏览器插件,可以帮助调试;
  • 它们适用于单页面应用程序。

这些都不是最本质的原因,最本质的原因是保持 UI 和状态同步并不容易。

UI 和 状态同步难在哪?

假如,您正在构建一个 Web 应用程序,用户可以填写他人的 email 地址来发起邀请。并且邀请列表有两种状态:

  1. 空状态,我们在这个状态下提示用户填写邮箱。
  2. 非空状态,这种状态我们需要列出出等待被邀请的用户,并且提供删除按钮。

尝试使用纯 JavaScript 实现这种功能

源码和效果可以到参考:codepen。

index.html 代码

<html>
  <body>
    <div id="addressList">
      <form>
        <input>
        <p class="help">Type an email address and hit enter</p>
        <ul>
        </ul>
      </form>
    </div>
  </body>
</html>

JS 代码

class AddressList {
  constructor(root) {
    // state variables
    this.state = []

    // UI variables
    this.root = root
    this.form = root.querySelector('form')
    this.input = this.form.querySelector('input')
    this.help = this.form.querySelector('.help')
    this.ul = root.querySelector('ul')
    this.items = {} // id -> li element

    // event handlers
    this.form.addEventListener('submit', e => {
      e.preventDefault()
      const address = this.input.value
      this.input.value = ''
      this.addAddress(address)
    })

    this.ul.addEventListener('click', e => {
      const id = e.target.getAttribute('data-delete-id')
      if (!id) return // user clicked in something else      
      this.removeAddress(id)
    })
  }

  addAddress(address) {
    // state logic
    const id = String(Date.now())
    this.state = this.state.concat({ address, id })

    // UI logic
    this.updateHelp()

    const li = document.createElement('li')
    const span = document.createElement('span')
    const del = document.createElement('a')
    span.innerText = address
    del.innerText = 'delete'
    del.setAttribute('data-delete-id', id)

    this.ul.appendChild(li)
    li.appendChild(del)
    li.appendChild(span)
    this.items[id] = li
  }

  removeAddress(id) {
    // state logic
    this.state = this.state.filter(item => item.id !== id)

    // UI logic
    this.updateHelp()
    const li = this.items[id]
    this.ul.removeChild(li)
  }

  // utility method
  updateHelp() {
    if (this.state.length > 0) {
      this.help.classList.add('hidden')
    } else {
      this.help.classList.remove('hidden')
    }
  }
}

const root = document.getElementById('addressList')
new AddressList(root)

这段代码很好的说明了使用纯 JavaScript 实现一个有点小复杂的 UI 所需要的工作量。

在示例中,静态结构在 HTML 中创建,动态内容使用 JavaScript 来创建。这种方式有几个问题:

构建 UI 的 JavaScript 代码可读性不高,我们用两个不同的部分来定义 UI。我们可以使用 innerHTML来让代码更容读,但是这样效率不高,而且容易引发跨站脚本漏洞。我们也可以使用模板引擎,但是如果重新生成大的 DOM 的子节点又会遇到两个问题:效率不高,通常需要重新连接 event handler。

但这都是小问题,最主要的问题是:我们需要在状态变更的时候更新 UI。每一次状态出现变更我们都需要使用大量的代码来更新 UI。上面的例子我们更新状态是用了两行的代码,但是更新 UI 却耗费了 13 行代码(尽管这个 UI 并不复杂)。

它不仅编写起来复杂而且还很脆弱。想象一下,我们需要实现将列表于服务器同步的功能。我们需要将本地数据和服务器发来的数据进行比较。并且需要点对点的对每个变更同步到 DOM 节点中。如果这个过程中有每一步出现差错都直接导致 UI 同步失败。

因此,维护 UI 与数据同步需要编写大量繁琐,脆弱和脆弱的代码。

声明式 UI 解决方案

它是不是社区,它不是工具,也不是生态系统,也不是第三方库……

到目前为止,这些框架提供的最大的改进是实现应用状态和 UI 同步。

我们只需要定义一次 UI,不必编写为每一次动作编写 UI。相同的状态总能得到相同的 UI 输出(状态和 UI 同步,状态变更后会自动更新 UI)。

原理

有两个基本策略:

  • 重新渲染整个组件: React。当组件的状态发送变化时,它会在内存中渲染一个 DOM,并和现有 DOM 进行比较。但是为了降低成本,实际上它会渲染一个虚拟 DOM,来和之前的虚拟 DOM 进行比较,然后计算更改并对真实 DOM 进行修改。
  • 使用观察者来监听变化: Angular 和 Vue.js 观察你的状态变化,并且只会更新关联的 DOM 元素。

和 Web Component 比较?

很多时候人们将 React,Angular 和 Vue.js 和 Web 组件进行比较。很多人不理解这些框架提供的最大好处:保持 UI 和状态同步。而 Web 组件并不提供内容,它是一套规范,以便开发者可以自由创建可重用的元素。所以单纯使用 Web Component + 纯 JavaScript 仍然需要手动保证状态同步,要实现高效易维护的 UI 还需要使用 现代 JavaScript 框架。

自己实现

自己实现一个类似的功能,能够加深对原理的理解。我们尝试使用 虚拟DOM (而不是直接用第三方框架)实现一个类似 React 的框架,来重写刚刚的 demo。

下面是我们 Framework 的核心部分,代表所有组件的基类:

下面是基于 Component 重写的邮箱邀请的应用(借助 babel 变换来支持 JSX)这里是源码:

现在的 UI 是声明性的,而且我们没有直接使用任何框架。我们可以实现以任何方式更改状态的逻辑,并且不需要额外编写 UI 同步的代码。

原文:The deepest reason why modern JavaScript frameworks exist

深入探讨JavaScript框架在现代Web开发中的应用 本文还有配套的精品资源,点击获取 简介:本书详细讲述了JavaScript框架在现代Web开发中的应用,覆盖了从基础到高级的各个方面,帮助开发者提升技能并跟上技术发展的步伐。介绍了JavaScript的基础语法、DOM操作、AJAX、流行的JavaScript框架(如React、Angular和Vue.js)的概念及其应用,还包括路由管理、性能优化、测试调试和最佳实践等内容... 阅读详情

相关推荐

SiC MOSFET驱动设计实战:从特性解析到电路优化

本文深入解析SiC MOSFET的核心特性及其驱动电路设计要点,涵盖高温稳定性、快速开关能力等关键特性,并提供驱动电压配置、电流能力计算、布局优化等实用方案。特别针对第三代电力电子半导体SiC MOSFET的驱动要求,分享STGAP1AS等典型驱动方案的应用技巧,助力工程师解决高频应用中的EMI和热管理挑战。

weixin_29230865的博客 365

Vulnerable Javascript library

首先说明一下,这个问题的由来:源于我们开发的项目送去上海检测,结果送检没通过,被打回来了,返回的结果有这么一条:Vulnerable Javascript library 然后字面翻译就是"脆弱的js",对于小白的我来说,从来没遇到过这个问题,然后就赶紧百度,百度返回的结果是---------js插件库版本太低,升级就好了。 那么问题来了,项目中用到那么多插件,总不至于让我把所有的插件都升级一遍吧,这样可能会死人的。。。。。 接下来:我们部门做底层开发的同事安装了一下叫"nessus"的工具,帮我扫描

笑到世界都狼狈的博客 1万+

低功耗 AI 人体存在检测系统:智能照明与安防的高效解决方案

低功耗 AI 人体存在检测系统通过 “ESP32-C3 主控 + HX7110 AI 模块” 的硬件组合,搭配双重检测算法与深度睡眠机制,既解决了传统检测方案的误报问题,又满足了长时间低功耗运行需求。系统接线简单、代码可直接移植,可快速集成到智能照明、安防监控等物联网设备中,具备广泛的应用前景。

weixin_42300449的博客 226

Fancy Menus设计实战:从信息架构到React命令面板实现

在Web前端开发中,导航系统是连接用户与产品功能的核心枢纽,其设计直接影响用户体验与操作效率。传统的静态列表式菜单在面对复杂应用时,往往导致用户认知负荷增加和任务路径延长。其设计原理需遵循信息架构优先、情境化与渐进式披露等原则,通过动态、个性化的交互模式提升导航的直观性与效率。这一技术价值在于它能显著降低学习成本,引导用户探索产品价值,是提升SaaS、CMS及各类Web应用用户满意度的关键杠杆。具体到工程实践,前端开发者常采用巨型菜单、全屏覆盖菜单、上下文径向菜单及命令面板等模式来应对不同场景。以命令面板为

weixin_33743661的博客 713

k8s篇之underlay网络和overlay区别

underlay和overlay

小橙子的笔记屋 2142

基于 MATLAB 的 FastICA 算法实现语音信号盲分离

FastICA 算法通过最大化信号的非高斯性,找到独立成分,从而实现信号的分离。这些混合的信号被称为盲源信号,我们希望通过分析混合信号,将它们分离出来以便进行进一步的处理和分析。FastICA 是一种常用的盲源信号分离算法,它基于统计学原理,通过寻找独立成分来实现信号的分离。FastICA(独立成分分析)是一种常用的盲源信号分离算法,在语音和图像处理领域都有广泛的应用。本文将介绍如何使用 MATLAB 实现 FastICA 算法来实现语音信号的盲分离,并提供相应的源代码。FastICA 算法原理。

学习使你进步。 2024

JavaScript 供应链为什么如此脆弱...

JavaScript的强大之处在于其卓越的模块化能力,通过npm包管理机制,开发者可以轻易地引用并使用其他人或者组织已经编写好的开源代码,从而极大地加快了开发速度。但是,这种依赖关系的复杂性也给供应链的安全带来了巨大的挑战。今天就跟大家一起来聊聊JavaScript供应链的一些典型负面案例,让大家认识一下这是一个多么脆弱的生态。

IT界那些事儿 378

PDD psnl_verification anti_content 生成顺序与环境校验说明

K不是明文 URL,而是从当前href再派生出来的一小段摘要值。页面 URL 变,K会跟着变但K不是直接肉眼可读的 URL 字串可以把它理解成“URL 的短摘要字段”。这一步是最容易被误解的地方。它吃进去的是压缩后的中间串不是直接吃环境字段它内部还带有长度预算 / 字符映射 / 位置处理逻辑所以最终看到的环境字段 bytes协议头deflate 压缩自定义编码多层叠加后的结果。先把字段总包做再把压缩结果转成raw再拼fTail最后走做字符级输出因此,当前看到的协议字段流。

码王吴彦祖的博客 69

JavaScript的脆弱性

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 1990

200、从零搭建具身智能实验平台:硬件选型软件栈与调试

我一开始图便宜,3D打印了一个平行夹爪,结果抓取力不够,稍微重点的物体就滑落,而且开合控制延迟大,VLA模型输出的动作指令根本跟不上。如果你非要自己做,记住两个原则:一是用谐波减速器而不是直驱,二是加力传感器,哪怕是一个简单的电阻应变片也行——没有力反馈,你的夹爪就是个瞎子。我的建议是,如果你用的是UR5老款,ROS1的ur_modern_driver包更成熟,但如果你要跑最新的VLA框架,很多库已经不支持ROS1了。所以,保持耐心,多备份代码,多记录日志,少熬夜。毕竟,这条路上,我们都是摸着石头过河。

sundong_81的博客 38

遥感影像建筑物变化检测

遥感影像建筑物变化检测

yilvyangguang520的博客 423

精读《现代 js 框架存在的根本原因》

1 引言 深入思考为何前端需要框架,以及 web components 是否可以代替前端框架? 原文地址,建议先阅读原文,或者阅读概述。 2 概述 现在前端框架非常多了,如果让我们回答 “为什么要用前...

setsunadoudou的博客 146

文末含资料链接和视频讲解!YOLOv8+RepVGG+QueryDet小目标检测终极指南:从理论到实战,突破遥感图像检测难题

QueryDet(Query Detection)机制代表了目标检测领域的一个重要范式转变。传统的目标检测方法基于anchor或anchor-free的密集预测,需要为图像中的每个可能位置生成预测。而QueryDet采用了稀疏查询的方式,通过少量的可学习查询向量来直接预测目标。 这种设计灵感来源于Transformer架构中的注意力机制。在自然语言处理中,Transformer通过query-key-value机制实现了高效的序列建模。QueryDet将这一思想引入到目标检测中,将检测问题转化为查询匹配问

FJN110的博客 384

【JavaScript】现代JS生态

现代 JavaScript 生态系统已经从简单的脚本语言发展成为一个庞大而复杂的开发环境,支持从前端到后端的全栈开发。

Guiat的博客 1331

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

57. 精读《现代 js 框架存在的根本原因》

1 引言深入思考为何前端需要框架,以及 web components 是否可以代替前端框架?原文地址,建议先阅读原文,或者阅读概述。2 概述现在前端框架非常多了,如果让我...

前端精读周刊 195

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

javascript主要框架

这确实是一个明确的库,在 three.js 的用例展示中,有几百个效果很好的例子。他的想法是直接抽取出他喜欢的angular的特性,不再引入其他复杂的理念而打造一款新的框架。它在javascript运行时环境中工作,因此显示了java的类似属性,例如线程,包,循环的形成。polymer是由google开发的开源javascript库,它可以创建网站的各个元素,而无需进入复杂的层次。angularjs是一个mvc模式的框架,但reactjs是一个由facebook开发的非mvc模式的框架。

weixin_53370274的博客 1606

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JavaScript框架有哪些?JS框架汇总

JavaScript是一种多范式语言,支持事件驱动,功能和命令式(包括面向对象和基于原型的)编程样式。JavaScript最初仅用于客户端。但是,如今,JavaScript也被用作服务器端编程语言。总而言之,用一个简单的句子来说-JavaScript是网络的语言。 什么是JavaScript框架,为什么要使用一个? 软件框架是一种抽象,其中可以通过其他用户编写的代码有选择地更改提供通用功能的软件。JavaScript框架是用JavaScript编写的应用程序框架,程序员可以在其中操纵功能并方便使用。 框架更

qq_36272264的博客 5974

[译文] 现代 js 框架存在的根本原因

原文链接:The deepest reason why modern JavaScript frameworks exist 众成翻译地址:现代 js 框架存在的根本原因(翻译一样是我翻译的,但它缺了几张图,因此掘金重新发了~) 精读《现代 js 框架存在的根本原因》 by 黄子毅(感谢大神的精读,也是根据他的建议看了原文,也顺便为大家带来翻译) 我曾见过很多很多人盲目地使用(前端)框架,如 Re...

weixin_34307464的博客 154

Rete.js:重新定义可视化编程的现代JavaScript框架

Rete.js是一个革命性的JavaScript框架,专门为构建可视化编程界面和工作流编辑器而生。该框架通过直观的节点连接机制,将复杂的编程逻辑转化为易于理解的图形化操作,为非技术人员提供了零代码配置复杂业务逻辑的能力。作为数据流和可视化编程领域的创新解决方案,Rete.js在智能业务流程配置、数据转换工作流和物联网设备联动等场景中展现出强大的应用价值。 ## 架构设计与核心组件 ### 编辑

gitblog_00895的博客 658

JavaScript常用前端框架和库浅谈_前端框架设计-js

以上这些JavaScript库都是前端开发中常用的工具,它们提供了丰富的功能以及易于使用的API接口,使得开发人员可以更轻松地处理常见的任务和增加网页的交互性。在现代的前端开发中,掌握流行的前端框架和库是非常重要的。本文将介绍一些常用的JavaScript前端框架和库,包括React、Angular和Vue.js,并深入了解它们的核心概念、使用方法和最佳实践。除了前端框架之外,JavaScript库也是前端开发中常用的工具。以上是这些库的基本使用方法,更详细的使用可以查阅官方文档或相关教程。

2401_89690362的博客 957

现代 js 框架存在的根本原因

  我曾见过很多很多人盲目地使用(前端)框架,如 React,Angular 或 Vue等等。这些框架提供了许多有意思的东西,然而通常人们(自以为)使用框架是因为: 它们支持组件化; 它们有强大的社区支持; 它们有很多(基于框架的)第三方库来解决问题; 它们有很多(很好的)第三方组件; 它们有浏览器扩展工具来帮助调试; 它们适合做单页应用。 但这些都不是使用框架的根本原因。 ...

打杂人-aerchi 345

javaScript框架分类及主要功能

在本系列学习之前,首先感谢司徒正美先生写这本书的贡献。 从内部架构和理念划分,目前JavaScript框架可以划分为5类。 第一种是以命名空间为导向的类库或框架,如果创建一个数组用new Array(),生成一个对象用new Object(),完全的java风格,因此,我们以某一对象为跟,不断为它添加对象和二级对象属性来组织代码,如金字塔般垒起来,早期代表YUI,EXT(so,不是有活

jl28dux800的专栏 474

现代 JavaScript 的入门教程

现代 JavaScript 通常指的是自 ECMAScript 2015(也称为 ES6)以来的一系列语言更新和改进,以及随之而来的开发工具、库和框架的生态系统。这些变化不仅增强了 JavaScript 的功能性和表达能力,还推动了更高效、更模块化和更具可维护性的编程实践。

金石软件 1271
上一篇: 我们在大学图书馆发现了三本有毒的书
下一篇: 开放式办公环境真是个糟糕的做法
极光推送
博客等级 码龄14年 109粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值