热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GitLab的大前端计划

原文地址:https:about.gitlab.com20170206vue-big-planGitLab的前端正在变的越来越好。如今我们做了两件大事,我们想与大家分享它们以及

原文地址:https://about.gitlab.com/2017/02/06/vue-big-plan/

GitLab的前端正在变的越来越好。如今我们做了两件大事,我们想与大家分享它们以及我们未来的大计划。

  • 如果您使用了GDK(GitLab Development Kit),请确保已经更新!如果您不知道所讲的是什么,跳过阅读即可
  • 请参考此文档查看如何升级GDK
  • 如果您在升级的过程中遇到了什么问题,可以参考我们的故障排除指南
  • 请随时反馈您发现的其它问题


我们的大前端计划


Vue很棒!不久前我曾写过一篇文章来说明为什么GitLab喜欢Vue。现在这篇文章成为了展示了我们通过Vue和webpack使得GitLab变的更快的这个长期计划的一种方式。我们希望前端开发者能够更加容易的开发GitLab。

生活中的经验告诉我们“重要的事情不是使用什么工具,而是如何使用它们”。也就是说我们选择了Vue,但并不意味着成功。也就是说我们同样可以使用Angular或React以及其它更好的工具。Vue是一种简单的方式。

我们的计划如何使用Vue在一段较长的时间中使得GitLab变的更好、更快以及更简单(的开发)呢?

下面的计划是一项正在进行的工作,非常雄心勃勃,但我相信,这将为开发和性能创造一个更好的前端。 这份文档也是对我们计划在GitLab前端做的事情的参考。


一个更加健康的前端


当我们开始开发GitLab时,我们简单的将jQuary集成在Rails中。它没有想Vue那样合理的改变大图片。较小的图片,我们添加了许多linters,更好的代码覆盖,和许多其他伟大的事情。


1.只重写您需要的

我们并没有完全重写GitLab的前端。(完全重写)将是一个非常糟糕的主意。当然这并不是对于所有人而言都是糟糕的,只是对于一个初创公司而言是一个糟糕的主意。因为这将花费极大的时间和金钱。现在已有的jQuery(尽管有些人说这并不cool)已经通过测试并且工作的非常好。我们没有必要去重写那些效果很好的方法,除非修改后能带来很大的收益。

我们也不会使用Vue实现所有的新功能,您也不需要这样。但是,对于某些UI而言,即使是最简单的Vue的部分也很难找到适用的地方。

下面是一些例子:

1.issue页面(用于展示个人issue),里面用了大量的jQuary。我们现在不会重写它,因为它很好用。我们将使用Vue重写一小部分,用以增强某些功能的实时性。我们现在正在做实时的标题和描述。

2.Phil所写的Issue Boards,是Vue完美的候选。这是一个全新的功能,有着很多无功部分。

3.现在的issue页一次加载了全部的评论,并且增加了大量的事件监听。由于性能的原因,这个页面并不适合Vue。我们将评论变成Vue应用,并使评论的内容和表情选择器等作为组件。我们放大了UX,使您无需等待可以立即看到链接指向的评论。有很多更好的方法展示大量的评论,所以我们需要尽可能的重新考虑。

4.管道页面被重写以用于实时更新的到达。

5.环境是在Vue中编写的。

6.也有很多其他的地方,我们准备使用或者已经使用Vue。由于数量太多就不一一列举。

正如您所看到的,我们没在所有的地方使用Vue。


2.增加webpack

Rails是一个很好的系统,用来抓取您的Ruby库并且在您的应用中构建他们。通过“bundle install”可以安装您在Gemfile中所包含的所有东西。所以为什么前端还要坚持把他们的库放在vender目录下?难道我们还不足以拥有我们自己的库管理系统?自从资源管道第一次出现,Javascript的生态系统就已经变得十分成熟。现在我们拥有“npm install”,也可以利用更高级的代码构建工具。

通过引入webpack(已经合并并且准备应用),我们获得了很多好处。

1.Javascript库将不会被直接捆绑在GitLab的源代码或者包含在gem里面。例如,jquery-ui和bootstrap-rails作为一个ruby的gem被引入,我们在gem维护者的帮助下保持Javascript库的更新。

2.当代码在文件中被共享时,我们可以确保不会重复加载lodash。列如,如果两个文件都需要加载lodash,我们将只加载一次lodash的代码。除了lodash不会被引用多次,在tree shaking的帮助下,只有我们所用到的lodash组件会被引用,而不是引用整个库。

3.我们可以增加hot module replacement使得我们的Vue开发的更快。这是一个开发环境的特性,现在我们在开发的过程中花费了大量的时间用来刷新页面。

4.现在我们可以正确的管理我们的依赖。这将会帮助大量的前端开发者为GitLab做出贡献。开发者将不需要去理解整个Rails Javascript的情况。我们也可以手动指定需要引用什么。
5.SVG 将变得非常巨大。
    1. webpack将SVG直接捆绑在Javascript中。
    2.现在,SVG被放在Rails中的一个特殊的目录中,我们使用Rails帮助我们拉取SVG。使用webpack我们可以一次一个的拉取SVG,因为webpack会预先编译资源。
    3.我们将不需要通过HTTP请求获取SVG。
    4.我们不必做技巧性的HTML隐藏元素。
    5.我们不必在CSS中使用SVG,您不能在CSS中改变SVG的颜色。
