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

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

最后送给前端们一幅图:

24927 次点击
所在节点    JavaScript
189 条回复
lovelypig5
2016-07-18 12:09:46 +08:00
个人觉得,工具都是为了项目服务的。
如果一个项目, 1 个静态页面。什么打包压缩统统靠边,因为增加这些的附加成本可能大于维护成本。

前端出现了 grunt , gulp , webpack , babel 设置与各种浏览器的 pollfill ,这都是因为工程化的需要,现在的前端页面都有着大量的交互。与其说是简单的 web ,我更倾向于认为是 web app 。

当我们选择 less/sass/stylus ,是因为 css 的纯静态化,当在工程项目中需要维护时,无论是一个颜色,或者是一个边框。如果是全局配置, less 可以通过变量实现, css 却需要全局替换(增加了出错成本),这是在项目维护成本上体现的。

压缩静态文件,这点必不可少,流量=钱
es6 甚至 es7 ,为什么有人用,因为提供了大量的新特性:类定义,异步回调等等,这都能减少出错成本。众所周知, js 的优雅一半取决在回调的处理上

html5 , css3 为什么有人用,因为大大方便了我们。 html5 的标签语义, css3 的新特性。当前浏览器不支持的情况下,各种 pollfill 也随之产生,等浏览器支持了,去掉 pollfill 就可以了。

所以,这也是在工程中,有架构师存在的理由:一个对所有技术都了解的人,会更好的平衡时间成本和项目成本,系统维护和持续迭代,才是工程的大头。这也是前端工程化的意义,我们需要更好更优雅的写代码,程序员应该只关注到代码提交,后续打包压缩上线,工具都应该自动帮你完成( CI ),以前是 grunt , gulp , webserver ,现在是 webpack+nodejs ,这仅仅是工具,最后还是要看人的选择
sox
2016-07-18 12:10:14 +08:00
hot module replacement 是因为 watch 太慢? 难道不是为了保留 dom 状态刷新
FrankFang128
2016-07-18 12:12:58 +08:00
@sox 那个也是功能之一,但是意义不大,跟 live reload 一个性质,节省几下鼠标点击而已。 如果 watch 太慢,你就必须加 hmr 了。
g0thic
2016-07-18 12:13:29 +08:00
@FrankFang128 原生 HTML 、 CSS 都抛弃了, JS 写得也是不能在浏览器上运行的版本。

所以说还是看你什么需求啊,一个简单的页面肯定还是用 html,css,js 写啊。但是如果有个需求复杂的项目,你用纯 html ,css ,js 写的效率和可维护性有用这些新东西来的好嘛?没有的话为什么不用呢?

