在Django应用程序中创建自定义模板标签
Angular和Rxjs
在React应用程序中使用recompose实现更好的关注点分离
如何将TestRail与RSpec集成
使用react x react-router x webpack-dev-middleware构建Incognito SPA
知道故事的其余部分:Flickr的视频格式
是编译器故障时的那种感觉
是编译器故障时的那种感觉

今天,我们将告诉您每个开发人员都熟悉的故事。 有一些错误会导致您在调试过程中怀疑所有问题:已实现的代码,使用的库,编译器,OS甚至是空中的中微子。 这样的故事最常见的结局是您找到一个 愚蠢的错误/注释掉的代码/未定义的行为等,这是完全负责的。 可以肯定的是,编译器和OS与该问题无关。 但是,这个故事有些不同。 虽然问题确实出在我们的代码中,但编译器与此有关。 第一次接触 在一个用于监视Linux系统上的用户活动的项目中,我们使用了安装系统调用挂钩的内核模块。 Linux挂钩是没有适当权限的典型Wild West。 没有普遍广泛的解决方案,并且关于该主题的知识在一定程度上受到限制。 没有足够技能的人可能会对整个系统造成破坏。 最初,对于Linux挂钩,我们曾经在syscall表中交换处理程序。 在遇到问题之前,它一直很好用:对于某些系统调用,此技术不起作用。 因此,我们尝试使用Ftrace框架。 该方法在以前的项目中效果很好,因此进行了原型设计,改进并移至当前项目。 但是在开发人员的烟雾测试中,事实证明,挂钩安装直接将整个系统挂起。 从字面上看,发生这种情况: 在尝试本地化问题时,我们发现了以下问题: 可以在SLES和OpenSUSE上复制问题 无法在Ubuntu,Debian,CentOS,Fedora上重现该问题 没有SUSE修补程序的内核无法在SLES上重现问题 使用初始挂钩的原型无法在SLES上复制问题。 调试 通过QEMU连接交互式调试器的工作并不多。 这不是某种形式的SpinLock挂起,系统仍然可以运行,但是当执行exit_group()syscall时,所有进程陷入一个无休止的循环中,这是我们尝试挂钩的过程之一。 我们唯一的线索是继续监视ftrace回调行为: 当一切都按预期工作时,parent_ip应该指向模块内部,在另一种情况下,它将指向内核中不应有的位置。 这是钩子工作的必要条件。 无论出于何种原因,它都可以在原型中工作,但不能在完成的项目中工作。 研究代码两个小时,将其与原型代码进行比较,添加日志和断点将什么都没有。 两种情况下的代码看起来相同,并且应该相同,但事实并非如此。 最后,我放弃并开始统一工作原型和有故障的模块的代码。 我扔掉了不必要的部分,将所有代码合并到一个文件中,重命名并移动了所有结构和功能,以使它们看起来完全相同。 经过数小时的比较,与同事,我自己和桌上的一杯咖啡讨论了这个问题,我终于能够看到代码中的区别。 而且那不是我期望的。 这是挂钩代码的全部区别。 问题的根源 我永远都不会怀疑一条日志行,尤其是在这种情况下,应该负责任。 代码中的注释正确指出在调用原始处理程序之后,永不执行exit_group()。 这就是为什么看似无用的日志输出被注释替换的原因。 从挂钩返回值也已停止,以避免编译器警告。 很难相信,但这是事实:如果我们采用模块代码并在原始函数和值返回之间返回日志输出,则SUSE不再挂起。 意识到这是我的顿悟时刻。 问题在于尾部呼叫优化。 谢谢约翰·麦卡锡。 我学习一种计划语言并不是没有用! 在残破的代码中,原始函数的调用与值的返回之间没有任何关系。 这允许执行所谓的尾部函数调用,而无需通过简单地转到新函数的地址来创建额外的堆栈帧。 快速查看机器代码可以确认这一点: 知道了! 问题是ftrace挂钩依赖于正确的调用堆栈。 在上面的回调中检查的变量parent_ip包含从堆栈中获取的用于返回函数的地址。 通过此地址,回调函数可以了解是从rs_sys_exit_group()还是从其他位置调用了该函数。 […]

Chegg的Hacking React
Chegg的Hacking React

