PHP 到 Node.js的路该如何走?
发布于 9 年前 作者 songqinghehe 23045 次浏览 最后一次编辑是 8 年前 来自 问答

无js基础,php出身,该通过什么方式能够快速掌握Node.js?

84 回复

从来都没有捷径可走。 《21天精通java》系列你觉得一定都会知道代理反射内存以及JVM中的内存划分么… 或许你可以:

  1. w3school学习js基础和ECMAScript(简称ES)
  2. 再来看看《nodejs开发指南》
  3. 再来学学N-blog ?
  4. 再来学《深入浅出nodejs》和nodeclub(需要一些ES5) ?
  5. io.js 话… 那时候你应该知道要干嘛了

不知道这路线会不会误导你,且看楼下大神指路~

@luoyjx 恩恩,好的

我是直接上《九浅一深nodejs》,看完感觉自己萌萌哒

@captainblue2013 最近入手一本 Node.js权威指南,去国家图书馆看Node.js的书籍也就不到十本的样子。

你打堵你一定往回走

node是个大坑,你还往里跳。。。

@captainblue2013 扑大的书就这么被你糟蹋了,还萌萌哒,真是只黄猫,哈哈

@songqinghehe 国家图书馆在哪里?

@songqinghehe 因为不见棺材不掉泪

@yakczh 异步没有错,错在回调,回调增加了编码的难度,长度。性能优势都被在回调消耗掉了。回调模式必将被形式同步取代,形式同步就如fibjs追求的那样,表面是同步代码,在c层面是异步的,coroutine才是正途,回调必死。

异步编程要普及,形式同步是必然,习惯形式同步的程序员基数大,可以让程序员专注于业务代码,将会解放出巨大的生产力,程序员的价格自然也是要下降的。node程序员尤其要注意,资本是无情的,是逐利的,形式同步成熟之时,你们有的优势或许只是对异步的深刻理解,回调编程的所有技巧都将作废,价格跌落也无法避免,大家都将回到同一起跑线上,PHP也将不是可以贬低的对象。

我这种论调在这里显然是要被喷的,但是,我说的都是实话,node绝对不是未来的方向,node只是引路人,异步编程的引路人,但它已经被回调束缚得太深了。

@songqinghehe 里面接线板多么?可以带电脑过去免费上网?

@coordcn php还是主流吧?

@songqinghehe 可能你现在还没正式用在项目里,如果用到了,你会发现你走的每一步都必须要小心翼翼,因为在地下随时都会有地雷等你踩。。。

@chapgaga 4楼有一个免费的 不过有时间限制 其余的楼层有好多人带电脑过去

@joney-pinkman 好恐怖,我在细细研究一下

@coordcn 非常赞同,毕竟语言只是工具,和生产力挂钩,如果是简单的业务,没有深度回调的其实node会是更好的选择,js的语法层面也一直在进步,应该会有更好的异步解决方法。

@songqinghehe 插线板多么?平时容易占座么?

@joney-pinkman es6就是一门新的语言

@chapgaga 出名要趁早,这句话一点都没有错,所有还是要早去才能有桌子,上次去我只做了沙发

es6 要普及也要10年以后

@chapgaga es6只是在进化的途中,远不是终点,终点是看起像PHP那样的,其实内部是异步的,就是我说的形式同步。实现这些必须要有语言上的进化才行,不过快了。

@coordcn 用过koa什么的再下结论吧。

@JacksonTian 你难道认为koa是终结了?按照你的水准估计很难得出这样的结论。generator只是延迟了问题,而没有从根本上改变问题,你写的代码还是要有异步的考虑,你对异步还是要有包装,这些东西改变不了,问题就不能算解决了。genertator只能是过渡,这个阶段回调和generator还是会并存。generator本质上和coroutine有相关性,但是两者都不够彻底,都需要做回调转换。抛开形式上的转换,转做内部实现,实现形式同步才能真正意义上解放程序员。形同实异我认为是必然的方向,我们要让业务程序员要集中精力面向业务,就必须这样做,把不必要的套套给他们解开。

fibjs,openresty都是形式同步的雏形,革命的途径已经打开,node不变革只会成为被变革者(当然node的变革难度很大,受限与v8,除非像fibjs那样,但我不认为fibjs对底层的改变是好事情,他的代码对开源的融入程度不高,fibjs要想大发展,必须要积极主动的融入开源社区,不能孤芳自赏,自己玩自己的,所有代码都自己从头来过是不合适的。openresty则是和nginx结合的太过紧密,没有node这么自由洒脱。这两个先行者都证明了形式同步的编程模式是可行的),我相信自己的判断,我们拭目以待。