至于语言为啥这么否定自己,我倒不是这么觉得,一来 web 诞生之出那会的 web 产品对 html ,css ,js 的要求没这么高,所以那会的语言和 api 都不像现在这么强大和丰富。但即使现在 html5 和 css3 强大了很多,还是不能满足一些人的需求啊。咋办呢,只能通过 js 来实现自己的需求啊,要是 js 能让 htm l 和 css 变得更适合他们的需求他们肯定会去实现的啊,谁让这三个是一伙的呢,所以就有了 react jsx 这种别人看起来四不像的东西啊。但这只是部分人的需求啊,你赞同这种思想有这种需求就用啊,没有就用 jq 或者其他的框架呀,在没用 mv*框架之前,我用 jquery 写单页面应用写的也很爽啊,这和语言这么否定自己有啥关系么。不过楼主要是因为自己不喜欢这一套但是团队又在用,觉得不爽吐槽一下是可以的
FrankFang128
2016-07-18 12:14:26 +08:00
@lovelypig5 能有多少网页是 app 啊……淘宝手机客户端那些页面我都不认为应该全部做成 web app 。
FrankFang128
2016-07-18 12:15:02 +08:00
@lovelypig5 按照现在前端的节奏,永远不会去掉 polyfill 的
FrankFang128
2016-07-18 12:16:50 +08:00
@lovelypig5 我是觉得前端工具已经可以用丧心病狂来形容了,一个简单的问题,被复杂化到不行了,现在加一个 babel ,得先下载 70 兆左右的 NPM 依赖,呵呵。
g0thic
2016-07-18 12:25:17 +08:00
@FrankFang128 不觉得,你喷也要按照基本法啊,技术也要跟着市场走啊。你说要是招个半年都没招到一个会设计数据库和 css 写的好人,但是一个月就能找到一个会设计数据库的后端和一个写 css 的前端。如果你是老板你会继续去招那个所谓的全栈还是先招那两个只会后端和前端的来把产品先搞上线呢?
lovelypig5
2016-07-18 12:25:32 +08:00
@FrankFang128 app 是看交互复杂程度的,还有如果用了某框架,团队可以省 50%开发或者维护成本,那肯定会选。
pollfill 渐渐会去掉的。在 web 2.0 时候可能 webpack 也会精简了,浏览器原生支持模块异步加载的情况下。
至于 babel 大小,你管他干嘛。比如 100M 带宽, 2T 硬盘,这点大小可以忽略吧。起码我是除非影响我性能的 app ,其它我都不会管它
FrankFang128
2016-07-18 12:27:27 +08:00
@g0thic 你说的是,大公司之所以细分,目的之一就是这个。但是细分的缺点我也需要点明是不是。如果某些小公司不明就里,向大公司学习,搞前后分离,只会自己吃亏。
FrankFang128
2016-07-18 12:29:37 +08:00
@lovelypig5 大意为着复杂,复杂意为着有 bug …… 我偏向于一行依赖都没有的原生 ES 语法。而不是构建在 70 兆 JS 代码上面的浏览器还没支持的最新 ES 语法。
lovelypig5
2016-07-18 12:32:33 +08:00
@FrankFang128 你说的是,大公司之所以细分,目的之一就是这个。但是细分的缺点我也需要点明是不是。如果某些小公司不明就里,向大公司学习,搞前后分离,只会自己吃亏。
这个是对的,看项目选择。
新语法的话看个人习惯了,我觉得方便使用的,我都会去试,前端发展太快,需要保持一种对技术的活力,乱七八糟的新技术太多,只有尝试以后能留下来的才是好的。才可以进项目
lovelypig5
2016-07-18 12:34:50 +08:00
@FrankFang128 还有工程化也是一门学问,可以好好研究下。当项目,时间,人力结合在一起的时候。不是我们一个人简单写代码就可以了
zzNucker
2016-07-18 12:35:51 +08:00
@lxrmido webpack 的文档很烂啊, loader 更是基本没文档。 查起来都累。
FrankFang128
2016-07-18 12:40:23 +08:00
@lovelypig5 我不认为现在前端的工程化是好的工程化,就说一个,版本依赖问题,
假设我有个前端基础库 class.js
然后所有组件( c1.js c2.js c3.js ... c10.js )依赖 class.js
然后页面依赖了 c1.js c2.js c3.js ... c10.js
好,现在 class.js 升级了,我是不是要去 c1.js ... c10.js 里全部改写 package.json ,发布一次。
当然,这不只是 JS 遇到的问题,其他语言也有,但这种情况在浏览器上是很麻烦的,因为你不能只升级 c1.js 而不升级 c2 ... c10 ,否则你的页面里就有两个版本的 class.js ……

这不是好的工程化,甚至比之前的 script 引入还要复杂和麻烦。
xiaoyao9933
2016-07-18 13:01:23 +08:00
我觉得楼主说的挺对的啊
lovelypig5
2016-07-18 13:03:10 +08:00
@FrankFang128 共有依赖,这个处理方式和 jquery 一样, jquery 是怎么引的,这个差不多就怎么引。而且是不是该上 cdn 呢。这种举例都太细,没必要深究,取决于解决方式。其实最终目的就是为了给项目节省成本,提高质量,利于维护的意思。
说到这点,我记得我之前公司的前端团队做的就很好,我们前端代码,后端看了都是一目了然的。每个人代码风格,实现逻辑上可以有不同,但是总体的代码结构是基本一致的。这不是不尊重个性,其实也是最大限度自由后发挥个性的表现。
扯远了,我觉得差不多该说的都说了。
观点就是技术是为了项目服务的,最终从企业来说,需要考虑成本,所以一切能省成本,又不影响代码质量前提下,所有可以用的工具都是会上纲上线的。程序员角度,在没有 ci 情况下, webpack 这种能一键压缩完成的,还是挺省事的
jyf
2016-07-18 13:06:16 +08:00
等 wasm 出来吧 这些就统统作废了
ianva
2016-07-18 13:22:12 +08:00
说这么多,很想看看楼主的代码,这么多东西都吐槽,
说白了前端这些工具很明显的不适合构建复杂的项目,这些语言上的改进,框架和库的兴起,都是有原因的,效率是一方面,更好的构建项目,应对更复杂的工程才是关键
来,发下代码吧,看看楼主是如何不采用上述技术,构建一个健壮的复杂项目的
FrankFang128
2016-07-18 13:26:08 +08:00
@ianva 这些技术我都用了……边用边吐槽。如果我有更好的,我就发了。

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

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

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

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

© 2021 V2EX