无js基础,php出身,该通过什么方式能够快速掌握Node.js?
从来都没有捷径可走。 《21天精通java》系列你觉得一定都会知道代理反射内存以及JVM中的内存划分么... 或许你可以:
- w3school学习js基础和ECMAScript(简称ES)
- 再来看看《nodejs开发指南》
- 再来学学N-blog ?
- 再来学《深入浅出nodejs》和nodeclub(需要一些ES5) ?
- io.js 话... 那时候你应该知道要干嘛了
不知道这路线会不会误导你,且看楼下大神指路~
@yakczh 异步没有错,错在回调,回调增加了编码的难度,长度。性能优势都被在回调消耗掉了。回调模式必将被形式同步取代,形式同步就如fibjs追求的那样,表面是同步代码,在c层面是异步的,coroutine才是正途,回调必死。
异步编程要普及,形式同步是必然,习惯形式同步的程序员基数大,可以让程序员专注于业务代码,将会解放出巨大的生产力,程序员的价格自然也是要下降的。node程序员尤其要注意,资本是无情的,是逐利的,形式同步成熟之时,你们有的优势或许只是对异步的深刻理解,回调编程的所有技巧都将作废,价格跌落也无法避免,大家都将回到同一起跑线上,PHP也将不是可以贬低的对象。
我这种论调在这里显然是要被喷的,但是,我说的都是实话,node绝对不是未来的方向,node只是引路人,异步编程的引路人,但它已经被回调束缚得太深了。
@coordcn 非常赞同,毕竟语言只是工具,和生产力挂钩,如果是简单的业务,没有深度回调的其实node会是更好的选择,js的语法层面也一直在进步,应该会有更好的异步解决方法。
@chapgaga es6只是在进化的途中,远不是终点,终点是看起像PHP那样的,其实内部是异步的,就是我说的形式同步。实现这些必须要有语言上的进化才行,不过快了。
@JacksonTian 你难道认为koa是终结了?按照你的水准估计很难得出这样的结论。generator只是延迟了问题,而没有从根本上改变问题,你写的代码还是要有异步的考虑,你对异步还是要有包装,这些东西改变不了,问题就不能算解决了。genertator只能是过渡,这个阶段回调和generator还是会并存。generator本质上和coroutine有相关性,但是两者都不够彻底,都需要做回调转换。抛开形式上的转换,转做内部实现,实现形式同步才能真正意义上解放程序员。形同实异我认为是必然的方向,我们要让业务程序员要集中精力面向业务,就必须这样做,把不必要的套套给他们解开。
fibjs,openresty都是形式同步的雏形,革命的途径已经打开,node不变革只会成为被变革者(当然node的变革难度很大,受限与v8,除非像fibjs那样,但我不认为fibjs对底层的改变是好事情,他的代码对开源的融入程度不高,fibjs要想大发展,必须要积极主动的融入开源社区,不能孤芳自赏,自己玩自己的,所有代码都自己从头来过是不合适的。openresty则是和nginx结合的太过紧密,没有node这么自由洒脱。这两个先行者都证明了形式同步的编程模式是可行的),我相信自己的判断,我们拭目以待。
@xadillax 因为异步的思维是多余的,是没有必要的。形式同步即可以获得异步的性能好处,又不需要思维方式的转换,你会选择哪一种?形式同步只是通过一些处理,隐藏了异步过程。openresty和fibjs都是利用coroutine实现了形式同步,但内部实现是异步的。
@coordcn 我觉得老外的东西就是承上启下,不像fibjs,它是独立的。但我觉得它的生态以及社区的态度都不太友好,也很难发展大众化。我一开始也是被大家说callback hell多了,觉得回调很可恶。后来出现了koa,像你说的,它之所以解决不了,是有历史包袱的。或者node这样已经改不了的吧,好吧就说这么多,我也不是专家
异步编程在网页里的应用很多,没觉得别扭呀。把ajax调用写成同步,那反倒感觉别扭。 说起来异步编程在Windows的消息处理函数时候就有了(再早的就不熟悉了)。用异步考虑系统协调,比同步思维是个进步。
windows 的WndProc 是隐藏在框架底层的,用mfc类库的程序员是不需要关心这些细节的,他们写的业务代码还是同步的,但是你看用nodejs写代码的随便写一段代码都在干吗呢?
@coordcn 我的想法和你的一样,为此我设计了一门语言叫lix用同步方式写异步运行的代码,其代码最终编译nodeJS,基本能无缝使用node JS的所有模块。我的项目在http://www.github.com/lixinqi/lix。期待和你一起探讨
@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就是这么做的,他的作者是个天才。
@lixinqi 回调的传染性(就如你必须要给回调包装留接口,promise也是一样,都需要包装,但是目的都是回调同步转成形式同步,技术就是这么发展的,只是有的人不愿意承认罢了),回调的增加的编码难度和长度,回调的错误处理,拥有复杂逻辑的深度回调(这种情况可以依靠设计来缓解,但是需要死脑细胞的,我们的脑细胞要死在值当的地方,而不是回调,回调不会带来性能的好处,反而是性能的杀手),调试等等问题,越深入,越会发现各种问题。一些人认为思维方式转变就可以,思维方式转变不要死脑细胞么?我们的目标就是让人不需要转变思维也照样写出异步代码,那么出路自然就是形式同步。
回调不是异步的目标,而是异步的结果,回调的目标是为了同步,现在很多新技术目标都是为了实现形式同步,大家要看到这一点,不是异步有问题,异步是好的,是回调模式下异步有问题,是编码的问题,是程序员本身的问题,回调模式下的异步增加了程序员的负担。形式同步必然会取代回调同步,fibjs和openresty已经证明了回调不是必须的(但并不意味者完全取消回调,回调作为一些接口还是有存在的必要的,但仅仅是接口,出此之外,都是形式同步的)。
0.PHP->Node.js─┬──1.读─┬──4.读经典的书
│ └──5.读优质的代码
├──2.写─┬──6.边学边写点小代码
│ └──7.写一些小玩意
└──3.思─┬──8.刨根问底
├──9.举一反三
└──10.用脑图
node能发展成今天这样不仅仅是异步,callback问题如大家说的这么严重也没有影响它的高速发展。也有大神使用lua实现了一个node,但都是过眼云烟。我个人认为,node能发展成今天的样子,最大的两个原因很简单,1是js,2是npm。真的用node很爽的同学,早就不纠结callback了 自豪地采用 CNodeJS ionic
@russj 我觉得 js 还厉害在"全栈"。
可以用 React Native 开发 Native App, 可以用 Cocos2d.js 开发2D游戏, 可以用 Unity 开发3D 游戏, 可以做 Web 前端、Web 后端, 可以做命令行程序。。。
而且做得都不差。
如果一个人选择 node,就是"全能"的人。 如果一个公司选择 node,就是"全能"的公司。
首先你要改变你的编程思维, 以及了解需要回调的原因. 当你了解足够深后, 你就会知道 为什么 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语言变化本身就能证明我的观点),有的人心里就不舒服了,怕坏了回调在他们心中的神圣地位,回调真没什么错,错是一些人用坏了。
node的活跃在于其群众基础,也就是@fengmk2 所说的 js 和 npm ;至于语法怎么写,我想编程语言之间的灵魂都是想通的,我现在用Koa用得挺舒服,什么时候有更舒服的就转过去行了