为什么一定要同步呢?

至少我现在写异步的代码没有任何感觉恶心的地方。

一个同步转型的程序员如是说。

@coordcn @JacksonTian

@xadillax 因为异步的思维是多余的,是没有必要的。形式同步即可以获得异步的性能好处,又不需要思维方式的转换,你会选择哪一种?形式同步只是通过一些处理,隐藏了异步过程。openresty和fibjs都是利用coroutine实现了形式同步,但内部实现是异步的。

@coordcn 我觉得老外的东西就是承上启下,不像fibjs,它是独立的。但我觉得它的生态以及社区的态度都不太友好,也很难发展大众化。我一开始也是被大家说callback hell多了,觉得回调很可恶。后来出现了koa,像你说的,它之所以解决不了,是有历史包袱的。或者node这样已经改不了的吧,好吧就说这么多,我也不是专家

楼主只是想问从PHP转到node该怎么过渡过来而已

异步编程在网页里的应用很多,没觉得别扭呀。把ajax调用写成同步,那反倒感觉别扭。 说起来异步编程在Windows的消息处理函数时候就有了(再早的就不熟悉了)。用异步考虑系统协调,比同步思维是个进步。

windows 的WndProc 是隐藏在框架底层的,用mfc类库的程序员是不需要关心这些细节的,他们写的业务代码还是同步的,但是你看用nodejs写代码的随便写一段代码都在干吗呢?

@coordcn 我的想法和你的一样,为此我设计了一门语言叫lix用同步方式写异步运行的代码,其代码最终编译nodeJS,基本能无缝使用node JS的所有模块。我的项目在http://www.github.com/lixinqi/lix。期待和你一起探讨

@coordcn 你说的异步是on(‘xxevent’, function(){}),基于Event的,就是异步么?

@lixinqi 只是在有些时候用形式同步替代异步代码,完全用形式同步替代异步好像做不了?

@chapgaga 我的语言lix有独立的运行栈,Defer栈,异常栈,它确实是完全形式同步的

我也没觉得异步和回调有什么不好的,世界本来就是异步的,node 感觉更自然

@lixinqi 非常棒的项目,我不懂语言的实现,也没看明白原理,可能没有与你探讨的能力,老赵或许可以,但看起来lix可能比wind.js更进一步,好像并不需要显式的异步标记。

这种模式还是需要对回调进行包装的,离完全的形式同步还差那么一点,不过已经是非常大的进步,和generator,wind.js一样,都属于非常好的探索,但绝对不是终点,终点可能在javascript层面实现不了,即便到es7,语言层面上还是有显式的异步标记的。我之前认为显式的标记是必须的,这样可以与同步区别开来,但现在觉得是没有必要的,我们关注的只是性能上的提升,对内部如何实现的是没有必要关心的,异步是线程模拟的,还是原生的,还是干脆就是同步的,只要不是性能热点,是不是显式标注异步其实根本不重要。 我们关注的其实是异步带来的好处,而不是异步本身。 显式异步标注的好处恐怕就是跟同步接口区别开了了,但我们可以像node一样为同步接口名称增加sync,这样从接口名称上就有了区别,但是调用方式在形式上还是同步的。

说异步回调不好的,我只能说你这个快餐店经理让收银员去抡大勺了。。

@chapgaga 显然不是。我说的异步是让别人干活,回调只是一个接口,绝对不是异步的本质。node.js源代码stream里很多事件其实都是同步通知而已,有的人不是还发明了自己通知自己的优美写法么?A的异步事件来了,B注册了A的异步事件,C注册了B的A的异步事件的事件,D如此下去,这个回调过程本质上是同步的,真正异步的只是A的异步,来自底层的异步,其他事件注册回调过程本质上都是同步的。所以事件和异步其实是没有关系的。node对计算密集是无能为力的,因为异步事件进来了之后,所有的运算对CPU的消耗就是实实在在的,这个省略不掉,不能交给其他外设去做,回调在这个部分也是最吃性能的。在现有的模式下,回调顶多被延后,但是不能被消灭,因为从lib里面那些事件代码是避免不了的,在语言层面还没有特别好的解决方案。

