GitLab的大前端计划

原文地址: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的一小步,确是前端团队的一大步。在未来您将会看到我们的团队带来更多更新更酷的事情。此举便是向这一方向迈出的一步。

你可能感兴趣的:(文章翻译,gitlab开发)