• Facebook 是如何进行大规模代码部署的
    摘要:Facebook 高速发展的 2007 年到 2016 年,他们一天部署 3 次代码,cherry-pick 集齐成千上万个 commit;现在使用类似持续交付的方法,每个 commit 能自动部署到 production。公司里有很多员工、很多用户的好处:新代码让公司所有员工先用上,因为员工数足够多,能很快发现问题;然后让 2% 的访问量用上新代码,最后慢慢增加到 100% 的访问量。不久前有篇关于缩短 Facebook 发布流程的文章,阐述了将代码投入生产的灵活方法。这篇文章着重讲述了他们在一年之内如何从“ cherry-picking ”升级到“ push-from-master ”策略。早些时候, Facebook 也分享了他们部署过程的细节。作者 Chuck Rossi 是 Facebook 的首位发布工程师,目前是 Facebook 发布工程的工程总监。Facebook 的发布周期是“ quasi-continuous ” (准连续)——这只是一种委婉的说法,表明并非每次提交都会部署到生产环境,实际上它采用的是对几十到几百个提交进行批处理,每隔几个小时就进行推送。这种分层发布的方式使任何变更的回滚很容易。这个新系统从 2016 年 4 月开始,经过一年的时间慢慢地完善。早先的模式是从主干分支的提交中选择特定的变更放到发布分支上。发布分支每天将这些变更推送到生产环境。这种“ cherry-picking ”的特点是,每天选择变更的数量为 500 ~ 1000。剩下的变更就推入到每周发布分支中。随着时间的推移,提交的数量和参与其中的工程师都有所增加,发布工程师的手工劳动变得过多,以至于无法持续。这个 CD 系统的关键组件是一种控制方法,即谁将接收变更,以及用于部署和测量的自动化工具。在第一步中,经过一系列自动化测试后,变更就从内部推送到 Facebook 员工。在这一阶段发现的任何回归,都会被认为这一进程受阻或者停止。下一步涉及到“ canary deployment ”(金丝雀部署),只推送至生产环境的 2% 。依靠连续的监测来检测问题。如果一切顺利,这些变更将 100% 部署到生产环境中。名为 Flytrap 的工具收集用户报告,并发送任何异常情况的告警。Facebook 中的 Web 和移动产品遵循两条不同的路径,原生移动变更的部署频率低于 Web 。这两个都由名为 Gatekeeper 的系统控制。除此之外,Gatekeeper 还分离出了部署和发布。这种分离带来了挑战,包括维护向下兼容性。由于工具和部署选项的性质,移动持续部署面临着一些特定的挑战。Web 部署则更为容易,因为 Facebook 拥有完整的技术栈和工具。为了解决这些挑战,Facebook 已经构建了一些专注于更快的移动开发的工具和库,包括 Buck 、Phabricator、 Infer、 React 以及 Nuclide 。Facebook 的移动部署是以三层来并发运行。[*]构建:合并到移动主分支上的所有代码都会进行构建,这会针对受影响的所有产品(Instagram、Messenger)并且会跨各种芯片架构。[*]静态代码分析:Linters 和静态分析工具的组合,称为 Infer ,用于检查各种问题,包括资源泄漏、未使用的变量、有风险的系统调用和编码准则违规。[*]自动测试:包括单元、集成和端到端测试,会使用到 Roboelectric、XCTest、JUnit 和 WebDriver 等工具。在代码变更的生命周期内,每次提交都会执行移动构建并运行测试栈,这样就会运行很多次。单单 Android 一天就有 5 万到 6 万个构建版本。移动部署系统遵循较早的基于 Web 的模式,每周发布一次,按 cherry-picking 策略随机选择变更。尽管代码传输速度和发布频率有所增长,但工程师的生产率保持不变。然而,本文提到的标准(代码行和推送次数),可能并非衡量生产率的最佳标准。据 2016 年 IEEE 的论文和相关讨论,Facebook 早在 2005 年就利用了某种形式的 CD。该论文中的一些结论列出了 CD 成功的先决条件:可观的持续投资、高度熟练的开发人员、强大的技术管理,开放和平等的文化,风险回报权衡管理、客观回顾失败以及有专注力的小团队。Facebook 的准连续部署系统具备这几个优点:没有推送热补丁的手工开销,对分布式工程师团队有更好的支持,为工程师提供了更快的反馈循环。查看英文原文:How Facebook Achieves Rapid Release at Massive Scale译者:sambodhi
  • [技术交流] 一名全栈工程师的必备工具箱
    全栈工程师,也叫全端工程师,是指掌握多种技能,并能利用多种技能独立完成产品的人。全栈工程师熟悉多种开发语言,同时具备前端和后台开发能力,从需求分析,原型设计到产品开发,测试,部署,发布全流程都十分熟悉。全栈工程师由于经常研究各种技术,他不会精确记得所有语言代码的语法和API,他觉得没有Google和百度,几乎没法工作。他记的只是一个Key,一个如何找寻答案的索引,而不是全部,人脑不是电脑,他不可能记下所有的东西。对全栈工程师而言,各种辅助工具是十分重要的。全栈工程师更多的工作不是造轮子,而是用各种轮子组合造产品。下边就我多年的经验,向大家推荐我百宝箱中的各类工具,希望对大家有帮助。这里边主要推荐以下工具:需求分析工具、原型设计工具、代码检查工具、自动化测试工具、部署工具,最后还会给大家介绍一款我最近在使用的端到端全流程的开发神器。需求分析工具XMindXMind是一种实用的思维导图工具。 思维导图是一种将思维形象化的方法。它可用来作为管理项目、笔记或知识库,也可以用来头脑风暴,记录思路,整理软件产品功能和需求等等。地址:http://www.xmindchina.net/Visiovisio是一款便于开发和设计人员就复杂信息、系统和流程进行可视化处理、分析和交流的软件。帮助我们创建具有专业外观的图表,以便理解、记录和分析信息、数据、系统和过程。地址:https:// products.office.com/zh-cn/Visio/flowchart-softwareStarUMLStarUML是一套盛开源码的软件,不但免费自由下载,连代码都免费盛开。StarUML可描摹9款UML图:用例图、类图、序列图、事态图、行动图、通信图、模块图、安排图以及复合构造图等。地址:https://staruml.en.softonic.com/原型设计工具:AxureAxure能帮助需求设计者,迅捷而轻便的创立基于目录组织的原型文档、功能解释、交互界面以及带注释的wireframe网页,并可积极生成用于演示的网页文件和word文档,以供给演示与开发。地址:https://www.axure.com.cn/Omni GraffleOmni Graffle软件由Omni Group公司出品,可以在OS X平台上轻松绘制漂亮的图表、树状结构图、流程图、页面等,可以用来规划电影或剧本的情节走向、绘制公司组织图、专案进度等等。该软件界面非常漂亮,模板丰富精致,容易激发灵感,辅助对齐和尺寸调整功能强大。目前还推出了iPad版本的应用。地址:https://www.omnigroup.com/代码检查工具CodeReviewerCodeReviewer是一款免费的、简单的又易于部署和使用的代码审查工具,由SmartBear开发——也是Collaborator的发明者,业界第一家推出商用代码审查工具的公司。地址:https:// codereviewer.org/SmartBearSmartBear是一个有助于团队通过共同的开发、测试和管理工作以便能生产出高质量代码的代码审查工具。地址:https://smartbear.com/CrucibleCrucible是另一款超级受开发人员欢迎的代码审查工具,可以审查代码、讨论修改,通过Crucible灵敏的审阅流程来确定缺陷。地址:http://www.atlassian.com/software/crucible/overview自动化测试工具QTPQTP是一种自动测试工具,主要是用于回归测试和测试同一软件的新版本。QuickTest针对的是GUI应用程序,包括传统的Windows应用程序,以及现在越来越流行的Web应用。它可以覆盖绝大多数的软件开发技术,简单高效,并具备测试用例可重用的特点。其中包括:创建测试、插入检查点、检验数据、增强测试、运行测试、分析结果和维护测试等方面。地址:http://quick-test-professional.weebly.com/SeleniumSelenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite、Google Chrome等。这个工具的主要功能包括:测试与浏览器的兼容性,测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能,创建回归测试检验软件功能和用户需求。地址:http://www.seleniumhq.org/部署工具Ansibleansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。地址:http://docs.ansible.com/SaltSaltstack是一个大型分布式的配置管理系统(安装升级卸载软件,检测环境),也是一个远程命令执行系统。saltstack的两大功能:远程执行和配置管理。地址:https://docs.saltstack.com/en/latest/Puppetpuppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。地址:http://puppetlabs.com/神器推荐:DevCloud之所以说DevCloud(华为软件开发云)是全栈工程师的开发神器,是因为它可以提供软件开发全流程的工具,随时随地在云端进行项目管理、配置管理、代码检查、编译、构建、测试、部署、发布等。这些功能让我能够把精力集中于产品的设计和研发,而不需要自己维护各类工具。而且华为在这个产品上开放了多年的研发经验,让我的开发过程更标准化,从而进一步提升开发效率和产品质量。目前华为软件开发云对于5人+500M以内是免费的。地址:https://www.hwclouds.com/devcloud/总结技术快速更新迭代,各种辅助工具也层出不穷,眼花缭乱。我们不需要面面俱到,在每个流程深入用好一个工具,就可以帮助我们提升我们的开发效率。希望越来越多的工程师加入全栈工程师的阵营,体会全栈工程师的乐趣。也希望大家可以多多沟通交流,寻找出更多的好工具。
  • 一名全栈工程师的必备工具箱
    全栈工程师,也叫全端工程师,是指掌握多种技能,并能利用多种技能独立完成产品的人。全栈工程师熟悉多种开发语言,同时具备前端和后台开发能力,从需求分析,原型设计到产品开发,测试,部署,发布全流程都十分熟悉。 全栈工程师由于经常研究各种技术,他不会精确记得所有语言代码的语法和API,他觉得没有Google和百度,几乎没法工作。他记的只是一个Key,一个如何找寻答案的索引,而不是全部,人脑不是电脑,他不可能记下所有的东西。 对全栈工程师而言,各种辅助工具是十分重要的。全栈工程师更多的工作不是造轮子,而是用各种轮子组合造产品。下边就我多年的经验,向大家推荐我百宝箱中的各类工具,希望对大家有帮助。这里边主要推荐以下工具:需求分析工具、原型设计工具、代码检查工具、自动化测试工具、部署工具,最后还会给大家介绍一款我最近在使用的端到端全流程的开发神器。需求分析工具XMind XMind是一种实用的思维导图工具。 思维导图是一种将思维形象化的方法。它可用来作为管理项目、笔记或知识库,也可以用来头脑风暴,记录思路,整理软件产品功能和需求等等。 Visio visio是一款便于开发和设计人员就复杂信息、系统和流程进行可视化处理、分析和交流的软件。帮助我们创建具有专业外观的图表,以便理解、记录和分析信息、数据、系统和过程。 地址:https:// products.office.com/zh-cn/Visio/flowchart-softwareStarUML StarUML是一套盛开源码的软件,不但免费自由下载,连代码都免费盛开。StarUML可描摹9款UML图:用例图、类图、序列图、事态图、行动图、通信图、模块图、安排图以及复合构造图等。 地址:https://staruml.en.softonic.com/原型设计工具:Axure Axure能帮助需求设计者,迅捷而轻便的创立基于目录组织的原型文档、功能解释、交互界面以及带注释的wireframe网页,并可积极生成用于演示的网页文件和word文档,以供给演示与开发。 Omni Graffle Omni Graffle软件由Omni Group公司出品,可以在OS X平台上轻松绘制漂亮的图表、树状结构图、流程图、页面等,可以用来规划电影或剧本的情节走向、绘制公司组织图、专案进度等等。该软件界面非常漂亮,模板丰富精致,容易激发灵感,辅助对齐和尺寸调整功能强大。目前还推出了iPad版本的应用。 地址:https://www.omnigroup.com/代码检查工具CodeReviewer CodeReviewer是一款免费的、简单的又易于部署和使用的代码审查工具,由SmartBear开发——也是Collaborator的发明者,业界第一家推出商用代码审查工具的公司。 地址:https:// codereviewer.org/SmartBear SmartBear是一个有助于团队通过共同的开发、测试和管理工作以便能生产出高质量代码的代码审查工具。 地址:https://smartbear.com/Crucible Crucible是另一款超级受开发人员欢迎的代码审查工具,可以审查代码、讨论修改,通过Crucible灵敏的审阅流程来确定缺陷。 自动化测试工具QTP QTP是一种自动测试工具,主要是用于回归测试和测试同一软件的新版本。QuickTest针对的是GUI应用程序,包括传统的Windows应用程序,以及现在越来越流行的Web应用。它可以覆盖绝大多数的软件开发技术,简单高效,并具备测试用例可重用的特点。其中包括:创建测试、插入检查点、检验数据、增强测试、运行测试、分析结果和维护测试等方面。 地址:http://quick-test-professional.weebly.com/Selenium Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite、Google Chrome等。这个工具的主要功能包括:测试与浏览器的兼容性,测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能,创建回归测试检验软件功能和用户需求。 地址:http://www.seleniumhq.org/部署工具Ansible ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 地址:http://docs.ansible.com/Salt Saltstack是一个大型分布式的配置管理系统(安装升级卸载软件,检测环境),也是一个远程命令执行系统。saltstack的两大功能:远程执行和配置管理。 地址:https://docs.saltstack.com/en/latest/Puppet puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。 地址:http://puppetlabs.com/神器推荐:DevCloud之所以说DevCloud(华为软件开发云)是全栈工程师的开发神器,是因为它可以提供软件开发全流程的工具,随时随地在云端进行项目管理、配置管理、代码检查、编译、构建、测试、部署、发布等。这些功能让我能够把精力集中于产品的设计和研发,而不需要自己维护各类工具。而且华为在这个产品上开放了多年的研发经验,让我的开发过程更标准化,从而进一步提升开发效率和产品质量。 目前华为软件开发云对于5人+500M以内是免费的。 地址:https://www.hwclouds.com/devcloud/总结 技术快速更新迭代,各种辅助工具也层出不穷,眼花缭乱。我们不需要面面俱到,在每个流程深入用好一个工具,就可以帮助我们提升我们的开发效率。希望越来越多的工程师加入全栈工程师的阵营,体会全栈工程师的乐趣。也希望大家可以多多沟通交流,寻找出更多的好工具。
  • 【干货分享】使用 jQuery.i18n.properties 实现 Web 前端的国际化
    jQuery.i18n.properties 简介 jQuery.i18n.properties 是一款轻量级的 jQuery 国际化插件。与 Java 里的资源文件类似,jQuery.i18n.properties 采用 .properties 文件对 JavaScript 进行国际化。jQuery.i18n.properties 插件根据用户指定的(或浏览器提供的 )语言和国家编码(符合 ISO-639 和 ISO-3166 标准)来解析对应的以“.properties”为后缀的资源文件。[/backcolor]总的来说,jQuery.i18n.properties 有一下一些特点:1.使用 Java 标准的 .properties 文件作为资源文件,资源文件命名有以下三种格式: basename_properties basename_language.properties basename_language_country.properties2.使用 ISO-639 作为语言编码标准,ISO-3166 作为国家名称编码标准3.按顺序加载默认资源文件和指定语言环境的资源文件,保证默认值始终可用4.未指定语言环境时使用浏览器提供的语言5.可以在资源字符串中使用占位符(例如:hello= 你好 {0}! 今天是 {1}。)6.资源文件中的 Key 支持命名空间(例如:com.company.msgs.hello = Hello!)7.支持跨行的值8.可以以 JavaScript 变量(或函数)或 Map 的方式使用资源文件中的 Key[/backcolor]jQuery.i18n.properties(settings)
  • [技术干货] 史上最强的前端开发工程师思维导图谱
    摘要: 说到底,前端新人,如果你是一个导师,要学会去传达一个正确的观念 ,并让他们永远保持着学习的激情,不要小看一张白纸,如果给他一支水笔,他也会描绘出一幅美好的蓝图。 前端开发入门学习有:HTML、CSS、JavaScript(简称JS)这三个部分。所以在学习之前我们需要先明确三个概念:1、HTML——内容层,它的作用是表示一个HTML标签在页面里是个什么角色。2、CSS——样式层,它的作用是表示一块内容以什么样的样式(字体、大小、颜色、宽高等)显示。3、JS——行为层,它的作用是当用户触发某些行为时,会给内容和样式带来什么样的改变。以下图谱让你更好理解---可以下载高清图查看javascript流程语句.gifjavascript数据类型.gifjavascript数组.gifjavascript运算符.gifjavascript正则表达式.gifjavascript字符串函数.gifjquery知识结构图.jpgwindow对象.gif客户端知识体系.jpg浏览器对象.jpg前端开发.jpg现代前端技术解析_V2@高清.jpg游戏前端.jpg下载地址:**** 本内容被作者隐藏 ****
  • [视频] 华为软件开发云—Web应用开发演练:EHR系统01
    本帖最后由 DevCloud 于 2017-9-22 16:07 编辑
  • [视频] 华为软件开发云—Web应用开发演练:EHR系统02
    本帖最后由 DevCloud 于 2017-9-22 16:06 编辑
  • [视频] 华为软件开发云—Web应用开发演练:EHR系统03
    本帖最后由 DevCloud 于 2017-9-22 16:06 编辑
  • [技术干货] 如何将Linux原生xen-pv和virtio前端驱动装载到动到initrd中
    XEN和KVM镜像如何兼容统一,必须将Linux原生xen-pv和virtio前端驱动装载到动到initrd中,这个如何做到的呢?只需要添加module形式存在OS内的驱动,在内核中以build-in形式存在的驱动不需要添加。[*]RHEL、CentOS、Oracle系列操作系统,以CentOS 7.1为例,需修改“/etc/dracut.conf”文件,在add-driver项中添加xen-pv以及virtio的驱动(xen-pv驱动:xen-blkfront、xen-netfront;virtio驱动:virtio_blk、virtio_scsi 、virtio_net、virtio_pci、virtio_ring、virtio),驱动名之间以空格隔开,保存并退出/etc/dracut.conf文件,执行dracut -f命令,重新生成initrd。[*]Ubuntu和Debian系列系统,修改/etc/initramfs-tools/modules文件,添加xen-pv以及virtio的驱动(xen-pv驱动:xen-blkfront、xen-netfront;virtio驱动:virtio_blk、virtio_scsi 、virtio_net、virtio_pci、virtio_ring、virtio),驱动名之间是空格隔开,保存并退出/etc/initramfs-tools/modules文件,执行update-initramfs -u命令,重新生成initrd。[*]SUSE和openSUSE系列系统,修改/etc/sysconfig/kernel文件,在INITRD_MODULES=""添加xen-pv以及virtio的驱动,(xen-pv驱动:xen_vnif、xen_vbd、xen_platform_pci;virtio驱动:virtio_blk、virtio_scsi 、virtio_net、virtio_pci、virtio_ring、virtio),驱动名之间是空格隔开,执行mkinitrd命令,重新生成initrd。1、以CentOS为例,修改/etc/dracut.conf在add-driver项中添加xen-pv和virtio的驱动(具体格式要根据OS本身的要求来决定):2、保存并退出/etc/dracut.conf文件,执行dracut -f命令,重新生成initrd。3、检查是否已经成功装载了XEN和KVM的PVOPS相应模块。说明: 如果误将build-in形式存在内核中的驱动添加到initrd或initramfs文件中,不会影响虚拟机正常使用,这里全写进去只是为了修改的方便,但是使用lsinitrd命令无法检查到。可使用如下方法确定这些驱动是否以build-in形式存在内核中,例如:
  • 你知道URL、URI和URN三者之间的区别吗?
    本文来源前端大全这是一个经典的技术争论,许多人都会自问:URL、URI,很可能还有URN,它们之间的区别是什么。虽然,现在我们简单地把 URN 和 URL 都看做 URI,但严格来说URI可以进一步划分为URL、URN或者这两者的组合,所以了解这三者之间的区别将会非常有趣并让人受益匪浅。如果你恰好在某个地方碰到了这些东西,那么至少应该知道它们的含义。我认为,尽管对一般人来说,不了解这三个缩略词之间的技术差异以及它们各自的含义并不是什么问题。但是,如果你作为一个计算机科学家、一个Web开发者、一个系统管理员,或者更笼统地说,你工作在IT领域,那么了解这些知识就非常有必要了。这篇文章旨在于清楚地讲解URL、URI和URN之间的区别,帮助你快速理解这些必备知识。你是不是对这个话题也感到困惑?那么我们开始吧!起源这三个缩略词是Tim Berners-Lee在一篇名为RFC 3986: Uniform Resource Identifier (URI): Generic Syntax的文档中定义的互联网标准追踪协议。引文:统一资源标识符(URI)提供了一个简单、可扩展的资源标识方式。URI规范中的语义和语法来源于万维网全球信息主动引入的概念,万维网从1990年起使用这种标识符数据,并被描述为“万维网中的统一资源描述符”。Tim Berners-Lee ,万维网的发明者,同时也是万维网联盟(W3C)的负责人。照片由 Paul Clarke 遵循CC BY-SA 4.0 协议提供。区别首先我们要弄清楚一件事:URL和URN都是URI的子集。换言之,URL和URN都是URI,但是URI不一定是URL或者URN。为了更好的理解这个概念,看下面这张图片。通过下面的例子(源自 Wikipedia),我们可以很好地理解URN 和 URL之间的区别。如果是一个人,我们会想到他的姓名和住址。URL类似于住址,它告诉你一种寻找目标的方式(在这个例子中,是通过街道地址找到一个人)。要知道,上述定义同时也是一个URI。相对地,我们可以把一个人的名字看作是URN;因此可以用URN来唯一标识一个实体。由于可能存在同名(姓氏也相同)的情况,所以更准确地说,人名这个例子并不是十分恰当。更为恰当的是书籍的ISBN码和产品在系统内的序列号,尽管没有告诉你用什么方式或者到什么地方去找到目标,但是你有足够的信息来检索到它。引自这篇文章:所有的URN都遵循如下语法(引号内的短语是必须的):< URN > ::= "urn:" < NID > ":" < NSS >其中NID是命名空间标识符,NSS是标识命名空间的特定字符串。一个用于理解这三者的例子我们来看一下上述概念如何应用于与我们息息相关的互联网。再次引用Wikipedia ,这些引文给出的解释,比上面人员地址的例子更为专业:关于URL:URL是URI的一种,不仅标识了Web 资源,还指定了操作或者获取方式,同时指出了主要访问机制和网络位置。关于URN:URN是URI的一种,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。现在,如果到Web上去看一下,你会找出很多例子,这比其他东西更容易让人困惑。我只展示一个例子,非常简单清楚地告诉你在互联网中URI 、URL和URN之间的不同。我们一起来看下面这个虚构的例子。这是一个URI:http://bitpoetry.io/posts/hello.html#intro我们开始分析http://是定义如何访问资源的方式。另外bitpoetry.io/posts/hello.html是资源存放的位置,那么,在这个例子中,#intro是资源。URL是URI的一个子集,告诉我们访问网络位置的方式。在我们的例子中,URL应该如下所示:http://bitpoetry.io/posts/hello.htmlURN是URI的子集,包括名字(给定的命名空间内),但是不包括访问方式,如下所示:bitpoetry.io/posts/hello.html#intro就是这样。现在你应该能够辨别出URL和URN之间的不同。如果你忘记了这篇文章的内容,至少要记住一件事:URI可以被分为URL、URN或两者的组合。如果你一直使用URI这个术语,就不会有错。为了纠正一些错误,已经更新了这篇文章。如果你发现新的错误,无论是技术上的还是语法上的,请不要犹豫,告诉我们吧!
  • 我们最喜爱的五大web新标准
    本文来源知乎网由于我们为我们的客户创造开源软件、开发很多应用并改进他们的质量,我们一直在寻找能提高我们所开发的软件质量的东西。部分工作是在盯着一些让我们眼花的提议和新兴的标准,从而找到高效可用的部分。在这里,我们将探索已经开始使用的或者在将来工作中考虑用到的五个新兴的web标准。CSS变量/自定义属性在过去的十多年里,web工程师一直在用变量来创建和管理复杂的CSS系统,他们仍然是驱动对CSS预处理器产生需求的主要特性的一种,像Sass、less、Stylus。用得好的话,通过规范所有用来描述颜色、文字、边距等的值,他们能极大地增强大型代码库的可维护性。随着时间的推移,预处理器变量已经随着设计或习惯融合了一系列可共享的特性。[*]有前缀:例如,为了防止与已有的CSS关键词冲突的 $或 @[*]有作用域:在.container中可以用.container > .child访问$bgColor,但反过来就不成立了。[*]可以被重写:$bgColor: blue;.container { $[/backcolor]bgColor: red; background-color: $[/backcolor]bgColor; /* will be red */}原生的CSS变量(或“自定义属性”)采用了所有这些约定,这使得转换成原生的支持简单直观。CSS变量必须以两个破折号为前缀:--,他们的作用域为定义的选择器内,可以被后代继承,可能在后代中被重写。例如::root { --bgColor: periwinkle;}.container { background-color: var(--bgColor); /* will be periwinkle */}.container .child { --bgColor: lime; background-color: var(--bgColor); /* will be lime */}在这个例子里,CSS变量和预处理器变量之间有一些明显的差异:[*]CSS变量在使用的时候必须被var()包裹[*]--前缀与已有的预处理器使用的任何其他前缀都不一样,因此能一起使用。[*]CSS变量必须在选择器内定义,所以最接近“全局”作用域是:root[*]预处理器不知道DOM,因此靠嵌套来实现继承。CSS变量的值继承自DOM树,这一点跟普通CSS变量的继承方式一样。预处理器变量和CSS变量之间另一个显著差异在上文的代码中并不明显:因为它们没有被编译成静态值,CSS变量可能在浏览器运行的时候被更新。这意味着CSS变量可以在Javascript代码里读写,用来做计算或是动画。以下的Codepen示例示范了怎么样用CSS变量和Javascript来创建手风琴动画。codepen例子CSS变量能被 Firefox, Chrome, 和 Safari支持,当前版本的Edge部分支持: http://caniuse.com/#feat=css-variables[/backcolor]CSS模块化变量并不是唯一一种Javascript渗透到CSS的概念。特别是在近几年,Javascript开发者已经把目光转向CSS组织,在Atwood’s Law(阿特伍德定律,即:任何可以用JavaScript来写的应用,最终都将用JavaScript来写)的延伸上思考着“我能做的更好”。这里有一些好的理由可以证明:[*]不像JavaScript,CSS类名在全局的命名空间一直存在[*]在大型的编译过的样式中解决冲突是靠不住的,并且容易产生意想不到的行为,或是仅仅通过增加权重解决[*]样式透过DOM层级,能够用出人意料的方式改变子元素的样式[*]用Javascript来管理CSS允许CSS规则以运行逻辑为基础React在这种思路上尤其前卫,被Javascript控制的行内样式可以当做这些问题的答案。(可能不是样式渗透子元素,但是确实减少了一定数量的这种样式冲突的案例)。然而,它也有自己的一些缺点:[*]伪类(如: :hover或 :focus)在CSS很容易实现,但在Javascript必须被伪造[*]在Javascript中重新实现媒体查询是劳动密集工作[*]内联样式失去了被更高权重覆盖的能力,因为它们已经处于权重层次结构的顶端。[*]在动态样式上切换类名、Css变量、函数(像 calc())已经解决了大多数难题[*]性能:DOM数量是一方面,CSS能被缓存CSS模块化,在某些方面来说是CSS开发者回归到被Javascript开发者侵入的地盘:是一种解决批评和改进样式表而不会完全消除它们的方法。CSS模块本质上归结为可以引入JavaScript的局部作用域的CSS文件,并编译成唯一的类名。例如,这里:JavaScript:import * as css from ‘[/backcolor]css/buttonComponent.css’[/backcolor];const buttonHTML = `${buttonText}`;CSS:.root { background-color: #ffffff; color: blue; border: 1px solid blue;}将会被编译成以下内容:HTML:Button with modular CSSCSS:.root { background-color: #ffffff; color: blue; border: 1px solid blue;}因为 buttonComponent.css里的类是局部作用域的,并且在一个命名清晰的CSS文件中,所以就不再需要特定的类名了例如 .button。相反,推荐的格式是使用单个标准化的“根”类名称,如 .root或 .normal,然后使用特定状态的类名,如 .error, .success或 .disabled,所有这些类名可能在一定条件下应用于JavaScript 。CSS模块化还通过弱化写多个类名并使用composes解决样式容易覆盖的问题。composes关键字类似于Sass的 @extends的预处理器装饰器,除了在CSS中编译样式之外,composes以可预见的顺序返回多个命名空间的类名。例如:CSS:.root { display: inline-block; padding: 10px; color: blue;}.success { composes: root; color: green;}JavaScript:import * as css from 'css/buttonComponent.css';// css.success = 'buttonComponent_root_**2718 buttonComponent_success_pi3141'const buttonHTML = `${buttonText}`;HTML:Button with green textCSS也有一种更强的工具来增强样式的模块化: all关键词,与CSS模块化区分,能用来重置所有的属性到最原始的状态,例如.root { all: initial; }。因为这是一个新的CSS属性而不是依赖于webpack或Browserify编译器的类型,IE和Edge仍然缺少支持度。Async/Await/能让你的代码变得很棒随着越来越多的成功和偶尔(捕获)的错误,JavaScript用Promise来改进异步代码的处理。在promise出现以前,一个回调可能看起来像下面的嵌套末日:doAsyncFunction(function(result) { doSecondAsyncFunction(result, function(resultTwo) { doThirdAsyncFunction(resultTwo, function(resultThree) { // and so on… }, catchError); }, catchError);}, catchError);以上代码用promise能被转换成链式顺序,用.then()完成请求回调,用.catch()结束:doAsyncFunction() .then(result => doSecondAsyncFunction(result)) .then(resultTwo => doThirdAsyncFunction(resultTwo)) // and so on… .catch(catchError);跟早期金字塔形的传入回调和错误处理相比,这种链式语法显然更干净清晰,更容易理解。使用 async函数,开发人员不必等到写异步代码像同步代码一样直观的那天。使用async / await的初始示例如下所示:(async function() { try { const result = await doAsyncFunction(); const resultTwo = await doSecondAsyncFunction(result); const resultThree = await doThirdAsyncFunction(resultTwo); return resultThree; } catch(error) { catchError(error); }})();每个await将会中断代码的执行,直到它的promise成功回调,整段代码被包含在try/catch块内,就像同步代码一样。要记住的最重要的点:await可能只用在async 方法里作为特定的关键词,async方法本身还是异步的,不会阻塞周围的代码运行。这个三个promise的例子显示三个promise进程如何能够被逐个执行,Promise.all和Promise.race能与async/await同时运行:async function doAsyncStuff() { const [resultOne, resultTwo, resultThree] = await Promise.all([ doAsyncFunction(), doSecondAsyncFunction(), doThirdAsyncFunction() ]); // do stuff with resultOne, resultTwo, and resultThree}在技术上,await甚至不需要通过promise,因为它将在Promise.resolve中包含任何非promise的值。任何promise解决方案都会被push到调用堆栈的末尾,这个事实可能会导致一些稍微奇怪但有趣的结果:async function getAnswer() { const answer = await 42; console.log(`The answer to life, the universe, and everything is ${answer}`);}getAnswer();console.log(‘Vogons blow up Earth’);// will log:// “Vogons blow up Earth”// The answer to life, the universe, and everything is 42阻塞元素 / 惰性元素对于任何需要创建模态框并关注可访问性的开发人员来说,管理焦点一直是并且仍然是一个难以解决的问题。焦点应该从不被放到隐藏或是挡住的DOM元素,但做出合适的行为是痛苦而密集的。两个基本的监听聚焦事件选项,当人们尝试离开模态框,或是通过设置tabindex="-1"来实现手动移除所有聚焦中的非模态框元素。这两种解决方法通常以使用大型而脆弱的DOM查询来在代码里监听焦点元素结束。document.querySelectorAll('[/backcolor]a[href], button:not([disabled]), area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]);即使焦点已经被处理,隐藏的部分应该将aria-hidden设置为true,因此它不会被屏幕阅读器等辅助技术所读取。两个规范提案建议将从整体上解决模态问题:inert和blockingElements。首先,HTML属性inert,将会从关注的顺序里移除一段DOM树(好像所有可聚焦的元素都接受tabindex="-1"),并从辅助技术隐藏。blockingElements将几乎完全相反:暴露一堆“blocking elements”,这将有效地使所有其他DOM树变得惰性。例如,如果我有以下DOM结构: Modal content Other content, including links/buttons/etc 为了打开这个对话框,我将移除inert属性,并调用document.$blockingElements.push(document.querySelector('.modal')),这将渲染成不仅仅是直接的兄弟树inert,而且是父级和组先级的兄弟inert。inert和blockingElements仍然是提案,所以在任何当前的浏览器中都不是本地支持的。然而,有可用的polyfills可以使用它们现在使用: https://github.com/WICG/inert 和 https://github.com/PolymerLabs/blockingElements[/backcolor]交叉观察器观察元素滚动到视口内一直都是滚动插件开发的内容,这些插件使用一些滚动事件监听(希望能节流)。现在,交叉观察器允许开发者用一些选项和回调来创建一个观察器来观察元素滚动到视口内,这仅仅用vanilla JavaScript就可以实现。IntersectionObserver与其他DOM观察很像(像MutationObserver),在这里,你可以用一个回调和选项来创建,然后在一个DOM元素上调用.observe。每当元素与视口的交叉距离增加10%时,简单实现更新可以如下所示:const observerOptions = { root: null, rootMargin: '0px' threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]};function intersectionCallback(entries) { entries.forEach((entry) => { const percent = Math.floor(entry.intersectionRatio * 100); console.log(`Element ${entry.target} scrolled ${percent}% into view`); });}const observer = new IntersectionObserver(intersectionCallback, observerOptions);observer.observe(myElement);对象由以下属性组成:[*]root:包含滚动区域的元素(如果空着,默认为文档的视口viewport)[*]rootMargin:在根元素周围能够增加或收缩,用来计算临界点[*]threshold:一组数字格式,表示回调应该触发的目标元素的可见性的百分比。例如[0,0.5,1],将在元素滚动过0%,50%、100%可见区域时触发。为了停止观察特定元素——如果回调仅仅在元素第一次滚动的时候才需要,或是,它需要被用来观察大量元素滚动进入或退出视窗,只需要调用observer.unobserve(myElement);。断开整个观察,执行observer.disconnect();。在IntersectionObserver,一个使用unobserve()的好的案例是懒加载图片脚本,这个脚本在滚屏时用到。function onImageIntersect(entries) { entries.forEach(entry => { entry.target.src = imageSource; observer.unobserve(entry.target); }}document.querySelectorAll('img').forEach(img => observer.observe(img));浏览器仍然在慢慢渐渐给出支持,但它不用polyfill就已经可以用在Chrome, Firefox和 Edge了。IE和Safari现在还缺少原生的支持。
  • [技术干货] 华为云Linux服务器调整Web VNC(管理控制台终端)的窗口大小
    不同人对noVNC窗口大小有不同的诉求,笔者教大家如何自己调整,高手飘过,请轻拍砖。管理控制台终端Web VNC窗口大小实际是由系统设置的分辨率相关,Linux系统控制分辨率需要将vga参数传递到kernel中。通过VGA启动参数来设置屏幕分辨率模式:修改VNC窗口大小方法如下:编辑文件/boot/grub/grub.conf,在kernel的最后一行加入:vga=0x0318 (代表1024x768,24色)输入命令:vi /boot/grub/grub.conf,然后在窗口中编辑。修改后保存,重启服务器后生效。
  • [技术干货] 华为云Windows服务器调整Web VNC(管理控制台终端)的窗口大小
    不同人对noVNC窗口大小有不同的诉求,笔者教大家如何自己调整,高手飘过,请轻拍砖。华为云Windows服务器Web VNC的窗口大小取决于系统的分辨率,Windows可以在操作系统内部调整分辨率来改变窗口的大小。可选择:800*600像素,1024*768像素(推荐使用),1280*1024像素
  • 前后端分离中,前端获取后端token的存储安全问题
    在登录之后,前端获取后端的token,然后存在localStorage里面,在需要token的api请求中加上token,但是token存在localStorage里面这样是不是非常不安全?用户可以打开浏览器直接查看ajax请求看到token或者查看存储可以看到token,如果token被盗取呢?这样的安全问题怎么解决呢?
  • web页面渲染字符串时,自动将字符串中的 url 显示成链接
    例如:输入ni haohttps://s.geekbang.org hello world页面将会展示ni haohttps://www.a.com/bcd/e?a=1&c=2 hello world就如同 SegmentFault 提问编辑器中具有功能一样。请问是怎么做到的?
总条数:286 到第
上滑加载中