不依赖 Gulp、Babel、WebPack,还能优雅地写代码吗?

2016-07-17 18:25:40 +08:00
 FrankFang128

原文:http://iwritejs.com/complex-front-end/

纯属吐槽文,不服来辩。


不知道什么时候开始,前端开发已经到了不开一个 watcher 就无法工作的地步了。不依赖 Gulp 、 Babel 、 WebPack ,还能优雅地写代码吗?

那我就带你来回顾一下这一切是怎么发生的。

从哪开始说好呢?我们就从『前端打包』开始吧。

前端打包

很久以前(也就五年左右吧,但是五年前端已经大变样了),页面的 JS 压缩(混淆)一般是用谷歌的 closure compiler 做的。但是突然蹦出来个 Node.js ,前端开发者们就开始第一次小试牛刀了,用 Node.js 来做 JS 压缩,一般都是用 uglify-js 来做。

JS 压缩做了, CSS 压缩是不是也可以做? JS lint 是不是也可以做?自动测试是不是也可以做?文件合并是不是也可以做?

于是 grunt 应运而生,它可以帮你把这些事情都做了,只需要配置一个简单的 Gruntfile 即可。

同一时期, AMD 和 CommonJS 也出现了, Node.js 用 CommonJS 加载模块,浏览器用 AMD 来加载模块。前端们觉得可以统一一下,都用 CommonJS 来写,于是用上 browserify 之类的工具。

好了,这个时候一个前端项目需要有一个 Grunt (后来又有了 Gulp 等)任务用来打包前端资源,看起来就是一个标配了。

框架的兴起

前端们一直吐槽新手们用 jQuery 写出的「意大利面条」式的代码,于是发明的了一些框架,一开始比较火的是 MVC 框架(如 Backbone.js ),火了没多久,前端们发现 MVC 框架有很多相似的代码都是在做「绑定事件」「更新 view 」这些事情了,于是发现了 MVVM 框架(一种早年间被微软玩过的设计模式),最著名的库就是 AngularJS 。

此时的库都是不需要额外用 Grunt 做转译的。

直到 React 的出现。 React 背后的工程师(显示不是前端)发明了一种新的语法—— JSX ,把 HTML 和 JS 混合起来写。前端们看了一眼表示这才是写模板正确的姿势。唯一的问题是这种语法浏览器不支持,于是需要把 JSX 翻译成 JS 。

此时 Grunt 大概也因为性能太低被 Gulp 取代了。

于是此时用 React 的项目一定会去用 Gulp 将 JSX 翻译成 JS 。

ECMAScript 的发展

同时期, ES 发展也是非常迅猛。

IE 8 不支持 ES5 ,于是前端们说,「 IE 8 去死吧」,不想再支持 IE 8 了,因为那几年移动端发展迅猛,网页主要都是 H5 页面(不要问 H5 是不是 HTML5 ,不是 HTML5 ),所以很多前端确实不需要管 IE 8 。现在想想, Windows Phone 的失败,真是前端的福音啊。

前端就开始追新了,一定要第一时间用上最新版的 JS 语法。但是即便是 Chrome 和 Firefox 也不可能那么快就支持最新语法。于是前端说,不过就是在 Gulp 里再加一道转译嘛,用 Babel 把 ES 2016 的语法转译成 ES 5 就好了。

于是 Gulp 里又多了一项任务。

重新思考

经过这两三年的飞速发展,前端们是不是应该重新思考一下,做一个网页之前要加这么多 Gulp 任务的初衷到底是什么?是否解决了问题。

从目前的结果来看,基本可以总结为

  1. DOM 不好用,换成虚拟 DOM
  2. CSS 不好用,换成 CSS in JS
  3. 浏览器支持的 JS 不好用,换成 ES 最新版语法,然后转译为浏览器支持的 JS
  4. DOM Event 不用了,去新造一个 Event 机制。
  5. Gulp 用得太多了 watch 很慢,于是加上了 hot module replacement

基本把能抛弃的都抛弃了。

实际上这些变化非常适合复杂的 Web 应用,然而 90% 的页面根本不是单页面应用好吗!

能不能让我写一个 CSS 一个 JS 刷新一下就能看到效果!为什么我要花那么多时间来学习转译工具,以及解决转译过程中的各种问题。