@russj 异步是好的,回调也不是坏的,但是滥用了就不好了,现在已经有人在探路了,fibjs和openresty都是先行者,他们虽然不完善,但是绝对是方向。世界是并行的,但是思维方式绝对不是异步的,是顺序的,这个必须要承认。对开发者隐藏异步可以让开发者顺序的思考,尤其在错误处理上,回调带来的问题大家心里应该都是清楚的。node社区需要反思,回调绝对不是出路,如果回调是出路,promise,generator,async就没有出现的必要,我现在的观点是连这些都不是必须的,实现形式同步才是出路。而且有人已经在做这方面工作,形式同步已经有了雏形和方向,node社区如果还是继续这样发展下去,认为回调是理所当然的,那么没落也就是理所当然的,不相信变革的,就没有资格嘲笑PHPer,因为形式同步成熟的那天,大家又会回到同一起跑线上,到时候noder甚至不如PHPer,因为人家在同步积累的业务经验或许更多,他们不需要在做业务逻辑的时候跟形式异步做斗争,他们可比我们有更多的时间在思考业务逻辑本身。

我发这些东西当然不是为了找喷,而是希望引起大家的思考,我们需要学习的是本质的东西,而不是形式。

@dayuoba 现实就是这么残酷,我们发展的目标就是让收银员去抡大勺,试想一下,你自己的是老板,如果你有一台会自动炒菜的机器人,你还愿意请大厨么?机器人,自动化代表是普及,大家都能干了,生产力就上去了,人类的发展目标就是偷懒,思考的时候少转个弯可以节省多少脑部运算啊?或许这个节约下来的运算就有更加好的办法去偷懒,如此,生产力就更加进步了。

人类的进步史就是一部偷懒史,是认识和应用客观规律的历史,客观规律又包含自然科学和社会科学。自然科学对应人对自然力的认识和应用,社会科学对应人对自身组织模式和分配方式的认识和应用。这个大驱使我们任何人都挡不了,回调真那么美好,promise,generator,async,await就没有出来的必要了,大家都是变革,我只是比较激进而已,而且我的激进是有事实依据的,有的人已经这么做,而且做出了一定的成果。

node程序员需要提醒自己了,是时候接受新的东西,迎接新的起点了。你不变革,你就会成为被变革者。形式同步的时代一定会到来,程序员的思维解放一定会到来。

感觉 node 里异步和回调有点像 c/c++ 的指针,很有用但是难用。所以后来 Java 一统天下,公司要的是朝九晚五的员工,随便替代,不用多少经验和脑子就可以写出健壮的代码来。 技术是在不断进步的,主要的就是提高人的生产效率,node 很适合全栈开发,有它适用的环境,试图用一种方案解决所有的问题是不可能的 就目前来说六大平台 php,java,.net, ruby,python,node, 估计 node 是用的人最少的。 本质的东西是 操作系统,http,tcp/ip, 算法,数据库,语言只是实现方式

@coordcn 谢谢哈。“ 我们关注的其实是异步带来的好处,而不是异步本身” ----对,这也是我做这个项目的初衷。“这种模式还是需要对回调进行包装的,离完全的形式同步还差那么一点” — 这是我刻意为之的,我提供包装回调的机制给上层的程序员,让它自身选择后续处理代码是走同步方式还是异步方式。

@lixinqi 的确,这是node的问题,你必须要提供一个包装的接口给他,这也是node的问题所在。

能够自己创造语言,并能够解决语言缺陷的人是非常牛逼的,赞一个。

我的方向与你不一致,虽然在具体实现上无法交流,但在思想上还是一致的。我的思路是用lua代替javascript,用coroutine在c层面将回调包装起来,外部语言接口是同步的,跟openresty类似。

@coordcn 我不觉得异步思维是多余的啊。

同步思维而且又不愿意转型的人才会认为异步思维是多余的。

那这么说是不是 lisp 的思维是多余的呢?

我反正异步思维写得好好的——而且我也已经转型了。而且实际上我入 node 的时间比较晚,那个时候已经有 Promise 等东西了,ES6 也定得差不多了,但是我还是选择了转型,我觉得写异步代码特别爽。

个人喜好不同而已,不能因为你不想转就一巴掌拍死所有人。

看书自学

@xadillax 我只是在说一个事实,javascript自己都在变,从promise到await都在一步一步朝我说的方向发展,最终是不是完全的形式同步我不敢说,但是简化编码肯定是必然的。现有的异步模式存在的问题大家都心知肚明了,这个不是个人喜欢不喜欢的问题,也不是适应不适应的问题,我说的是实实在在的问题,这个问题所有noder都无法回避。

你只要诚实的回答一个问题,如果现在有一种语言,你本身很熟悉,可以写出形同实异的代码来,跟原来的同步代码思维一模一样,你愿不愿意用?人的嘴巴会说谎,但是心不会。