在Facebook上从事开源项目的工作之后,是我下一次冒险的时候了。 TL; DR:与React Core团队合作并维护Draft.js框架确实很棒。 这是关于我如何到达那里的故事,以及为什么我现在加入Chegg的Web工程团队的故事。 我很高兴加入Chegg的原因有三个: 他们帮助学生的使命对人们的生活产生了积极的影响。 Chegg工程正在React,Redux和其他现代的开源Web技术上全力以赴。 Chegg拥有积极的公司文化,重视工作场所平等,团队合作和娱乐。 在这个过渡时期,我想分享一下我在React和Draft.js框架上的工作经验,以及这种变化将如何影响我在开源中的工作。 如何进入Facebook开源 我对开源的兴趣早在我加入Facebook之前就开始了,所以我在2015年开始在Facebook工作时一直在寻找参与开源的机会。当Draft.js的作者在内部发布寻找志愿者的时候,我展示了起来 如果您以前没有遇到过Draft.js,它会广泛用于Facebook产品和开源React社区中的富文本编辑。 事情进展顺利-然后发生了剧变! Draft.js作者离开了Facebook。 第二天,我查看了该项目,发现没有人在Facebook内部担当过“维护者”的角色。 我对经理说,“我想继续做下去”,他说“去做吧!”。 因此,从2016年末开始,我用了10%到20%的时间接管了Draft.js的维护工作。在许多共同维护者的帮助下,我们修复了框架的错误并改进了文档。 我们面临的最大问题是将Facebook内部和GitHub中的更改同步到两个存储库中。 在开源支持团队的帮助下,我们设置了脚本以自动复制Facebook和GitHub之间的更改。 2017年,Facebook内部对Draft.js的采用增长了约46%。开源Draft.js社区也有所增长,在2017年6月至12月期间,每月的npm下载量增长了一倍以上。我相信我对Draft.js项目的参与有助于我对Open Source的兴趣在Facebook上更加明显,这使我有机会加入React Core团队并致力于React.js本身。 我很自豪能够帮助准备React框架的15.6和16.0版本。 在团队的最初几个月中,我保持与其他图书馆维护者的沟通渠道,并在聚会上与开源社区保持联系。 那令人兴奋,但我想继续提高自己的工程技能,而不是过多地关注社区管理。 因此,在16.0版本发布之后,我承担了一个项目,以更新Facebook的旧版网络基础设施,以与React中的新功能兼容。 您可能想知道,在Facebook.com的基础结构上工作感觉如何? 我记得有一天,布莱恩·沃恩(Brian Vaughn)问我“最近怎么样?”,我告诉他,这就像在印第安那琼斯(印第安纳琼斯)一样在古老,神秘的地牢或庙宇中摸索。 寺庙的监护人要么早逝,要么休假,或者忘记了几年前写的密码的来龙去脉。 这样做很有风险,因为推送错误可能会破坏整个Facebook.com! 因此,您只要勇敢并继续前进即可。 而且您还使用功能标志。 在此过程中,我曾协助其他多个项目,例如重写Reactjs.org文档网站,但总体而言,我对内部Facebook React社区的关注“令人沮丧”。 我还暂停了Draft.js的工作,以便专注于Facebook中的React使用。 在团队结束时,我发现自己很少参与Facebook之外的开源社区。 所以,虽然我很伤心的离开了我一天到一天的工作与人的阵营的核心团队,我会很乐意与Facebook的开源JavaScript社区外重新连接。 我将在业余时间继续为开源项目做出贡献,包括React.js。 React.js在Facebook上仍然拥有一支敬业的团队,当Hooks,Suspense和其他改进发布时,我很高兴看到。 我相信React将继续革新前端开发。 另一方面,Draft.js从未在Facebook内拥有专门的团队。 我刚离开。 那么,谁现在将维护Draft.js? 不用担心! 因为- 为了准备离开,我为Draft.js框架招募了5名新的Facebook维护人员。 他们已经取得了长足的进步,包括使用MIT重新授权Draft.js框架并删除了patents子句! 如果一个维护者是好的,那么拥有5个维护者会更好! 是的,我仍然打算作为外部维护者为Draft.js做贡献。 该项目的未来看起来比以往更充满希望。 如何找到理想的工作 在考虑一个新的工作场所时,我依靠汤姆·奥奇诺(Tom Occhino)曾经告诉我的一个秘密-只是寻找以下三件事: […]

React组件的分类
React组件的分类