总感觉『弊大于利』。甚至有的时候觉得这是『没有问题,创造问题也要上』。

最后送给前端们一幅图:

24931 次点击
所在节点    JavaScript
189 条回复
FrankFang128
2016-07-18 13:28:19 +08:00
@ianva 当然其实我是有一个基于 jQ 的小框架的,不过改进不大,唯一的改进就是不需要 watch ,用原生,有 MVC 、有组件、利用原生 DOM Event 做模块通信,用在 1688.com 的商家页面里了,并没有好到可以秒杀其他。
Mark24
2016-07-18 13:32:16 +08:00
觉得楼主说的挺对。前端的东西很碎片

前端就是——语言不够框架来凑
surgit
2016-07-18 13:33:41 +08:00
其他语言都有预编译, 你怎么不说多余的呢. 前端加上这些才能说是正在的在完善生态吧.
ianva
2016-07-18 13:35:29 +08:00
1. bable IE8 这个没的吐槽,前几年的 IE6 不是也就这么过去了么,现在 17%的占有率其实也就 1 年的时间了,和技术无关
2. JSX 相对于 angular 的 template 用字符串,这已经好太多了,我们还不讨论 angular 1 的 directive 设计的有多么糟糕, react 的组件只用了非常简单的理念就解决了 directive 解决不好的问题
3. 请找出一个比 webpack 更好的解决方案来
4. 现在前端工程的复杂度上讲过渡设计这件事情是要看项目的,简单项目 jq 自然几句话解决了,前端技术上的选择面很多,比比没有选择的时候
5. 模块化上, webpack sourcemap 调试要完爆各种其他调试
ianva
2016-07-18 13:39:57 +08:00
@FrankFang128 对于组件的通讯,来说目前看来,在复杂的项目上,没有 flux , redux 的理念,事件维护性上非常差,特别是需要大量维护状态的时候,非常难于管理,维护时难于梳理,项目简单的时候到还好说
ianva
2016-07-18 13:41:10 +08:00
说这些,所表达的意思是,技术在前进,而且在通往更好的时代
daben1990
2016-07-18 13:47:16 +08:00
这些框架的出现都是为了解决相应的问题, grunt 的出现为了编译 js , less , gulp 的出现为了更快的编译,更舒适的写任务, webpack 的出现,则解决了异步加载,版本号等问题。出现问题,选择相应的框架,而不是,一开始就不带任何目的用框架,没有意义。
sunshinewu85
2016-07-18 14:05:24 +08:00
这篇文字写得挺有意义,也挺能激起技术嘴仗来着,只不过有些童鞋有点过敏,立马下一个“楼主对新技术无感、懒”的定论,只是讨论和反思嘛!我觉得前端圈能变成现在介个样纸,原因多少有这些:

1 、无法满足前端切图仔 “翻身农奴把歌唱” 日益蓬勃的「逼格感提升」这个迫切需求。(说白了,这年头,动不动就讲逼格,团队逼格,对!说得就是你!你这个 Zhuangbility 的前端, 2333333 )

2 、一切的始作俑者或导火索,确实跟 Node.js 的出现分不开。突然让前端人对后端各种好模式\工程自动化构建\组件模块化开发等那种长久“咬牙切齿羡慕嫉妒恨又无处施展的抱负”有了一一实现的可能,更是凭借其朝着让 JS 走遍天下大一统的野心道路全速前进;

3 、 W3C 、 ES 等标准早期的无所作为,加上确实相对落后的前端工程化早期现状。不过这几年随着各方推动,整个标准的定制之路也随之快速全面完善起来,故前端的现有各种工具\库\组件在标准出台之后,可能会逐渐谢幕?现在的这些感觉都只会是过渡阶段产物~这些确实实实在在增加了重复学习各种工具的成本,也导致出现了新人望着名目繁多各种名词两眼一抹黑的窘境,那个内心无处安放呐~

4 、前端,不再是可有可无的岗位,这些的改变,形成了更多后端&专业前端之间的技术壁垒。(这或许是有些前端人希望看到的,专业事交给专业的人干,以往后端随便都能写几个页面的历史从此不再。。。所以,薪资,必须提上来,是吧)