异步绝对不仅仅是回调和事件,fibjs和openresty已经用代码证明了,甚至@lixinqi的lix与老赵的wind都可以证明。我们不能忘记,还有无数的同步程序员在眼巴巴的期待异步的好处呢。我写这些并不是我不能适应node,我自认为自己已经能够应付比较复杂的回调业务代码了,但这并不妨碍我对node的批评,node的模式的确存在很大的问题,现在唯一的希望不在node本身,而是在于javascript的变革,fibjs从底层给v8搞了个fiber,es7出现async无不体现了这个趋势,我们必须要从回调的圈子里跳出来,丢掉回调的异步才是轻松的异步。还请注意,我从来没有批评过异步,我批评的是回调模式下的异步,连带的promise,genertator都是我批判的对象,因为这些都是亡羊补牢的补丁,不是终点,es7都不是终点。唯一的终点只能是形式同步,到了那个时候,程序员才能真正被解放。

我认为这个事情既然已经有两个中国人做了先锋,接下来的工作大家也可以试一试,形式同步是可行的,但是需要完善,语言可能不是javascript,javascript没有coroutine,底层hack我认为不可取,fibjs是孤芳自赏的。openresty用的lua可以考虑,coroutine是天然的,利用coroutine在c层面将回调包装起来,形式同步就伪装出来了,openresty就是这么做的,他的作者是个天才。

@coordcn TJ大神有一篇《告别node》的文章,提到了回调的恶心之处

@lixinqi 回调的传染性(就如你必须要给回调包装留接口,promise也是一样,都需要包装,但是目的都是回调同步转成形式同步,技术就是这么发展的,只是有的人不愿意承认罢了),回调的增加的编码难度和长度,回调的错误处理,拥有复杂逻辑的深度回调(这种情况可以依靠设计来缓解,但是需要死脑细胞的,我们的脑细胞要死在值当的地方,而不是回调,回调不会带来性能的好处,反而是性能的杀手),调试等等问题,越深入,越会发现各种问题。一些人认为思维方式转变就可以,思维方式转变不要死脑细胞么?我们的目标就是让人不需要转变思维也照样写出异步代码,那么出路自然就是形式同步。

回调不是异步的目标,而是异步的结果,回调的目标是为了同步,现在很多新技术目标都是为了实现形式同步,大家要看到这一点,不是异步有问题,异步是好的,是回调模式下异步有问题,是编码的问题,是程序员本身的问题,回调模式下的异步增加了程序员的负担。形式同步必然会取代回调同步,fibjs和openresty已经证明了回调不是必须的(但并不意味者完全取消回调,回调作为一些接口还是有存在的必要的,但仅仅是接口,出此之外,都是形式同步的)。

@coordcn 我现在一点都不想去用 yield。

@xadillax 我也不想,yield还是显式的异步,离形式同步的梦想还很遥远啊,先凑合吧。

0.PHP->Node.js─┬──1.读─┬──4.读经典的书
               │       └──5.读优质的代码
               ├──2.写─┬──6.边学边写点小代码
               │       └──7.写一些小玩意
               └──3.思─┬──8.刨根问底
                       ├──9.举一反三
                       └──10.用脑图

@srcjz 必须mark,苦苦追寻的方式

@jues 目前是这么做的

@coordcn这是我的QQ823435180。常探讨:-)

@lixinqi 我不用QQ,我一直在这里,经常讨论。

@luoyjx 嗯嗯 是这个意思

node能发展成今天这样不仅仅是异步,callback问题如大家说的这么严重也没有影响它的高速发展。也有大神使用lua实现了一个node,但都是过眼云烟。我个人认为,node能发展成今天的样子,最大的两个原因很简单,1是js,2是npm。真的用node很爽的同学,早就不纠结callback了 自豪地采用 CNodeJS ionic

把帖子全看完了 我发现就这个论坛的人喜欢扯淡 怎么都可以扯到callback上来

@fengmk2 赞成。 node 就是厉害在 js 还有 npm,当然单线程的事件驱动也是很好的优点。

@russj 我觉得 js 还厉害在“全栈”。

可以用 React Native 开发 Native App, 可以用 Cocos2d.js 开发2D游戏, 可以用 Unity 开发3D 游戏, 可以做 Web 前端、Web 后端, 可以做命令行程序。。。

而且做得都不差。

如果一个人选择 node,就是“全能”的人。 如果一个公司选择 node,就是“全能”的公司。

@srcjz 回答的好精辟!

函数式编程初探

