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

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

最后送给前端们一幅图:

24923 次点击
所在节点    JavaScript
189 条回复
xjcuisa
2016-07-18 11:08:35 +08:00
FrankFang128
2016-07-18 11:09:10 +08:00
@exoticknight 你光看体积不够,还要看看调试、新人学习、坑多不多,疑难好不好解决,特殊需求好不好处理。不过我相信中型项目是利大于弊的。
xjcuisa
2016-07-18 11:10:00 +08:00
exoticknight
2016-07-18 11:17:37 +08:00
@FrankFang128
只是举出一个体积这么一个指标来反驳而已
看调试:调试是有工具的
新人学习:如果项目本来就用新技术,那么你干嘛不请一个本来就会新技术的新人?
坑,疑难:坑,疑难这个肯定会比旧技术多,不过你可以选新技术中已经成熟了的版本,比如 Angular 1.x 而不是 2.x
特殊需求:就是因为有特殊需求才搞出新技术的……

其实按照你那么说,根本就不是新技术的锅,而是技术选型的问题
exoticknight
2016-07-18 11:20:13 +08:00
@FrankFang128
react 一直比较激进
JSX 在某些场景下还是很好用的,比如在教程里面
react 比较好的是 react native
FrankFang128
2016-07-18 11:20:48 +08:00
@exoticknight 如果是根据需求选型,我是无法反驳的。不过现在大部分项目都是跟风选型,不需要搞那么多转译和框架的,也搞得那么复杂。然后还不准说 React 的不好。。。明显,有些项目就是不需要用 React
FrankFang128
2016-07-18 11:25:39 +08:00
@exoticknight 如果楼上都像你这样列出利弊,就事论事,就很好讨论问题了 :)

很多人诛心是啥意思,我懒不懒想不想学新技术跟这个帖子有关系么。
FrankFang128
2016-07-18 11:27:01 +08:00
@exoticknight 我同意 React Native 才是 React 最大的卖点,其他都是可有可无的。
lxrmido
2016-07-18 11:29:20 +08:00
@zzNucker

我说了,熟悉前端的前提下,反正我用了不到十分钟看了一遍 webpack 的文档的使用部分然后就知道怎么写配置了,几十分钟是学 webpack 的 loader 开发了吧;
gulp 的使用就更简单了,就一个 task 一个 watch ;
es6 ……说实在的, es6 的新增语法和特性是浏览一遍就大概明白的;

我没觉得现在的打包工具很好,但是很容易使用,你要是觉得不会开发这些工具的插件就不算会用的话,当我没说……
FrankFang128
2016-07-18 11:30:36 +08:00
@lxrmido 如果是边用边查文档边踩坑的话,你的方法和时间是可以的。。。
lyragosa
2016-07-18 11:31:18 +08:00
作为一个菜鸡后端,表示我前端还停留在写 LESS 上……

各种自动构建器只是听说过,从来没去使。
g0thic
2016-07-18 11:34:16 +08:00
看了文章和评论有点觉得楼主纯粹是因为不喜欢 React 就来喷 JS 这些年来的的新东西,真是没意思啊...
当然如果楼主想要否定这些年前端的组件化和工程化发展方向那也没啥好说的了。

记得以前写 less 还要专门用其他的工具转成 css 再来用,记得腾讯那会还出过一个专门的 GUI 软件,图片转成 base64 或压缩图片或压缩 js 还要专门找一个线上网址去完成,本地起一个 web 服务还有开启 php 环境或者用 python 启动,还有很多等等。。。现在 Gulp 把这些东西放在一个命令了全部能完成有啥不好嘛?如果你项目不需要就不用就是了,很多人还是会按照自己的需求来添加任务的,这有啥好质疑的嘛?也没人让你写一个海报页面把 webpack , gulp 这些都搬出来啊

任何新技术新轮子出来都是有目的的,不管是像阿里一样为了 kpi 还是为了开源好玩,但是新的东西能流行起来肯定是有迎合到部分人的需求的,你可以认为有的人是为了跟风,但那也只是小小部分啊。

看过楼主之前那篇前后端分离感觉也是为了喷而喷,所以没啥好说的,楼主开心就好
lxrmido
2016-07-18 11:42:11 +08:00
@FrankFang128

程序开发这件事上面……不可能有一下子全部搞明白然后投入开发不踩坑的吧
sox
2016-07-18 11:43:27 +08:00
just simply javascript fatigue fatigue
FrankFang128
2016-07-18 11:43:36 +08:00
@g0thic 都说了是吐槽文。 我喷的不只是 React ,去年我还喷 Angular 1 了。希望这个不要也死掉
FrankFang128
2016-07-18 11:45:50 +08:00
@g0thic 不是去年,是前年喷 Angular ,但是 NG 还是很火的。 然而我还是使用 NG 做项目了。
你可以看下标题,我喷的是,加这么多工具,最后没工具网页都不能预览了。原生 HTML 、 CSS 都抛弃了, JS 写得也是不能在浏览器上运行的版本,这还不奇怪吗?我没看到什么语言这么否定自己。
FrankFang128
2016-07-18 11:53:38 +08:00
@g0thic 你没觉得我那篇喷前后分离的是真相么……
Sivan
2016-07-18 11:54:04 +08:00
先马后看,本帖讨论的问题很有意义。前端现在确实发展很乱,很多项目功能重叠且相互排斥,完全是群雄争霸的状态,新人入门经常迷茫应该学什么。稍微不幸运站错了队就可能付出时间学了一个刚会用就被淘汰的东西。
FrankFang128
2016-07-18 11:56:52 +08:00
现在的所谓前端工程化
1. minify - ok
2. less / sass - maybe ok ,毕竟 CSS 选择器写起来很麻烦,但也只是写起来爽了,稍微加快效率。
3. concat - maybe ok, HTTP/2 上了, concat 就收益不大了。
4. live reload - not ok 。 经常在我不想刷新的时候刷新了。
5. wabpack - 工程化,写起来爽了,没看出来解决了什么很大的问题。
6. jsx 、 bable 、 react - 全家桶, react 是选型问题,我还是那个太少, 90% 的网站不应该用 react
7. hot module replacement - 哈,是为了解决上面任务太多, watch 太慢,而不得不加的东西
8. 依赖分析 - 用上 CommonJS 后带来的副产品,文件太细,还想动态加载,又不想动态加载得太多,然后还延伸出更多关于依赖管理的问题,甚至改变了前端写代码的方式, inline script 直接不让写了。评价就是半成品的工程化,需要人为做很多事情。
FrankFang128
2016-07-18 12:08:26 +08:00
纠正: 我还是那个太少->我还是那个态度

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

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

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

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

© 2021 V2EX