5 、大中型项目良好的用户体验及敏捷开发团队的快速迭代需求所愿。(对待平常较小的商业项目,杀鸡用牛刀,确实没必要,需求决定技术选型及一切,毕竟开发成本还是要为公司考虑的。只不过开发者自个儿应抱有持续学习的心态,业余时间倒是有必要适当的“杀鸡用牛刀”整些新鲜的私人玩意儿,你说呢?)
raopeize
2016-07-18 14:38:19 +08:00
说白了,工具是为了人服务,技术是为了业务服务,什么样的业务场景需要什么样的技术选型。如果只是做两个静态页面,完全可以靠手写,但是如果是做 100 个页面呢? 1 个人做业务用啥都行,但如果是 5 个, 10 个人呢?如果页面是 10 个人访问,可以不考虑性能,但如果是 1 百万个人呢?之前前端都是多页面开发,为了用户体验出现了 spa , mvc , mvvm 等一堆框架,技术复杂度又提升了不少。不是工具越来越复杂,而是随着业务的增长在一步一步满足各种各样的需求时变的复杂起来。杀鸡不要用牛刀,打蚊子不要用大炮,合理的技术选型才是关键。
rupert
2016-07-18 14:43:02 +08:00
Ember 才是前端框架公认的最后的王者
firebroo
2016-07-18 14:54:32 +08:00
贵端真乱。。
fuermosi777
2016-07-18 15:42:31 +08:00
@FrankFang128
调试方面不觉得麻烦吗?
-- 调试并不麻烦,本地双击 html 调试运行无法加载跨域 js ,导致务必运行一个小型服务器, webpack 的热加载功能让实时调试变得更简单

还有新人学习成本如何?
-- 个人觉得学习成本挺大的。我从 document.write 到现在的 react 断断续续花了一年。

还有一些 jQuery 的组件用不了了是不是都要重写?
-- 这个不太了解,不太用第三方组件

我的体会是隐性成本很多。我这里最大的成本就是,以前后端可以帮忙写页面,写在他看都不看全给我们前端了。少了很多人力!
-- 我现在的岗位前端比较重,设计师要求各种奇奇怪怪的页面,使用组件化的架构确实能减少大量成本,其中最重要的是静态资源管理的成本。不过不同需求结果不同,我同意你说的简单的页面其实并不需要打包系统。
Felldeadbird
2016-07-18 17:28:18 +08:00
前端最麻烦就在于 不能直接基于后端的思维去 解决问题。
前端技术给我一种感觉就是,每天变着花样写页面。。
winiex
2016-07-18 17:49:42 +08:00
客户端工程师、后端工程师、前端工程师用硬件工程师发明的时空穿越机来到了三年后。

只有前端工程师没有找到工作。
likezun
2016-07-18 17:55:10 +08:00
前端就是折腾!
sodatea
2016-07-18 18:45:35 +08:00
@FrankFang128 「最后没工具网页都不能预览了」

所以我喜欢那些 standard compliant 的工具。

比如 JSPM 你就可以选择离线编译或者在线编译(虽然性能很差),不用在命令行里输什么命令。随着浏览器支持 script[type="module"],在线编译的成本也越来越小,如果不需要 css! 之类的 custom loader 的话,甚至可以完全去掉转译这一步。
然后 PostCSS ,如果只用那些符合标准的插件的话,在最新版浏览器里调试时完全不需要构建。

我个人还是觉得未来的前端工具最终目标将是类似于标准 polyfill 的服务。
当然,前提是标准够好用,工具能力够强大……
目前的情况还是有点悲观的, JSPM 发展远不如 Webpack , PostCSS 社区很多广泛使用的插件并不与标准兼容。
sodatea
2016-07-18 18:47:16 +08:00
至于我个人,只有 autoprefixer 这一个工具是「不用了就写不好代码」的,因为我真的记不住那么多 flex 标准……
dantegg
2016-07-18 20:04:28 +08:00
哈哈哈,吵吵挺好的
没人 bb 了说明狗带了
就这样接着吵呗
Balthild
2016-07-18 20:11:05 +08:00
看了这些回复……感觉总结成一句话应当是,不考虑实际场景直接下结论的行为就是耍流氓…
secondwtq
2016-07-18 21:33:52 +08:00
@jyf 信不信 wasm 出来更乱
直接就可以把浏览器踢开自己搞了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/293050

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX