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

2016 年 7 月 17 日
 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 刷新一下就能看到效果!为什么我要花那么多时间来学习转译工具,以及解决转译过程中的各种问题。

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

最后送给前端们一幅图:

27894 次点击
所在节点    JavaScript
189 条回复
jinwyp
2016 年 7 月 18 日
能加薪的技术就是好技术, 谁管什么用户体验,性能,速度. react 就是程序员的福音, 用完 react + redux 一整套, 大型项目一年后自己都不敢维护了, 绝对是加密利器
xsstomy
2016 年 7 月 18 日
不考虑需求都是耍流氓,就跟说房价不考虑地域一样,都是耍流氓
FrankFang128
2016 年 7 月 18 日
@xsstomy
@Balthild
即使考虑需求,我还是认为, 90% 的网站,不需要这么复杂的工具和框架。
也就在线 IDE 、编辑器、作图工具,才需要搞这么复杂。
xsstomy
2016 年 7 月 18 日
@FrankFang128 刚看到 2/8 定律,就 2/8 分吧。新的东西出来都是有原因的,或者解决某种需求。 jQuery,在移动互联网就没有那么火了,我想总是有原因的。当然也能解决一些需求。更多的看需求,其实真正的在解决某种需求,技术都是为了实际需求才得以发展的。真没有看到为了创造技术而创造技术的,或许自己孤陋寡闻了。
zjfeng
2016 年 7 月 18 日
这些技术都是工具,要根据自己的业务需求来选择合适的工具,而不是盲目的乱用,也不是盲目的批判
就像现实生活中的工具一样,锤子,锄头,镰刀,推土机,吊车,机械化挖土机等等这些工具
来,你说说有锄头就可以挖坑了啊,干嘛还要挖土机呢,操作麻烦,噪声大还耗油,对于我这种想挖个小坑种个菜的人来说,真是没用的东西,都不知道发明出来干嘛
是的,你种点菜挖点土,用锄头真是再合适不过了,但你想想如果要你挖基角,建高楼大厦呢,还用锄头吗?用专业挖土机,蓝翔毕业人士效率不比你高 N 倍?
这是生活中随处可见的例子,生活中你知道要根据自己的需求来选择合适的工具,为什么编程写代码的时候就不懂这个道理了呢?
小项目就像你挖土种菜一样,怎么方便怎么来,大项目就像建高楼大厦一样,需要有工程师来评估用什么工具,什么框架快速稳妥的来实现需求
大项目不使用合适的工具,合适的技术框架来开发,真不知道会乱成什么样子,特别是多人合作的情况下,根本就没法开发,按照你的想法就使用原生 HTML,CSS 来手写,就命名问题就可以让你痛不欲生
zjfeng
2016 年 7 月 18 日
至于你说的"甚至有的时候觉得这是『没有问题,创造问题也要上』",只能说你遇到的业务类别少
工具都是因为有需求才被创造出来的,而不是创造了工具才来想需求
就像你说的复杂的 web 网页是非常适合用这些工具的,就是因为做复杂页面的人遇到了这些问题,才创造出这些工具的啊
你的问题就在于自己没有碰到这样的业务需求,却硬要用这些工具,这是自己误用工具,而不是这些工具没用
FrankFang128
2016 年 7 月 18 日
@zjfeng @zjfeng 你说的我不分认同,但真没那么多复杂项目,我做过最复杂的事在线图片编辑,也是用 backbone 做的
Sparetire
2016 年 7 月 18 日
如果没理解错的话,楼主主要围绕着大意『前端离开了这些新技术新工具就无法工作无法优雅地写代码的地步』展开。
这么早就下这么肯定的结论是不是给人一种钦定的感觉。。我倒是觉得,大部分作为会这些新技术新工具的人,他们离开这些工具也能写出质量不错的代码,而大部分不会这些的人他们不会也不想去学这些,前者大多集中在大公司独角兽,后者大多集中在小公司外包,他们的选择都很好因为都是最适合他们当前场景的。而作为白纸新人的我,还是希望能够赶上一波历史的进程吧
zjfeng
2016 年 7 月 18 日
@FrankFang128 没那么多复杂的项目?骚年,只是你没遇到罢了,你也会说你做过的最复杂的是在线图片编辑,比这复杂难度高的项目多了去了,你没做过,不代表没有啊。
去看看国内一二线互联网公司的前端项目吧
FrankFang128
2016 年 7 月 19 日
@zjfeng 我一直在一线互联网公司呀……
FrankFang128
2016 年 7 月 19 日
@Sparetire 你的翻译不对吧……我在吐槽现在的新框架对工具依赖太重,没有工具,无法写代码,因为代码不能运行在浏览器里。
poke707
2016 年 7 月 19 日
在我负责构建的前端项目里,全面使用了 es2015 和 modules ,就是建立在 babel 和 webpack 上的。
因为构建过程对于源代码完全透明,取代这些工具的成本很低(如果有更好的方案),我是乐于见到上述工具被淘汰的,比如只需支持 chrome50+ / edge14+ / firefox48+ , babel 这一步完全可以省略(什么你要 stage-0123 ?还有 jsx ?),再如将来 http2 的普及和浏览器支持 import , webpack 也大可被替代。
这都几乎与所写的代码无关。我说的这些工具都只是把已经确定要来的未来做铺垫而已。
最后回答楼主,是,没有这个未来环境,(我)没法写了。
FrankFang128
2016 年 7 月 19 日
@poke707 用 ES 6 好处很大么? 我倒觉得变复杂了。我只喜欢 async await ,可以还没有。
就算浏览器准备好了,你也不会去掉转义的,因为 babel 用上了就停不下来,这只是我猜啊。
要真是与代码无关就好了,最大的关系就是能不能直接运行。我就是很在意,我写的代码不能运行这件事。
我也很在意,以后不能直接操作 DOM 这件事。也很在意, CSS 要写成 JS 。也很在意 Event 都不能用了。

这还是 Web 吗?
poke707
2016 年 7 月 19 日
@FrankFang128 语言的好处见仁见智吧。
babel 可以停下来的,因为 es2015 年是分界线,以后的 es201x 不会像这次那样憋个几年一次过全更新了。
代码用到 webpack 的语法还是有一些 , ensure 和 context 啰,合理使用还是能无痛迁移的。
CSS in JS 只是 React 的哲学,你我都知道它不是只面向 web 的。我同意不是大部分的 website 都有必要用 React 或其它框架。
既然是简单的 website ,也不必担心那些有复杂场景,以长得像 App 为荣的 webapp 的过度工程啊。
zael
2016 年 7 月 19 日
Gulp 、 Babel 、 WebPack ,我一个都没用,还算前端开发吗?
hahadekuai
2016 年 7 月 19 日
小胖喷的就是过度工程化,让原本简简单单的代码变得复杂化。让人没有工具,就没办法好好写代码了
bmy
2016 年 7 月 19 日
一大早看到这个帖子 感觉心好累
FrankFang128
2016 年 7 月 19 日
@liygheart 在某些人看来,可能不算『新·前端』吧
FrankFang128
2016 年 7 月 19 日
@bmy 嗯?怀疑人生了吗?
owt5008137
2016 年 7 月 20 日
得亏当初选了后端方向

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

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

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

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

© 2021 V2EX