| <h3 id="为什么用nodejs它有哪些缺点">1、为什么用Nodejs,它有哪些缺点? 
事件驱动,通过闭包很容易实现客户端的生命活期。不用担心多线程,锁,并行计算的问题V8引擎速度非常快对于游戏来说,写一遍游戏逻辑代码,前端后端通用 
nodejs更新很快,可能会出现版本兼容nodejs还不算成熟,还没有大制作nodejs不像其他的服务器,对于不同的链接,不支持进程和线程操作 
错误优先(Error-first)的回调函数(Error-First Callback)用于同时返回错误和数据。第一个参数返回错误,并且验证它是否出错;其他参数返回数据。   fs.readFile(filePath,function(err,data)
{   if (err)
  {
      // 处理错误
      return console.log(err);
  }
  console.log(data);
 });
 
模块化:将回调函数转换为独立的函数使用流程控制库,例如[aync]使用Promise使用aync/await 
Promise可以帮助我们更好地处理异步操作。下面的实例中,100ms后会打印result字符串。catch用于错误处理。多个Promise可以链接起来。   new Promise((resolve,reject) =>
  {
      setTimeout(() =>
      {
          resolve('result');
      },100)
  })
  .then(console.log)
  .catch(console.error);</code></pre>
 
团队协作时,保证一致的代码风格是非常重要的,这样团队成员才可以更快地修改代码,而不需要每次去适应新的风格。这些工具可以帮助我们:[ESLint] ()[Standard] ()JSLintJSHintESLintJSCS推荐 
stub用于模块的行为。测试时,stub可以为函数调用返回模拟的结果。比如说,我们写文件时,实际上并不需要真正去写。       var fs = require('fs');
      var writeFileStub = sinon.stub(fs,'writeFile',function(path,data,cb)
  {
      return cb(null);
  });
  expect(writeFileStub).to.be.called;
  writeFileStub.restore();</code></pre>
 
Node采用的是单线程的处理机制(所有的I/O请求都采用非阻塞的工作方式),至少从Node.js开发者的角度是这样的。而在底层,Node.js借助libuv来作为抽象封装层,从而屏蔽不同操作系统的差异,Node可以借助livuv来实现线程。下图表示Node和libuv的关系 
Libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个事件循环,以异步的方式将任务的执行结果返回给V8引擎。可以简单用下面这张图来表示 
每一个I/O都需要一个回调函数————一旦执行完便堆到事件循环上用于执行 
运算错误并不是bug,这是和系统相关的问题,例如请求超时或者硬件故障。而程序员错误就是所谓的bug 
通过NPM,你可以安装和管理项目的依赖,并且能够指明依赖项的具体版本号。对于Node应用开发而言,你可以通过package.json文件来管理项目信息,配置脚本,以及指明依赖的具体版本 
 |