模板通用规则 模板仅管理事物的外观 模板只是显示来自输入的数据 可测试模板针对特定输入返回相同的输出 React提供了管理状态的选项。 这些规则在组件破坏中处于任何状态。 解决方案是分离。 具有内部状态的组件应仅向仅呈现UI的组件提供状态。 模型和状态管理应始终与UI分开。 稍后更多有关React组件类别的信息。 创建React的动机 传统上,Web应用程序UI是使用模板或HTML指令构建的。 这些模板规定了允许您用来构建UI的完整抽象集。 React通过将用户界面分成多个组件来构建用户界面的方式有所不同。 React使用一种真正的,功能齐全的编程语言(主要是javascript)来呈现视图。 React可以描述为将数据转换为UI的函数。 💚没有直接的DOM操作 💪Java的全部功能 零件 React通过将UI分解为组件来构建用户界面。 组件是现代前端应用程序的高度可组合,可扩展和可测试的构建博客。 但是,要使任何软件具有高度可重用性和可测试性,您需要遵循一些规则。 提供所有输入作为函数参数或组件属性 不使用全局状态 尽可能消除内部状态 总之,我们刚刚从函数编程中描述了Pure函数的一些基础知识。 遵循这些规则,我们将使用称为策略模式的设计模式。 如果您想了解有关函数式编程的更多信息,请参见以下文章。 可测试的Javascript->函数式编程->纯函数 您想成为一个更好的开发人员,应该开始编写测试。 测试将帮助您发现许多不正当的习惯… medium.com 策略模式 组件模式在“四个设计模式的组合”中未提及,但与“策略”模式相似。 两种模式都在谈论对象行为的一部分,并将其委派给一个单独的从属对象。 区别在于,使用策略模式时,“策略”对象通常是无状态的,它封装了算法,但没有数据。 每个小块都像一个组件 块可以连接到另一个块并形成更复杂的组件 可以组合块以实现不同的视觉或实际用途 目标是拥有可用于各种应用程序的可重用组件 表现成分 base基本样式的组件 只关心事物的样子 。 通常用于排版和布局 通常只使用props.children 示例: h1,section,div,span,Icon,Avatar (可能包含className和accessibility属性) 💅演示组件 您创建的演示组件应该是可重用的,您应该能够使它们中的任何一个对其进行自定义并将其放置到其他应用程序中 关注事物的外观 。 仅通过道具接收数据和回调。 除了UI状态外,很少有自己的状态 […]

2017年将成为集装箱安全之年
2017年将成为集装箱安全之年

