V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
123s
V2EX  ›  Node.js

如果 node 没有显式异步这个喷点,他们还会喷什么

  •  
  •   123s · 2015-12-12 09:58:00 +08:00 · 6736 次点击
    这是一个创建于 3273 天前的主题,其中的信息可能已经有所发展或是发生改变。
    72 条回复    2015-12-16 15:38:35 +08:00
    Mark24
        1
    Mark24  
       2015-12-12 10:17:54 +08:00 via Android
    JS 语法挫,坑多。这种语言不改版,继续走……感觉就在做试验,不同浏览器对最新 ES6 支持不同,火狐主导了 ES 的标准,谷歌提供了 V8 引擎, V8 引擎对 JS 支持并不是最新,最全,最百分百,node 依赖 V8 。问题来了,随着 JS 升级新特性加入,浏览器支持标准有良莠不齐,实现效果都不太一样。各种第三方库,怎么活?以后怎么过?
    Mark24
        2
    Mark24  
       2015-12-12 10:22:49 +08:00 via Android
    怎么发出去了…还没打完……后端问题一致的, node 将会面临 JS 碎片化带来的问题。
    JS 开发效率真的高么?

    其他语言也有大并发框架。 Python 光光是从 2 迁移到 3 就够烦了。 JS 怎么迁。

    对了 PHP7 性能大幅提升。

    你觉得放着好用的不用……用一个基本问题都解决好的,所谓的新技术……老板估计根本听不进去。

    只有技术人员会热衷吧。

    这是我的一点看法。
    monsterxx03
        3
    monsterxx03  
       2015-12-12 10:28:26 +08:00
    就 js 那点语法抽象能力,先告诉我到底有什么优点
    Mark24
        4
    Mark24  
       2015-12-12 10:33:48 +08:00 via Android
    @Mark24 是基本问题都没解决,不是都解决。

    个人觉得,好的开发语言,要

    语法要优美,开发效率要高,要稳定,就算升级,迁移要无痛。各平台效果要一致,不要给开发人员增加额外负担。第三方库要多,不仅要多,对于库本身开发难度也不要那么大。这些都是作为万金油要解决的。 JS 想做万金油,请问 JS 解决了多少…… Node 解决了多少?

    后期维护,建立多种框架,怎么玩。

    一个 JS 切换好几种写法??
    呵呵

    至少得准备好了,再来踢馆。 Node 就用异步的一个卖点,社区就得瑟的不得了。拜托其他语言也有。干活,四五个月,不能突然觉得做不下去了,切换技术栈。别逗。要成熟一点。

    谷歌和火狐联手, JS 还好说。
    如果是重写 Python 解释器, Node 异步特性也能得到,意义在哪里?
    其他都不考虑么

    补充看法,有点偏激
    p412726700
        5
    p412726700  
       2015-12-12 10:45:19 +08:00
    js 被喷的越激烈 是不是就说明 js 被关注的就越多
    guoziyan
        6
    guoziyan  
       2015-12-12 11:24:30 +08:00
    没人用的和被人喷的,看样子 js 属于后者。
    hcymk2
        7
    hcymk2  
       2015-12-12 11:30:48 +08:00
    黑都是青逼出来的。
    bydmm
        8
    bydmm  
       2015-12-12 11:33:33 +08:00   ❤️ 1
    NODE 现在的新趋势是只写 VC 层,业务都走 API, 有时候做一点多 API,IO 整合的工作。
    整个架构总的来说还是异构的,有 NODE 有 PHP/JSVA/PYTHON 。
    所以你们也别急着喷 NODE 。
    jiongxiaobu
        9
    jiongxiaobu  
       2015-12-12 11:36:33 +08:00 via Android
    喷的人应该并不真的会 JS 吧
    123s
        10
    123s  
    OP
       2015-12-12 11:39:10 +08:00
    @bydmm 这种相当于前后分离,分担点工作吗?
    zhouyg
        11
    zhouyg  
       2015-12-12 11:39:42 +08:00
    世界上只有两种语言,没人用的和被人喷的。
    gamexg
        12
    gamexg  
       2015-12-12 11:42:34 +08:00
    @Mark24 python 不用重写解释器,很早就有完整的异步支持了。异步回调就不说了, gevent 库可以在不修改代码的情况下直接将多线程同步程序变成协程异步程序,而且对调用的现存第三方库同样有效。直接按照一般的多线程同步方式写代码, gevent 内部帮你改成协程异步的实现。

    对 node 不熟悉,只用过 socket.io ,前后端都在一个项目里面的确方便。但是匿名、回调好多。

    现在用 python ,觉得动态类型语言用起来方便,开发速度快。但是没有固定的类型定义,没有编译时检查,一但代码量上去了很容易一片混乱。

    java 本身有太笨重的感觉,例如 一个 post 请求不算对结果处理就达到了 20 行...不过还好有第三方库。

    go 用起来的确好用。 信道 、协程用起来太方便了,而官方推荐使用 信道 同步,结果有几个函数已经进入回调、信道地狱模式了,那几个关联函数平均每个都有 7 个以上的匿名函数+协程...
    yangtze
        13
    yangtze  
       2015-12-12 12:00:15 +08:00
    @gamexg Python 虽然可以支持异步,但是在 CPU 密集型业务上比 Node 弱太多
    shyling
        14
    shyling  
       2015-12-12 12:10:25 +08:00 via iPad
    @zhouyg 正解
    jukka
        15
    jukka  
       2015-12-12 12:14:42 +08:00
    Node 会以他自己的方式融入整个项目的技术栈,现代项目很少有 XXX is everything 了。
    aszxqw
        16
    aszxqw  
       2015-12-12 12:52:16 +08:00
    如果没有异步这个喷点,我觉得 node.js 真的没什么好黑的。
    出色的包管理和社区,而且对前端开发人员太友好了。
    我还是那个观点,如果 node.js 当初是设计成 fibjs 这种协程的结构,真的是非常赞。
    bydmm
        17
    bydmm  
       2015-12-12 12:54:43 +08:00
    @123s 不能简单的叫分担工作,在实际的工作中你会发现 Controller 的代码和 View 的代码是强相关的,如果你们公司是传统的后端工程师写 controller 的分工,你会发现这一块经常会出现 view 需要 controller 修改代码的情况。

    如果你用过 angularjs 的此类工具,你会发现实际上此类框架的 controller / routing 就是写在 js 里的。
    但是 angularjs 等前端 MVVM 工具无论是兼容性,还是各自框架的癖好,都会让你感觉不顺手,比如你就是不喜欢 angularjs 的 binding ,而是就是喜欢用顺手的 jQuery ,然后又像自己能控制 routing 和 controller 怎么办? 这导致很多人一直在尝试和寻找不同的前端 MVVM 框架,再浪费时间之后发现还是不顺手,或者兼容性问题。

    最后 NODE 出来了,你会发现前端能用自己熟悉的 JS 语言,然后自己写 controller 和 routing ,并且同时又能和往常一下没有被特别的前端架构所限制(前端想怎么写怎么写, jQuery 又如何?)。

    至于 NODE 的异步风格,反正不写业务就还好啦,前端工程师也适应了回调的编程模式。

    而且 NODE 在某些情况下还有神奇的优势,比如你有个需求要客户端同步发邮件,同步下载(我指的是对前端的 AJAX 链接不断,等到彻底搞好了才结束,而不是轮询求状态)
    123s
        18
    123s  
    OP
       2015-12-12 13:03:08 +08:00
    @aszxqw 事实上 fibjs 火不起来,已经开源了有 1 年了?
    123s
        19
    123s  
    OP
       2015-12-12 13:05:23 +08:00
    @bydmm 你的意思是除了复杂业务,其他都可以给 node 去做是吧。那样后端只专心业务,展示和逻辑给前端
    cheng007
        20
    cheng007  
       2015-12-12 13:07:28 +08:00
    后端逻辑要是稍微复杂,千万别用 NODE.js 。
    你试想一下,你的业务逻辑被 IO 引发的 callback 分割的支离破碎,这样的代码怎么设计,怎么维护?
    楼上说的 python gevent 比异步回调强的不是一星半点
    jarlyyn
        21
    jarlyyn  
       2015-12-12 13:11:22 +08:00
    python 和 perl 都能对喷

    一个说对方不规范

    一个说对方太死板

    so....
    echo1937
        22
    echo1937  
       2015-12-12 14:05:56 +08:00
    @yangtze 额,从本体而言 Python 和 NODE 对 CPU 密集型任务都不友好,但 Python 弱很多的结论是怎么得出来的, NODE 在这方面比 Cython 和 Pypy 都高出几条街吗?
    jin5354
        23
    jin5354  
       2015-12-12 14:07:01 +08:00
    反正 JS 在浏览器端一家独大,不但向前 15 年,估计向后至少 8 年 10 年依然能保持垄断,并且在 TC39 与各种社团的推动下,语言本身一直在进步。
    其他端都是被带起来的,啥 nodejs ,啥 reactive-natice ,都是浏览器端工程师下班了闲着没事捣鼓出来的。就算死了,还会有新的玩具站起来。
    jiongxiaobu
        24
    jiongxiaobu  
       2015-12-12 14:08:43 +08:00 via Android
    楼主一定是来骗铜币的
    fy
        25
    fy  
       2015-12-12 14:18:55 +08:00
    怒骗铜币
    aszxqw
        26
    aszxqw  
       2015-12-12 14:19:26 +08:00
    @123s 对, fibjs 确实火不起来,所以我觉得很可惜。
    whimsySun
        27
    whimsySun  
       2015-12-12 14:25:06 +08:00
    @Mark24 在 node 这边, es 特性都是基本上通过 babel 解决;前端的话,你可以参考国外的发展,基本上也都是用 babel 。
    yangtze
        28
    yangtze  
       2015-12-12 14:42:52 +08:00
    @echo1937 原生 Node 比 pypy 计算效率高 10 倍左右, Cython 不清楚,但是 Node 支持 C++ 模块,效率比原生高。
    以上来自 ' 深入浅出 NodeJS '
    plqws
        29
    plqws  
       2015-12-12 14:49:40 +08:00
    微软有 TypeScript , ES7 有 async await ,我认为完全可以拿来做大项目了
    123s
        30
    123s  
    OP
       2015-12-12 14:56:11 +08:00
    @jiongxiaobu 哈哈,不要说粗来嘛。
    123s
        31
    123s  
    OP
       2015-12-12 14:58:04 +08:00
    @fy 话题一出,铜币拿来
    chairuosen
        32
    chairuosen  
       2015-12-12 15:08:09 +08:00
    if else 分支多一点 再放在异步的回调里,会疯
    k9982874
        33
    k9982874  
       2015-12-12 15:16:25 +08:00
    as3 让做动画的当上游戏攻城狮,狠捞了一笔。
    node.js 能不能让做网页的当上架构师捞上一笔呢?
    123s
        34
    123s  
    OP
       2015-12-12 15:16:47 +08:00
    @chairuosen if else 哪个语言都有,不给把锅丢给 node 吧。好吧,后面你们都只喷异步了...
    chairuosen
        35
    chairuosen  
       2015-12-12 15:29:32 +08:00
    @123s 我是指比如这种写法,用 node 写比较痛苦。
    if ( cachedData ){
    return cachedData;
    }else{
    data = getData();
    return data;
    }
    getData()是个异步 io 的话,就得全部改成回调,如果这个 if else 分支本来全是同步返回的,结果只有一个小分支是异步取数据,也得全改成回调。
    好在有 Promise 解决这个问题
    dqh3000
        36
    dqh3000  
       2015-12-12 16:52:12 +08:00
    再过两年支持 es7 await 了,就显得不异步了吧?
    kjkjkljkj
        37
    kjkjkljkj  
       2015-12-12 16:58:34 +08:00
    @chairuosen
    楼主标题里面已经说了不考虑显式异步, 你们还拿这个说事就不好了.
    另外我教你一个新姿势:

    https://gist.github.com/Enkows/9d9c02a31c838481df55

    现在还在拿 异步 /callback 来喷 nodejs 的多半都是没有深入了解 js 的, 不过也怪有些 node 粉只懂得说异步高性能
    chairuosen
        38
    chairuosen  
       2015-12-12 17:21:20 +08:00
    @kjkjkljkj 恩,这是 ES7 了,还有 ES6 的方法我也知道。。。回帖时不清楚显示异步是这个而已。。
    CMGS
        39
    CMGS  
       2015-12-12 17:22:34 +08:00
    我就看看戏。。。
    觉得 node 牛逼的,出门左拐去看 node 源码再来说
    觉得 python 傻逼的, pypy 焦作人
    另外我是 rust 党, php 才是世界上最好的语言噢耶!
    otakustay
        40
    otakustay  
       2015-12-12 17:27:25 +08:00   ❤️ 4
    来表演一下正确的黑法:

    1. 显式异步没有错,错在 Node 从这么多异步方案中选择了最糟糕的单 callback 模型,而 Node 之初社区已经在讨论 Promise 了
    2. 拜第 1 点所赐, Node 的异常流非常坑爹,必须手动判断异常存在并且手动编码完成 rethrow ,一个语言在异常上没有自动 rethrow 的机制会让很多异常被淹没或者产生更多不确定性的负面影响
    3. 官方模块抽象程度不够,如 http 和 https 竟然分了 2 个独立模块
    4. 官方 API 命名不一致, fs.readFile 是对的,那谁告诉我 fs.readdir 为啥全小写了
    5. 没有正确区分标准库和运行时,明年 Charkra Node 肯定要在这事上遇到不小有阻碍
    6. 对 ES 新语法的支持太慢( V8 :这个锅我来背)
    7. 纯计算上对多核支持太差( V8 :这个锅还是我背)
    8. 一个 node_modules 文件夹死活不能配置,还叫着 npm 以后要连前端的包也能一起管理,所以未来前端也叫 node 了,生命的大和谐
    bydmm
        41
    bydmm  
       2015-12-12 18:37:33 +08:00
    用 CPP 写 node 模块,并且把这个作为性能解决的最终方案的,肯定是高级黑
    magicdawn
        42
    magicdawn  
       2015-12-12 21:37:35 +08:00
    哦~找不着合适的语言玩~

    非缩进党对 python 无爱, ruby 太复杂, 没有 Google, 根本不知道一个变量从哪来, golang 做工程够好, 但是语言那挫样, 没有包管理硬伤. php 感觉需要先弄个 server, 然后请求下才运行, 现在貌似不是这样了.
    然后呢我说 npm 比 gem/pip/ go get 啥的好用多了你信不信~
    echo1937
        43
    echo1937  
       2015-12-12 21:39:07 +08:00
    @bydmm 哈哈哈哈,是啊。
    djyde
        44
    djyde  
       2015-12-13 00:41:04 +08:00
    @Mark24 说的是 Node ,怎么说着说着说到浏览器上了?
    djyde
        45
    djyde  
       2015-12-13 00:44:07 +08:00
    @otakustay 为什么 npm 能管理前端模块就认为『未来前端也叫 node 』?
    Phariel
        46
    Phariel  
       2015-12-13 00:57:31 +08:00
    @k9982874 Never 我从未听说过架构师有专写 JS 出身的,大公司更是如此。
    Wangxf
        47
    Wangxf  
       2015-12-13 01:40:02 +08:00
    对 V8 依赖性太大,这么说吧,永远不可能成为主流后端语言,但是会成为前端工程师的必备技能,后端的辅助
    Wangxf
        48
    Wangxf  
       2015-12-13 01:55:32 +08:00
    另外我觉得 bower 真是个好东西,尼玛 npm 那是后端的,我只想要管理我的文件模块,结果 npm 一坨出来是什么玩意儿?妈蛋,不说你不想接触 node , node 这东西社区太特么强大了,分分钟蚕食别人没法活
    banri
        49
    banri  
       2015-12-13 06:15:20 +08:00 via Android
    再怎么黑,前端早已离不开 Node 。
    即便只会切图,也很难离开前端那一套基于 Node 的构建工具。
    这些都已经证明了它的价值吧…
    banri
        50
    banri  
       2015-12-13 06:23:12 +08:00 via Android
    @Wangxf
    Bower 哪里比 NPM 好用了……求解…

    目前 NPM 唯一让我不太爽的是某些包,把依赖包放在自己包的内部,一路点下去路径又臭又长,还可能重复下载了 n 个相同的依赖………
    FrankFang128
        51
    FrankFang128  
       2015-12-13 09:13:08 +08:00 via Android
    JS 最大的优点:迭代快。
    jiongxiaobu
        52
    jiongxiaobu  
       2015-12-13 10:10:12 +08:00 via Android
    @banri npm3+ 没有这个问题了
    otakustay
        53
    otakustay  
       2015-12-13 12:59:23 +08:00 via iPhone
    @djyde 因为他吧所有模块不分前后都放到一个叫 node_moduels 的目录里
    edsgerlin
        54
    edsgerlin  
       2015-12-13 13:02:49 +08:00
    EcmaScript 最大的黑点应该是 weak type ,其次是没 Reference Implementation 。到现在能完全实现 ES5 spec 没有任何 Quirk 的浏览器都没有,也就写 node 还算是轻松点。
    所以说, TypeScript 大法好,就是调用没有官方支持的库比较不爽,毕竟接口设计根本没考虑类型……
    yy77
        55
    yy77  
       2015-12-13 14:13:54 +08:00
    不异步就不会有那么好的多进程 performance 了。至于语言标准的问题,现在主流的是写一些前端来编译到特定平台的所支持的 js 。
    bramblex
        56
    bramblex  
       2015-12-13 15:56:13 +08:00
    @CMGS

    我没有恶意,我就想问问,您能自己实现一个 pypy 吗?否则您凭什么要求觉得 node 牛逼的人去看源码呢?
    bramblex
        57
    bramblex  
       2015-12-13 15:58:49 +08:00
    @gamexg 在函数式的方面…… python 跟 javascript 差了太多了。
    bramblex
        58
    bramblex  
       2015-12-13 16:02:11 +08:00
    @cheng007

    语言或者框架很多“强”的特性都是为了防傻 X 的……为的是让能力弱的人也能好好干而不出错。
    chemzqm
        59
    chemzqm  
       2015-12-13 16:14:53 +08:00
    https://github.com/jonathanong/async-control-flow
    JS 语言确实坑多,这不可能改变,但有一件事可以改变就是你如何去写 JS
    raptor
        60
    raptor  
       2015-12-13 16:54:50 +08:00
    居然说 JS 有出色的包管理…说它有最多种包管理还差不多…
    CMGS
        61
    CMGS  
       2015-12-13 17:45:06 +08:00
    @bramblex 无他,因为我看过,并不觉得 node 好牛逼,就这么简单。另外我不能实现 pypy 不代表我不用 pypy ,论性能, node 还是靠边吧
    bramblex
        62
    bramblex  
       2015-12-13 18:00:04 +08:00
    @CMGS

    您是指什么的性能?

    在 leetcode 上面的性能比较, JavaScript 是优于 python 的,您怎么看?
    FrankFang128
        63
    FrankFang128  
       2015-12-13 18:04:28 +08:00 via Android
    @Wangxf bower 已停止维护,官方建议用 npm 。。。
    CMGS
        64
    CMGS  
       2015-12-13 18:49:33 +08:00
    @bramblex 恩恩脱离运行时谈语言性能您觉得挺合适对不对?然后啊,我觉得呢,有时间看看为何某些情况下 JS 在 V8 上性能比较好会对自己的技术成长有帮助。
    CMGS
        65
    CMGS  
       2015-12-13 18:55:46 +08:00
    @bramblex 另外啊,我觉得你最开始问的「凭什么要求觉得 node 牛逼的人去看源码」这种问题呢,只能说还是有人喜欢一叶障目的。当然了,我认为现在 node 界(不仅仅是前端),就是太多这样一叶障目的人了。另外不用 at 我了,我不喜欢论语言这种 lowb 的行为,为一个工具而争论。 node 或者 js 哪天能真正走向工程严谨的时候自然大家心服口服的用,目前来恩,开心就好。
    bramblex
        66
    bramblex  
       2015-12-13 19:06:14 +08:00
    @CMGS

    哦,难道您不是一叶障目吗?已 block 您了,您对语言了解还在所谓 “语法” 这种 lowb 层面上而已。
    jin5354
        67
    jin5354  
       2015-12-13 19:54:53 +08:00
    @banri gulp 出现之前, grunt 作为唯一的流程工具也是很受欢迎的,结果现在也没落了
    没准哪天服务器端出现个更好用的 edon.js , node.js 就也下岗了😂
    djyde
        68
    djyde  
       2015-12-13 20:11:48 +08:00
    @Wangxf bower 好?你是不是还没开始用 commonjs?
    djyde
        69
    djyde  
       2015-12-13 20:12:47 +08:00
    @banri npm3 开始把整个 node_modules 拍扁了
    sox
        70
    sox  
       2015-12-13 21:06:24 +08:00
    @Wangxf 那请你不要用 npm 安装 bower 蛤蛤蛤
    datou552211
        71
    datou552211  
       2015-12-14 09:51:45 +08:00 via iPhone
    各种规范问题吧,毕竟大部分项目需要合作开发。太灵活了有些场景并不适用
    Feiox
        72
    Feiox  
       2015-12-16 15:38:35 +08:00
    恰恰相反,我除了显式异步这一点不喷 ~ (原谅我已经被 CPS 洗脑)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1148 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:45 · PVG 02:45 · LAX 10:45 · JFK 13:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.