首先你要改变你的编程思维, 以及了解需要回调的原因. 当你了解足够深后, 你就会知道 为什么 NODE 是 .js 而不是.java 了更不是 .c

@songqinghehe 楼上那几位还沉浸在 同步与异步 就是典型的编程思维还没转变的. 这个你就不要想他们学习啦 .
这就好比 用中餐的餐具吃西餐 , 永远都不会吃得文雅的.

@leiddx 你确信自己看明白了大家在讨论什么东西么?看不明白我给你指条明路,看看javascript语言的进化路径,弄清楚为什么这么进化再来教别人。还同步异步,大家在讨论同步异步的问题么?

这位最后的比喻着实很奇葩,吃饭文雅跟餐具有关么?文雅与否要看吃饭的人。同样的道理,编程跟语言有关么?语言只是工具,编程本质上也只跟人有关。

@songqinghehe 楼主你用node用个一年半载再来看这个帖子,你自然就会明白谁跟你说真话了,谁坑你了。这个论坛的代码也能告诉楼主一些真相,不是写这些代码的人水平不行,而是node本身的限制造成的。最快,最有效的办法就是看别人成熟的代码,其他都是扯淡,你想学node,把express,koa,以及这个论坛的源代码都过一边,async,promise,generator理解一下,就能干活了。想更进一步的看node自己的写的lib,再进一步看src里的c++代码,看deps里libuv的代码,看httpparser,读http1.1规范。做完这些,你自然就明白node的优点在哪里,为什么要这么设计,也自然明白node缺点在哪里,什么地方可以改进。到这个程度评价才是中肯的,不要以为弄个框架整个网站出来了就明白了node。他们会告诉你TJ为什么会离开社区么?他们会告诉你协程比回调更适合异步么?他们会告诉你javascript语言本身的进化就是在与回调做斗争么?他们只会告诉你,回调是最美的,不会回调就是没入门,但我可以负责人的告诉你,说这样话的人多半是没入门,连回调和异步的关系都没搞清楚,自然是门都没有入的。

坚持回调即异步的人,肯定是连异步是什么东西都没搞明白的人。当然跟这种人去讲什么形式同步,自然就想到C,java,但是c和java真的不可以异步么?如果真的不能,也就没有node了,没有libuv了。形式同步不是同步,而是以同步的表皮实现了异步的内心,这难道不正是程序员们追求的么?为什么,为什么,有些人就是不愿意承认?真以为用回调很高贵么?用回调是无奈的选择,真懂异步的人才会明白的。他们担心的恐怕是自己的优越感消失,是自己的廉价化,但技术就是这么进化的,javascript语言本身都这么发展了,这些人就是不敢面对现实啊。

回调跟异步有啥关系?国家图书馆能不能上网跟学Node有什么关系?楼主只不过想学个node而已。

孔乙已睁大眼睛说,“你怎么这样凭空污人清白……”“什么清白?我前天亲眼见你偷学Node,吊着打。”孔乙已便涨红了脸,额上的青筋条条绽出,争辩道,“学Node不能算偷……Node!……读书人的事,能算偷么?”接连便是难懂的话,什么“同步异步”,什么“回调”之类,引得众人都洪笑起来:店内外充满了快活的空气。

@axolo 你的故事里有孔乙已还有“众人”,鲁迅先生的笔刀子是太厉害了,一不小心就有人将自己的头伸了过去。醒醒吧,现在是新中国了,众人该醒了,该有自己的思想了。

摸着自己的良心说话,你真以为楼主不需要明白什么是异步么?真的不需要明白回调和异步的关系么?你自己也真的明白了什么是异步么?

楼主的路怎么走,是楼主的事情,时间会给楼主答案,大家都是围观的,我只是说了几句实话(javascript语言变化本身就能证明我的观点),有的人心里就不舒服了,怕坏了回调在他们心中的神圣地位,回调真没什么错,错是一些人用坏了。

发现一本有才的书:写给PHP开发者的Node.js学习指南(http://item.jd.com/11438556.html)

@amoa400 哈哈 准备入手

PHP是世界上最好的语言 自豪地采用 CNodeJS ionic

@yakczh 为什么说es6要10年后才普及?

还是PHP吧,除非项目有什么特殊要求。

node的活跃在于其群众基础,也就是@fengmk2 所说的 js 和 npm ;至于语法怎么写,我想编程语言之间的灵魂都是想通的,我现在用Koa用得挺舒服,什么时候有更舒服的就转过去行了

建议还是主攻PHP,node.js 有时间就兴趣玩玩。

回到顶部