安全正在成为2017年容器化的一项重要功能(即使不是最重要的功能)。不仅对于Docker这样的公司,对于Linux内核维护者,云供应商,Linux OS发行版,当然还有Swarm和Kubernetes这样的容器编排者。 安全始终是至关重要的,但这并不意味着安全就应该得到市场和媒体的关注。 但是,有趣的是,我认为Docker和硅谷之外大规模集装箱化的兴起正将安全放在首位。 2017年的集装箱安全 每个人对容器化和安全性都有不同的看法,但我想提供这种观点。 安全成为关注焦点不是因为容器技术本身使应用程序或主机更容易受到攻击,而是在许多情况下相反。 精明的公司正在关注并改变他们的故事,营销和结果,从而改变他们的工程工作。 如果采用良好的安全规范实施容器化,则容器可以提供更好的应用程序安全性,而不是仅VM解决方案。 这是因为现在容器有机会成为应用程序利用与攻击者访问主机之间的另一个边界。 安全人员将指出,攻击有多种类型,上面的示例仅列出了一种类型。 公平,真实。 但是我的主要观点是,如果容器在概念上为我们提供了额外的防线,那么我们就不必再集中精力研究容器是如何带来安全风险的,而是将其转变为一种新的防御机制。 集装箱化迫使集装箱采用者采取良好的安全措施 应用程序容器化的爆炸性增长,再加上将单片式应用程序分解为微服务(对还是错)的推动力,这意味着无论意图如何,这种范式转变都使分布式系统成为主流。 这并不是因为希望实现分布式系统,而仅仅是因为这就是最终的结果,尤其是在将容器编排器添加到组合中之后。 结果,以前可能支持单个大型应用程序的开发人员和操作人员现在将需要开始更好地了解诸如最小特权原则之类的概念,因此,如果集群中的一个节点受到威胁,这并不意味着整个系统都可以。 也许这就是为什么安全人员现在可以更早地进行对话(按照他们的说法向左移动)的原因,因为随着移动部件越来越多的系统的复杂性,风险级别也随之提高。 本叔叔在《蜘蛛侠》中告诉彼得·帕克,“拥有强大的力量,承担巨大的责任”,实施容器和容器编排也是如此。 一个具体的例子:Docker Swarm中的默认安全性 在今年5月于澳大利亚悉尼举行的最近的Container Camp会议上,DiogoMónica(Docker的安全主管)解释了Docker Engineering将要采取的措施,以确保Swarm(其容器编排工具)在默认情况下是安全的。框。 Docker“群”是具有两个角色之一的虚拟机集群,即特权管理器和非特权工作器。 Swarm在默认情况下通过许多方式将最小特权和安全性原则付诸实践-我认为其中三个应该得到最大关注。 1.默认情况下,Swarm加密节点到节点的通信 默认情况下,相互TLS。 启动Swarm集群时,将生成新的自签名CA证书。 加入Swarm集群的节点可以免费创建,轮换和设置证书。 证书的重新生成和轮换可以每小时进行一次,也可以按需进行。 简而言之,默认情况下,Swarm确保节点始终通过TLS进行通信。 当然,这可以在Kubernetes和其他协调器中完成,但需要额外的管理工作。 2.群机密管理:默认情况下最小特权和加密 机密在RAM磁盘(内存中,但在文件系统上)的工作节点上加密(静态加密)。 工作节点仅从管理器传递他们需要的秘密。 以最低特权工作,因为工人只能得到他们需要的东西。 不需要秘密吗? 没有秘密。 从节点删除容器时,机密也会从内存中删除。 当您的容器协调器为加密机密提供开箱即用的支持,并且能够确保仅需要特定机密的节点能够接收到它们时,开发和运营便不会为机密管理最佳实践辩解。 3.蜂拥而至的最低特权示例 Swarm是基于“不是,如果有,而是何时”入侵透视图构建的。 然后,问题就变成了如何隔离受感染的节点(管理员或工作人员),限制造成的损害并确保群集甚至可以自我修复。 群工人节点无法获取管理节点元数据或密钥。 Swarm Worker节点将其机密存储在内存中,因此即使导出了受感染的VM,这些机密也不会成为快照的一部分。 群集工作程序节点不会盲目地信任其管理程序节点。 例如,对每个分布式容器映像进行签名和检查,以确保它们获得的映像符合预期。 Kubernetes和其他编排工具也提供了许多这样的功能,但我认为Docker Swarm目前在简化良好安全实践方面处于领先地位,只需简单地使它们成为默认配置并使其开箱即用即可。 4.特定于容器操作系统的映像和最低特权 Docker通过其开源LinuxKit项目,使团队可以在几分钟内构建自己的微型且受限制的虚拟机映像,仅捆绑运行时所需的容器。 5.容器映像安全性和最低特权 Docker和17.05多阶段构建功能使开发人员和运营商可以轻松构建仅在容器内部具有基本要素的映像,以用于运行时执行。 […]

React,Vue和Angular是不错的选择!
React,Vue和Angular是不错的选择!

