为什么有人说node.js做什么的学习成本很低

查看: 76|回复: 3
学习nodejs有怎样的好处?
学习nodejs已经有两周了,但是有很多疑问
用express搭建网站,编写路由表,写接口处理,然后连数据库,这个与其他开发网站的方式有什么不同么?我觉得用wordpress搭建更快呢。。最近比较多的收获就是进一步了解了http的工作原理了。
之后还想用nodejs写一些自动化文件小工具,发现回调都要写好几层,特别是批量操作文件,还不如以前用python写的干净呢
请问还有深入学习的必要么?
node.js最大的卖点在于完全异步的I/O模型。比于阻塞I/O,异步I/O模型极大提高web服务的并发性(可以参见我在另外一个问题的回答/question...,node.js在各个平台上使用epoll,kqueue和IOCP等I/O事件框架)。对于I/O密集型应用来说,会有明显的性能提升。例如 对于大量采用Ajax long-polling的网站(典型的如聊天室,问答汇的通知推送)能带来很大的提升;因为每一个的long-polling请求都会占用服务器的连接数,虽然大部分连接处在空闲状态,但并发性不强的web框架最终会被大量的连接耗死。而node.js的异步I/O模型最适合于处理这样的情形。单线程不仅没有降低吞吐率(因为异步),也远离了死锁等同步不当导致的问题。有人会说node.js只有一个线程,不能很好的利用CPU;但实际上这不是问题:node.js可以通过多进程来提高并发能力;其次单进程多线程的程序往往在内存中共享数据,而内存不能跨机器访问,因此限制了扩展到集群的能力。同时,在非技术层面上:node.js基于js语言,相比于Go, Erlang,Scala等,目前大部分js程序员主要做的都是前端工作,对于HTTP协议等都具备相当的了解,熟练的js攻城狮只要稍加学习就能转到node.js平台上。因此很更容易招到程序员。良好的社区支持,github上星标最多的那些项目,很大部分都是node.js。至少目前,node.js社区基本具备了搭建一个复杂web应用可能用到的库。我甚至认为node.js的社区现状要好于Python的twisted和ternado。前后端语言统一,相当一部分的node.js库还能同时应用于网页前端(如socket.io库),技术成本进一步下降。尤其在小公司,一个程序猿往往兼顾前后端。当然node.js也不是没有缺点的,先说非技术的:node.js诞生于2009年,十分年轻,必然有诸多不成熟的地方,更别说广大社区维护的组件。这一点只能靠时间来检验。其次是是异步带来的一些问题,:层层嵌套的回调,异常难以处理。由于程序的模型变成了异步,node.js的代码风格亦偏函数式,没有太多js开发经验的程序员需要一定的时间来适应。调试工具和手段尚匮乏;提问者提到的层层嵌套等便是第一个问题,就是如何组织异步控制流的问题。目前在node.js社区中,有async、step、和我编写的xchain等库解决了这个问题。都将嵌套的异步回调平铺开来。此外express框架的基础connect框架,也通过中间件的思想,也避免了异步回调的嵌套。既然提问者有express的经验,就拿它举个例子:用express框架新手容易写出这样的代码:app.get('/', function(req, res) {& & db.query(..., function(err, val1) {& && &&&if (err) {& && && && &// Handle error& && &&&} else {& && && && &db.query(..., function(err, val2) {& && && && && & if (err) {& && && && && && &&&// Handle error& && && && && & } else {& && && && && && &&&res.render('template', {val1 : val1, val2 : val2};& && && && && & }& && && && &}& && &&&}& & });});可以看到,首先嵌套随着流程的复杂而变深,其次异常处理十分繁琐。但是如果了解过connect框架的程序员则不然,在connect框架中,把传给get的回调函数(包括传给app.configure()的那些函数)称作中间件,中间件可以传入很多个,并且依次调用。app.get('/', function(req, res, next) {& & db.query(..., function(err, val1) {& && &&&if (err) next(err);& && &&&else {& && && && &req.val1 = val1;& && && && &next();& && &&&}& & });}, function(req, res, next) {& & db.query(..., function(err, val2) {& && &&&if (err) next(err);& && &&&else {& && && && &req.val2 = val2;& && && && &res.render('template', {val1 : req.va1, val2 : req.val2});& && &&&}& & });});这个多出来的next参数便是connect框架解决用于嵌套过深的引入的函数。如果调用next时传以参数,则该参数会当作错误,跳过剩下所有中间件,调用错误处理;否则调用下一个中间件。如此吧缩进控制在可接受的范围内,并且中间件保持独立性有利于复用。
Node js可以重写web服务,不过总觉得别别扭扭的,因为毕竟这玩意儿太非主流了。对于这么一个用WEB GUI语言写后台的奇葩,让我们如何评价呢。楼上俨然变成了nodejs知识百科大奖赛么。说点真心话真的这么难
可以玩玩的,虽然写了nodejs才觉得js的回调写多了是挺烦的,各种不方便。不过我现在也在用nodejs做线上服务,之所以选择它,一是一门新技术,玩玩心态,二是因为js写的熟练,而且学习成本也不高,三是因为可用模块很多,四是可以支持本地服务和线上服务,可以写一些定时应用之类的本地服务,五是因为现在不写nodejs的js程序员感觉跟不上时代鸟。不过也遇到一些问题,例如写前端js多了,对错误处理完全没概念,应用里错误百出,很容易异常,后来写了一段时间,有点感受之后立马重构了所有代码。日志不知道该打印多少,在哪里打印。前端对服务器的一些理念还是理解不够深刻,买了本http**编程,近期看。js的回调嵌套时候的错误处理让我很头疼,代码里很多类似的冗余代码。
Powered by 一站到底 X3.2
& yizhandaodi新手学习node.js的感受 - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
说来好笑,大学时还在DOS时代,仅学会了盲打和五笔字型(不过这两项基本功倒让我受益匪浅,工作效率比一般人高得多)。毕业后跟鬼佬接触较早,通过VBA、VB ActiveX DLL和SQL Server将MS EXCEL的功能榨取干净了。后来因为个人野心,指望将桌面APP转向富客户端的WEB编程,花了不少时间在C#和Silverlight上。随着去年Microsoft宣布对Silverlight的放弃,在搞懂ASP和Silverlight之前,硬着头皮转向了Node.js。通过半年的学习,有如下体会,仅供有类似经历的入门菜鸟参考,也请老鸟们不吝更正,并手下留情,不要耻笑,以免打击本新生的信心:
1、先将Node.js丢在一边,学习以Javascript做些客户端开发,以尽快跨入Javascript门槛。
作为入门者,应从Javascript基本入手,避免将jQuery当Javascript,在掌握Javascript精髓之前去学习Node.js也难以入门。
推荐的Javascript参考书为《JavaScript高级程序设计(第3版).Professional JavaScript for Web Developers, 3rd Edition》,HTML5-CSS参考资料为《十天学会DIV+CSS(WEB标准)_标准之路.chm》。我这半年时间里大部分时间花在前端研究上,采用OOP编程方式,做出了非常复杂的基于HTML5 Canvas类似于GDI+的富客户端应用。
2、熟悉Javascript语言之后,开始学习Node.js。也是从基本入手,而暂时将EXPRESS框架、模板等丢在一边。推荐的书籍为《Node Cookbook》。
3、在学习HTML5、Javascript、Node.js的过程中慢慢根据需要,去熟悉HTTP、Cookie/Session, Ajax等内容,而不要找太厚的专题书籍去深入研究。
4、最后根据开发的需要,筛选和采用第三方框架。
5、参考书非常重要,不好的参考书就象指向错误方向的路标一样,让你不得要领,关键的是浪费了时间。
话说回来,我的目标倒不是想做得太专业,只是希望能够将装在脑袋中的在行业和社交应用上的创意做出原型出来,供专业团队去开发,从而寻找市场投资的机会。QQ:.
嗯,不错。学习新的东西最忌讳从框架搞起来,lz的学习路线还是不错的,入门了之后多写代码,多看优秀的开源代码会进步的更快。
lz的经验很宝贵, nodejs新手看到这个就有福了.
简单点讲,如果学习node.js困难,很可能是因为学习javascript困难,或者是因为跳过了打javascript基础这关键的一步。
Cookie/Session 这个有没有什么比较好的,比较薄的书可以看?
《Node Cookbook》第七章有原理的详细介绍,建议作为学习,自己写个简单的function来解决,然后再找第三方专业模块来应用。
个人感觉学 Node 就是学会 JS, 然后去学用 JS 做 JS 以往擅长的领域以外事情…
然后就一大堆其他领域的知识要学了… 比如学 Ruby 的模块化和 Web 框架
请问一定要学Ruby么?虽然还木去了解Ruby的学习成本,但就目前来说我懒啊,JS都够我一段时间了
LZ的QQ能+问题儿童么,我有很多问题
不一定是 Ruby, 但 Node 的很多工具本身就是学 Ruby 的
CoffeeScript, Express, Jade, 几个都有 Ruby 原型的工具在那里
还有 require 也能扯上… 当然我也只能泛泛说的… 不是一定要学 Ruby
另外 Ruby 社区也有 Node:
Hi, BiGMuSiC,
我主要在研究以Canvas为核心的HTML5富客户端应用,用来做产品原型。后端的经验是菜鸟,同时目标也设定得很低,只希望搞掂数据库的增删改查以及文件的上传下载即可。
非常乐意QQ交流,只是大部分的问题可能回答不了。
如果有LZ有基于云的产品计划,也非常乐意交流合作。
同感,还有很多后台的原理什么的,HTTP什么的更是要恶补
可惜咱们是英盲《Node Cookbook》不知道何时中文版才有,或者已经有了,推荐下购买地址。或者pdf的电子书链接地址。
优秀的开源代码怎么找呢,github上fork多的吗
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的写给 Node.js 学徒的 7 个建议 - 文章 - 伯乐在线
& 写给 Node.js 学徒的 7 个建议
一些我更愿意在开始就知道东西
利用 Node.js 开发是一个非常有趣,和令人满足的过程, 它有3万多个模块可以选择使用,并且所有的模块可以非常容易的集成入现有的应用之中。
无论如何,对于一些刚开始使用Node.js 开发的的人来说, 很容易碰壁,在这个文章中,我会提到在你学习过程中遇到的问题。
贴士 1: 在开发环境使用 nodemon, 在生产环境使用pm2
当你第一次开发Node.js应用的时候, 其中一件事情就是一次又一次的运行[file].js 就和揭伤疤一样。 当我第一次开发的node app时候,这个让我感到异常挫败和痛苦, 尤其是每当我修改很小东西的时候需要control+c
幸运的是我发现了一个非常棒的工具。 你可以利用以下的命令来安装
JavaScript
npm install -g nodemon
npm install -g nodemon
Nodemon 是一个令人惊叹的工具, 当你全局安装它以后, 可以通过 nodemon [file].js 来启动你的node.js scripts,它会告诉nodemon来监视你的script和scripts的所有变化, 这样的Node.js开发方式非常震撼以及让大大提高开发速度。
那么,生产环境又如何, 除非你用了heroku,Nodejitsu或者其它一些好的 Node.js 平台(也许它们有类似的功能), 但是碰巧你用了EC2 或者一些其它的云平台来运行你的Node.js app, 你如何能然保证这是一个始终运行的Node.js app
案就是, PM2 是一个类似于Nodemon的工具,不同之处在于它用于生产环境, 和Nodemon相似的地方在于它会监控你的app的任何修改或者重新部署,但是有更好的一面, PM2 在遭遇到崩溃的时候,它会正确重启你的app。
PM2的优胜之处在于当你要将app需要多核处理的时候,PM2内部集成的负载均衡可以让你很容易的去指定运行多少个实例。
JavaScript
pm2 start app.js -i max
<div class="crayon-num" data-line="crayon-583e0c
pm2 start app.js -i max
-i参数目的是指定运行多少个实例,在这个例子中 PM2 使用了一个常量max来扩展你的app运转到你最大的核数,不要忘记Node 平时只会运行在单核!
贴士 2: Async 或者 Q
当你专注于写了更多的node.js apps的时候,你肯定领略了什么是回调地狱。 如果你还不知道,这里有一个例子:
JavaScript
function register(name, password, cb){
checkIfNameExists(name, function(err, result){
return cb(“error”);
checkIfPasswordGood(password, function(err, result){
return cb(“error”);
createAccount(name,password, function(err,result){
return cb(“error”);
createBlog(name, function(err, result){
sendEmail(name, function(err, result){
callback(result);
<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c
function register(name, password, cb){&&checkIfNameExists(name, function(err, result){&& if(err){&&&&return cb(“error”);&& }&& checkIfPasswordGood(password, function(err, result){&&&&if(err){&&&& return cb(“error”);&&&&}&&&&&createAccount(name,password, function(err,result){&&&& if(err){&&&&&&return cb(“error”);&&&& }&&&& createBlog(name, function(err, result){&&&&&&sendEmail(name, function(err, result){&&&&&& callback(result);&&&&&&});&&&& });&&&&});&& });&&}); }
这显然不是一个有用或者令人折服的代码, 反而进入一种回调地狱般两难的境地,是你的话将如何避免
一个简单的办法是使用events, 但是我个人不建议这么做,因为使用events来调用只有一个用途的私有方法,足以令人受挫
所以你该怎么做 这里有两个编译好的模块,async.js和Q, 它们两个都可以防止落入回调地狱
或者 ‘async’ 让你可以容易的执行一些连续或者平行的任务,在不依赖一个又一个的嵌套循环前提下。
下面是一些来自Async的readme,写明了它支持的模式, 如需获取全部的支持方式请去它们的github主页查看。
JavaScript
async.map([‘file1',’file2',’file3'], fs.stat, function(err, results){
// results is now an array of stats for each file
async.filter([‘file1',’file2',’file3'], fs.exists, function(results){
// results now equals an array of the existing files
async.parallel([
function(){ … },
function(){ … }
], callback);
async.series([
function(){ … },
function(){ … }
async.waterfall([
function(callback){
callback(null, ‘one’, ‘two’);
function(arg1, arg2, callback){
callback(null, ‘three’);
function(arg1, callback){
// arg1 now equals ‘three’
callback(null, ‘done’);
], function (err, result) {
// result now equals ‘done’
1234567891011121314151617181920212223242526272829303132
async.map([‘file1',’file2',’file3'], fs.stat, function(err, results){&&// results is now an array of stats for each file });& async.filter([‘file1',’file2',’file3'], fs.exists, function(results){ // results now equals an array of the existing files});& async.parallel([&&function(){ … },&&function(){ … }&&], callback);& async.series([&&function(){ … },&&function(){ … }&&]);& async.waterfall([&&function(callback){&& callback(null, ‘one’, ‘two’);&&},&&function(arg1, arg2, callback){&& callback(null, ‘three’);&&},&&function(arg1, callback){ // arg1 now equals ‘three’ callback(null, ‘done’); } ], function (err, result) { // result now equals ‘done’ });
如果我们用async的waterfall来修改之前的例子,结果将更加容易阅读, 再也不用让你的代码看起来像一个死亡金字塔。
另一个重要的库叫做。 这个库是一个暴漏promises的概念, Promise 是一个含有’promise’方法的返回对象,它提供了一个最终的返回值,非常优雅的将javascripts的异步和node.js紧密联系在一起。
For example, taken from Q’s repo page.
JavaScript
promiseMeSomething()
.then(function (value) {
}, function (reason) {
<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c
promiseMeSomething() .then(function (value) { }, function (reason) { });
这个 promise me 方法 正确返回了一个对象, 对象将在传入value的时候调用这个方法当,并且它提供了一个额外的callback来处理失败后的返回值
这是一个非常有条理的方式来避免回调地狱,如果你重写我们之前的那个例子,你可以非常容易的让这些函数正确被调用并执行。
就和我之前说的一样, 我很不愿创建只有一个用途的一堆功能,相反的在’then’之后传入一个方法名,仅仅创建了一个匿名的内部功能和传递,当然了选择权始终在你手里。
总的来说,当你落入回调地狱的时候,是时候去看看 async.js或者Q吧。
我的选择 当然是 Q
贴士 3: 轻松调试 Node.js apps
如果你从一个IDE重度集成的语言比如java 或者C# 转来调试Node.js, 你一定会感到很困扰, 大部分新加入node的开发者采用了’flow’的调试模式,从这一刻开始你最好的朋友就是console.log
但是依然有更常见的调试方式来代替, Node.js 内置了一个调试器你可以称为 node debug, 不过我更喜欢的 node-inspector
它们的github说 “Node Inspector 是一个使用Blink Developer Tools (以前称为WebKit Web Inspector)node.js调试器的界面,”
简而言之,node-inspector 可以让你用任何你想用的编辑器和chrome web tools来调试你的应用,这是多么的性感。
Node-inspector 可以让你做一些非常酷的事情,比如实时修改,单步调试,注入以及一堆其它非常酷的东西。
让我们来根据指示一步一步安装
贴士 4: Nodefly
一旦你有你的应用程序正常运行,你可能会问自己,你怎么可以监视它的性能和配置文件,以确保您的应用程序运行在最佳的速度。最简单的答案是一个卓越的服务,我称为Nodefly。
用简单的一行代码Nodefly开始监视你的应用程序内存泄漏,测量redis用了多久,mongo查询和一堆其它很酷的东西。
贴士 5: 利用NPM进行模块管理
Node做最常见的事情之一是通过NPM安装软件包。Node有一个惊人的包管理器安装所有指定在你的package.json的manifest文件中的模块。然而,所有初学者都会碰上保持的package.json文件中您所使用的所有的模块都是最新版。
这似乎是一个痛苦的过程,总是打开的package.json来更新新模块的依赖,但许多人不知道的是npm会为你做这个!
非常简单运行 npm install &#8211; save module_name 然后 npm将自动更新你的package.json 包含正确的模块和版本,
JavaScript
npm install - save module_name
<div class="crayon-num" data-line="crayon-583e0c
npm install - save module_name
贴士 6: 不要提交 node_modules 文件夹
虽然我们的话题一直是modules和npm,但是并不是不是很多人都知道,你不应该提交node_modules文件夹。这背后最大的原因是,没有必要提交这个文件夹。只要有人下载你的代码,它们可通过运行NPM来安装和下载所有需要的模块。
您可能会说,它是不是一个大问题,如果检查node_modules,但是,如果下载代码的人使用了和你编译modules不一样的操作系统的来安装通过NPM?你的应用程序将会崩溃,下载代码的人将不知道为什么会如此!
举个例子bcrypt以及sentimental如果当在您安装在主机系统上编译它们,因为它们用了本地C语言组件来编译。
避免检查node_modules文件夹的方式是加入.gitignore
JavaScript
// .gitignore node_modules/*
// .gitignore node_modules/*
贴士 7: 别忘记返回
初学者经常犯一个很常识的错误,就是忘记callback后的返回值,虽然有些时候,这没有影响,有很多时候,你会遇到奇怪的问题,因为你的回调被调用两次。
让我们看一个简单的例子
JavaScript
function do(err,result, callback){
callback(“error”);
callback(“good”);
<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c<div class="crayon-num" data-line="crayon-583e0c<div class="crayon-num crayon-striped-num" data-line="crayon-583e0c
function do(err,result, callback){&& if(err){&&&&&&callback(“error”);&&}&&callback(“good”); }
乍一看,这个片段是有道理的。如果有错误,在回调中发送“错误。如果不发送return,调用callaback后这个函数不会停下来。它只是将移动到调用回callback(“good”)。
这样做在长期和复杂的代码行里面会节省几个小时的调试。
可能感兴趣的话题
翻译得不怎么样啊。。。
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
&#8211; 好的话题、有启发的回复、值得信赖的圈子
&#8211; 分享和发现有价值的内容与观点
&#8211; 为IT单身男女服务的征婚传播平台
&#8211; 优秀的工具资源导航
&#8211; 翻译传播优秀的外文文章
&#8211; 国内外的精选文章
&#8211; UI,网页,交互和用户体验
&#8211; 专注iOS技术分享
&#8211; 专注Android技术分享
&#8211; JavaScript, HTML5, CSS
&#8211; 专注Java技术分享
&#8211; 专注Python技术分享
& 2016 伯乐在线}

我要回帖

更多关于 vue.js框架是干什么的 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信