Node.js

学习一下Node.js。

https://nodejs.org/en/

基础

介绍

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。

Nodejs的特点是:

  • JavaScript运行环境,相当于js在服务端的一个宿主环境
  • 依赖于Chrome V8引擎进行代码解释,V8引擎执行Javascript的速度非常快,性能非常好。
  • 事件驱动
  • 非阻塞I/O
  • 轻量、可伸缩,适于实时数据交互应用
  • 单进程,单线程
  • Node提供核心功能模块,使得JavaScript语言可以实现文件的读写、进程管理以及网络通信等功能,在这个意义上,Node又是JavaScript的工具库

Node.js的应用领域

  • 项目管理:npm,grunt, gulp,bower, yeoman
  • 桌面应用: node-webkit
  • Web开发:express,ejs,hexo, socket.io, restify, cleaver, stylus, browserify,cheerio
  • 工具包 underscore,moment,connet,later,log4js,passport,passport(oAuth),domain,require,reap,commander,retry,PDFkit
  • 数据库:mysql,mongoose,redis,memcached
  • 异步:async,wind,eventProxy,bluebird
  • 部署:forever,pm2,nodemon
  • 测试:jasmine,karma,protractor
  • 跨平台:rio,tty
  • 内核:cluster,http,request
  • 模板: jade
  • 博客: ghost,hexo
  • 微信: weui
  • 硬件控制: NoduinoWeb
  • 操作系统: NodeOS

Node.js的优点缺点
优点:

  • 解决并发连接的问题

更改连接到服务器的方式,每个连接发射(emit)一个在NodeJS引擎进程中运行的事件(Event),放进事件队列当中,而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)。

  • 解决I/O阻塞的问题
    业务场景:需要从多个数据源拉取数据,然后进行处理,处理的方式有:
  1. 串行获取数据,这是我们一般的解决方案
  2. NodeJS非阻塞I/O,是通过发射/监听事件来控制执行过程
    NodeJS遇到I/O事件会创建一个线程去执行,然后主线程会继续往下执行,事件代理接收到线程后继续往下执行后面的逻辑,这就是NodeJS非阻塞I/O的特点。

缺点:
匿名函数,使得抛出的异常不易阅读。try/catch使得异常捕获较为复杂。单线程的可靠性。不适合CPU密集型的场景。

总结:

  • Nodejs具有处理高并发的能力(最重要的优点)
  • Nodejs适合I/O密集型应用
  • Nodejs不适合CPU密集型应用;
    CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;
    解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;或者使用第三方模块,让Node也可以创建多进程。

Node.js的特点:
1.部署简单方便
2.事件驱动:根据当前出现的事件,调用资源进行相关的处理。
3.异步编程:回调函数,事件监听,发布/订阅模式,
4.高效与性能:
5.单线程与多线程
6.可以解析JS代码,提供系统级别的API:文件的读写,线程的管理,网络通信

express

  • express的安装:npm install express –save
    expressjs的基础
    expressjs的初始化配置
    expressjs的路由
    expressjs的返回响应
  • 从Request—中间件—URL—-response
    中间件MiddleWare:app.use app.get app.post
    request:req.params req.query req.body
    response: res.send() next()
  1. 使用express返回HTML内容

    • Content-Type:text/html
    • fs.createReadStream(‘xxx.html’).pipe(res)
    • res.render()
  2. 模板引擎:–复用HTML组件,简化开发流程

    • app.set(‘view’, ‘ejs’)
    • res.render(‘home.ejs’, {title: ‘ejs template’})
  3. 使用app.set来设置express实例所使用的模板引擎

  4. 前后端共用模板

KOA

  1. 简介
    https://github.com/koajs/koa
    Express的扩展。更小,更健壮的Web框架。组合不同的generator可以免除重复繁琐的回调函数的嵌套。提供了轻量优雅的函数库。
    教程:https://chenshenhai.github.io/koa2-note/note/start/async.html
    https://www.liaoxuefeng.com/wiki/1022910821149312/1023025933764960
  2. 应用
  1. Request和Response
  2. Content上下文

Mac下升级Node.js

node有一个专门管理node.js版本的包叫作:n(没错,就是一个字母n),mac下升级步骤如下:

  • 查看当前 node版本:

$ node -v

  • 清除node缓存:

$ sudo npm cache clean -f

  • 安装n工具包:

$ sudo npm i -g n

  • 安装最新版node.js

$ sudo n stable

  • 也可以到安装指定版本:(例如升级到10.8.0)

$ sudo n v10.8.0

  • 再次查看本机node版本

$ node -v

Node.js 多进程

是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能。

每个子进程总是带有三个流对象:child.stdin, child.stdout 和child.stderr。他们可能会共享父进程的 stdio 流,或者也可以是独立的被导流的流对象。

Node 提供了 child_process 模块来创建子进程,方法有:

exec - child_process.exec 使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。

spawn - child_process.spawn 使用指定的命令行参数创建新进程。

fork - child_process.fork 是 spawn()的特殊形式,用于在子进程中运行的模块,如 fork('./son.js') 相当于 spawn('node', ['./son.js']) 。与spawn方法不同的是,fork会在父进程与子进程之间,建立一个通信管道,用于进程之间的通信。

node连接mongodb

cnpm install mongodb

遇到的问题

  1. Express Command not found
    最初操作:npm install -g express,安装好了,express --help或者express Demo就出现上面的原因了。
    解决方法:在安装一个包npm install -g express-generator
    原因:express3+已经把创建一个APP的功能分离出来为express-generator,没它你创建不了应用程序

总结:
其实简单入门式用express ejs模板步骤如下

npm install -g express && npm install -g express-generator
express -e microblog
cd microblog & make install
npm start
浏览器访问localhost:3000

Node 的版本问题

目前主流的node版本管理工具有两种,nvm和n。两者差异挺大的。

安装

brew install nvm

nvm常用命令

nvm install <version> ## 安装指定版本,可模糊安装,如:安装v4.4.0,既可nvm install v4.4.0,又可nvm install 4.4

nvm uninstall <version> ## 删除已安装的指定版本,语法与install类似

nvm use <version> ## 切换使用指定的版本node

nvm ls ## 列出所有安装的版本

nvm ls-remote ## 列出所以远程服务器的版本(官方node version list)

nvm current ## 显示当前的版本

nvm alias <name> <version> ## 给不同的版本号添加别名

nvm unalias <name> ## 删除已定义的别名

nvm reinstall-packages <version> ## 在当前版本node环境下,重新全局安装指定版本号的npm包

安装路径

从官网或者自己系统安装路径:/usr/local/bin/node
通过nvm安装的路径/Users/peilinghui/.nvm/versions/node/v8.3.0/bin/n

文章目录
  1. 1. 基础
    1. 1.1. 介绍
  2. 2. express
    1. 2.1. KOA
    2. 2.2. Mac下升级Node.js
  3. 3. Node.js 多进程
  4. 4. node连接mongodb
  5. 5. 遇到的问题
  6. 6. Node 的版本问题
    1. 6.1. 安装
      1. 6.1.1. nvm常用命令
      2. 6.1.2. 安装路径
本站总访问量 本站访客数人次 ,