如今, Web开发正变得最流行,有吸引力和有趣,因为今天我们拥有可以使我们做自己想做的一切的技术和工具,唯一的局限在于我们的想象力,但是在所有这些新技术面前,我们也可以获得丢失。 在项目开始时,我们面临一个选择: 我们应该使用什么技术? 我们将确切使用哪些工具? 这些不同的技术和工具有什么区别 当您想断言自己是前端开发人员时,同样的问题可能会再次出现,我们不知道确切选择什么以及为什么选择。 因此,当要选择在项目中使用哪种技术,甚至选择成为一名成熟的前端开发人员时,有必要在这里基于某些方面,根据人们的相对和变化而定。 我们将在这里指出一点: 学习曲线 整合方式 工作机会 申请类型 首先,我们将简要介绍以下三种技术: 角度的 Angular是由Google开发的,第一版发布于2010年,Angular是一个基于打字稿的框架。 在创建之初,我们称为angular的最初称为AngularJs,直到2016年才将其从AngularJs 1.X迁移到Angular 2.0,然后从今年开始我们有了该框架的某个版本,而今天是那时发布的angular的当前版本是Angular 7.0。 Angular是一个完整的框架,这意味着一旦安装,Angular的核心便带有路由系统和导航,表单验证系统以及其他多项功能。 反应 React是由Facebook开发的,它的第一个版本是在2013年,React基于javascript语言(React是javascript)。 与Angular React是我们用来创建UI组件的库不同,React功能强大,但仅它不能做很多事情,要完全使用React,您必须添加其他几个库,例如React-router-dom,以在其中进行路线和导航管理。应用程序,http请求库(例如axios(或使用fetch)),表单验证库。 React使用JSX(JavaScript XML。),这是对ES6的全面支持的javascript的synthax扩展,它看起来像HTML页面,但不是HTML页面。 Vue Vue也称为Vuejs,由前Google员工Evan You开发。 Vue的第一个版本于2014年发布,使其成为三个版本中最年轻的版本。 Vue as Angular是一个完整的框架,在核心中具有多个功能。 在此演示之后,让我们继续进行区别: 1.学习曲线 角度: Angular使用的打字稿不是很复杂,但是对于不想学习新事物而想开始的人来说,这并不是理想的选择。 在这三种技术之间,Angular似乎是最难学的。 Angular使用HTML作为模板,使用CSS作为样式,因此不需要您学习其他知识。 除了非常熟悉Javascript Angular的typecript理解之外,还很难理解 反应: 尽管可以仅使用javascript进行编码,但是React使用JSX。 因为它的语法很容易学习(React是javascript),所以您在其中看到的都是Javacript,并且将使用javascript,因此对于那些已经掌握javascript的人来说,他们应该是一个不错的选择。 React使用JSX来创建他的组件,学习起来并不难,但是您应该花一些时间来感到舒适。 Vue: Vue(例如react)也使用Javascirpt和Html,css来创建他的组件,这使Vue在我看来是三者中最容易理解的。 2.整合 角度: Angular集成起来比其他两个要复杂一些。 如果您已经有一个Html和CSS项目,并且想要添加Angular,则需要做很多配置(您需要创建一个Angular项目,然后尝试将其合并到该项目中)。 React&Vue 与Angular不同,它们可以轻松集成到现有项目中,而无需进行大量配置和工作。 3.工作机会 […]

在Linux中创建库
在Linux中创建库