6.我们使用大量的Ruby去解决javas和CSS的问题,现在我们可以只使用前端工具解决这些问题。
7.使用webpack的 CommonsChunkPlugin,我们将所有的共同库分成了自己单独的文件,由于这些变化很少,它们可以保持缓存更长的时间。
8.通过webpack的 code splitting功能,您可以只加载需要引导的JS,然后您使用“require.resure()”或者“system.import()”,这样,我们可以告诉webpack去请求我们所需要的JS。它保持文件的大小非常小。比如您通过model.js作为模型。如果一些人从未使用这些模型,这些代码不会加载。一旦他们打开了一个模型,JS将会根据需要加载。
9.现在我们可以妥善的处理全局作用域。我们可以使用“import x from y”而不是让脚本污染整个作用域并且在“window.gl.lol”中传递类。
10.我们可以减少我们的Vue包,因为我们可以预编译模板,并从我们的生产代码中省略模板编译器。 尤雨溪(VueJS的创建者)在Vue2.0的功能概述中解释了这一点:
 
将有两个不同的构建方式:
  • 独立的构建:包含编译器和运行环境
  • 运行时构建:由于不包含编译器,因此您需要预编译模板或是手动编写实现方法


3.移除Turbolinks

我们在GitLab中使用了Turbolinks,但是我们最近在 链接的合并请求中移除了它,并在2017/02/03完成了合并。

Turbolinks实现了什么?

使用Turbolinks,点击一个链接将不会通过浏览器默认的GET请求导航到一个新的页面中。取而代之的是,Turbolinks会将您应用中的body替换为新的内容。使用资源管道的时候,所有Javascript都会被加载。而Turbolinks只会加载很小的一部分HTML和Javascript。在GitLab中,我们的每个页面只需要加载平均20kb的资源,而全部的Javascript文件有超过800kb。对于很多项目而言,Turbolinks是一个很好的解决方案。当您开始引入稍微复杂的Javascript,它变得很痛苦。我们对于使用Turbolinks和不适用Turbolinks的页面进行了速度测试,发现不适用Turbolinks的页面性能会更好。我们发现当我们有较少的时间监听时,Turbolinks会带来较好的效果。这样做我们可以使我们的页面在未来速度更快。因为我们将在webpack的帮助下,在页面中更好的分离Javascript。我们以前写了很多额外的代码来处理所有的Turbolink的问题,现在我们可以删除它们。

我们需要解决的问题

当您的JS被多个页面同时加载时,时间成为了一个很严重的问题。如果您想我们一样使用了gem ‘jquery-turbolinks’,那么$ready这个方法将会在每个页面中加载,即使这些页面没有按照传统的加载方式加载。不通过整个应用引入而在每个页面中编写特定的Javascript是很痛苦的。我们做了而且做得很好,但是,为什么呢?对于大量需要引用在各个页面中的JS确实没有什么办法。

任何外部的链接都加载的非常快,因此我们需要注意性能。

如果您不注意,您的事件将被多次加载,因此多次启动。 列如以下代码:

$(function(){
$(document).on('click','.some-element', function(){
console.log('Click loaded');
}
});

这个点击事件将会被在每个页面中加载,并且在每个‘.some-element’被点击时执行多次。

解决方式

有很多方法可以解决这个问题,有的很好有的很坏。

1不要在$ready的回调中创建时间

2使用下面的方法

	 $(document)
.off('click', '.some-element')
.on('click'...

我管他叫die live方法,在以前的jQuery中人们经常在各种地方写die().live()。这是以前在学校中的jQuery的off().on()。

3.写一个事件管理器作为所有添加事件的委托。

4.移除Turbolinks并且确保在每个页面中只加载您需要的代码。

我选择了第四个方法,为了使我们的开发者更加方便,同时获得更多性能的收益。

额外的

当我们移除了Turbolinks之后,我们可以做一些更酷的事情。我们可以让每个页面独立存在。之后,某些页面可以有自己的Vue应用。比如,我们可以使用文件浏览器的Vue应用程序。合并请求也也可以是它自己的应用程序。查看文件的代码也不需要在其他页面中加载,所有页面都是这样。这并不是什么新鲜事,这是web开发的基础。这也不是一个新的范例,我们不会是第一个。.


总结


现在仍在争论是否将整个网站作为一个单一页面的应用程序,但我认为这只能带来更加困难的维护,对于性能和用户而言并没有什么好处。当然,现在是一个很好的机会能够让GitLab变成一个janky应用。例如,简档页面可能非常轻,人们不能直接链接到简档页面; 它应该在我们的项目中加载每一个单独的Javascript。

这只是GitLab的一小步,确是前端团队的一大步。在未来您将会看到我们的团队带来更多更新更酷的事情。此举便是向这一方向迈出的一步。


推荐阅读
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 随着前端技术的发展,越来越多的开发者开始使用react、vue等web框架,但很少有人深入理解这些框架的源码。然而,这些框架底层都是由原生的javascript构建而成。对于初学前端的人来说,可能会认为javascript很容易上手,但实际上只是因为它被高度封装了。与能够使用封装类的人相比,能够理解框架原理的人则处于另一个层面。本文将深入剖析jquery源码,探寻框架底层的原理,帮助读者更好地理解web框架的运行机制。 ... [详细]
author-avatar
lqk
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有