从这里我们有两个选择。 静态库(静态链接库) 动态库(动态链接库或共享库) 在继续之前,我想谈谈静态库和动态库之间的区别。 当涉及到静态库时,它们会在编译时使用。 这意味着,stringlen和getsum的目标代码在编译后就驻留在可执行文件中。 不利的一面是您的库越大,可执行文件或应用程序就越大。 另外,每次更新库时,都需要重新编译一个新的可执行文件以利用这些更改。 另一方面,在运行时使用动态库。 他们通过在编译时不将所有功能的目标代码插入可执行文件中,而是仅插入库位置的内存地址来实现此目的。 因此,当调用一个函数时,程序将在该地址中搜索该函数并执行它。 您可能已经猜到了,这使得可执行文件更加轻巧,并且库的可移植性大大提高,因为每次更新库时都无需创建新的可执行文件。 为了创建一个静态库,我们将从GCC开始将.c文件构建为目标文件格式,以便可以将它们组合成一个库。 上面的gcc命令包含-c选项,用于汇编目标文件(.o)。 -Wall -Werror -pedantic -Wextra选项用于严格的错误检查,*。c表示我们要从该目录内的所有.c文件中组合对象文件。 接下来,我们将归档目标文件,并将它们构建为单个.a文件(静态库文件) 剩下要做的就是链接并编译我们的静态库文件和主文件,以创建可执行文件。 上面的GCC命令从-static选项开始,以防止与共享库(动态库)链接。 包含主文件后,我们使用-L。 选项,让编译器知道我们正在链接存在于同一目录中的库。 -lfoo将是编译器在目录中查找的库(假定库名的开头是lib,结尾是.a(对于静态)和.so(对于动态)。 最后是-o选项来命名我们的可执行文件。

Vuex Rehberi,Nedir,NasılKullanılır?
Vuex Rehberi,Nedir,NasılKullanılır?

VuextıpkıFacebooktarafındangeliştirilenve dahasonrasındatopluluktarafındandevam ettirilen veriyönetimikütüphanelerigibi(Flux,Redux),karmaşıksüreçleridaıtınııııııııııııııııııııııııııı 您需要在包裹中添加一些其他信息,然后才能在github上找到更多信息。 Repo’yu kendi yerelortamınızaçektikten奏鸣曲“ package.json”içerisinde3 adet komutgöreceksiniz。 Klasöryapısı Sonrasındayapmamızgereken main.js文件已导入,但导入属性为olarakyerleştirmek。 Böylelikleuygulamamızın渲染edildiği她的noktada商店değişkenlerinevemetodlarınaerişimsağlayabileceğiz。 Buradayaptığımız; öncelikleVuexkütüphanesinidahl ediyoruz。 Sonrasındadahilettiğimizbu Vuexkütüphanesini/modülünüalıpVue’yakullanmasıiçintalimat veriyoruz。 Dahasonrasındaiseuygulamamızınherhangi bir yerindenerşipyönetebileceğimizdeğikenve metodlardanoluşansıfınıoluşuruyoruz。 Burada Vuex.Store商店商店4 adet metodsözkonusu。 瓦罗兰州州,吸气剂,突变和行动olmaküzereuygulamamıziçerisindeveriakşınısağlamakveyönetilebilirbir商店oluşturmakiçinkullanacağımızmetodlar。 Yukarıdakigörseldekigibioluşturduğumuzstore’da elimizde萨德斯州var ve bu tan tanlanm’an’an app’vueiçerisindeçağırıp渲染了edebiliriz。 Ufak birörneklegösterelim。 应用程序 Öncelikle {{this。$ store.state.firstName}} ile store’dan gelendeğişkenimizidahil ettik。 Artíkuygulamamıziçerisinde使edilebiliyor。 存储üzerindedeğişiklikyaratabilmekadına输入ve按钮oluşturduk。 input’da birdeğişiklikolduğunda数据içerisindeki值biz商店业务名称changename fonksiyonuçalışarak商店içerisindekifirstName state’inigüncelliyor。 Dolayısıylauygulamaiçerisinde渲染了edilen state’dedeğişmişoluyor。 […]

使用Vue.js构建应用程序的优势
使用Vue.js构建应用程序的优势

Vue.js是一个JavaScript库,用于使用MVVM(模型-视图-视图模型)架构模式构建Web界面。 Vue.js完全是从头开始设计的,将逐步采用。 因此,如果您熟悉HTML,CSS和JavaScript,那么Vue.js入门非常容易, 在许多情况下,Vue.js取代了Angular,Ember和React-这是一件好事,并使其与之不同。 除此之外,Vue与其他现代工具和支持库相结合,以呈现完美的单页应用程序。 1.很小的尺寸 JavaScript框架的成功取决于其大小。 尺寸越小,将使用越多。 Vue.js的最大优点之一是它的体积小。 该框架的大小为18–21KB,用户无需花费任何时间即可下载和使用它。 它击败了所有庞大的框架,例如React.js,Angular.js和Ember.js。 2.易于理解和开发应用程序 简单是Vue的DNA的一部分。 该框架受欢迎的原因之一是它很容易理解。 由于其结构简单,用户可以轻松地将Vue.js添加到其Web项目中。 小型和大型模板都可以通过此框架开发。 3.以灵活性着称 Vue.js具有完美的平衡,可以快速编写并直接从浏览器运行。 您可以使用ES6,JSX,组件,路由,捆绑等来构建复杂的应用程序。这使得使用Vue.js来开发跨平台应用程序成为首选。 它使您可以访问各种环境。 4.好的详细文档 它还提供了详细文档的优势,这使开发人员可以更轻松地编写和执行第一个应用程序。 您只需要具备HTML或JavaScript的基本知识即可开发网页或应用程序。 这是因为文档功能足够全面。 5.解决AngularJS和ReactJS的缺点 Vue.js的创建者Evan You介绍了这个流行的JavaScript框架。 他创建Vue.js的目的是解决两种最受欢迎​​的JavaScript框架AngularJS和ReactJS的弊端。 因此,他通过提取AngularJS零件开发了一种轻量级的解决方案,而没有添加任何其他概念。 他希望将两个框架的最佳功能结合起来,这就是他如何使用新的Vue.js。 Vue.js采用了基于组件的方法,用于组件层次结构的单向数据流,虚拟呈现能力,高性能,道具以及Web应用程序中应用程序状态管理所扮演的角色等。 结论 Vue是一个非常强大的工具,可用于在Web上构建丰富的体验,并且该框架非常成熟,并由社区很好地维护。 它在开发人员中非常受欢迎,根据一项调查,2017年有89%的开发人员表示他们会再次使用该框架。 Vue内置的简单性和更多的优势使他的竞争对手超越了竞争对手: –温柔的学习曲线, –出色的文档, –对开发人员而言非常快的编码速度。