node
- 特点
- 异步IO
- 事件与回调函数
- 单线程
- Node保持了JavaScript在浏览器中单线程的特点。在Node中,JavaScript与其余线程是无法共享任何状态的。
- 优点:不需要像多线程那样处处在意状态的同步问题,没有死锁、没有线程上下文切换带来的性能开销
- 缺点:无法利用多核CPU、错误会引起整个应用退出,应用的健壮性值得考验
- 大量计算占用CPU导致无法继续调用异步IO
- 在Node中长时间的CPU占用也会导致后续的异步IO发不出调用,已经完成的异步IO的回调函数也会得不到及时执行
- Node保持了JavaScript在浏览器中单线程的特点。在Node中,JavaScript与其余线程是无法共享任何状态的。
- 应用场景
- IO密集型:主要利用Node利用时间循环的处理能力,而不是启动每一个线程为每一个请求服务,资源占用极少
- 不适合的场景
- 计算密集型程序
- 单用户多任务型应用
- 逻辑复杂的事务,Node.js更善于处理那些逻辑简单但访问频繁的任务
- 不支持完整的Unicode,很多字符无法使用string表示(js标准的问题)
nodejs安装
linux安装
# tar -xvf node-v6.11.3-linux-x64.tar.xz -C /usr/local/ 使用tar解压出现错误 tar (child): xz:无法 exec: 没有那个文件或目录 # yum install xz (解决以上问题) # ln -s /usr/local/node-v6.11.3-linux-x64/bin/node /usr/local/bin/node # ln -s /usr/local/node-v6.11.3-linux-x64/bin/npm /usr/local/bin/npm # node -v
npm
简介
- npm包管理器是一个由nodejs官方提供的第三方包管理工具,目前已经整合到nodejs中(npm只是一个完全由js实现的命令行工具)
- npm默认会从http://npmjs.org下载包,将包安装到当前目录node_modules下。将包安装到全局可以提高程序的重复利用程度,避免同样的内容多份副本,但是坏处是难以处理不同的版本依赖。
- npm [install/i] -g [package_name] 全局安装
- npm [install/i] [package_name] 本地安装(不会注册PATH变量)
- 使用全局安装的包不能通过require使用,但是可以通过npm link 命令打破限制,npm link express(不支持windows)
配置
全局文件夹设置
# npm config set cache /Volumes/P/develope/npmRepository 设置全局缓存文件夹 # npm config set cache node_global 设置全局模板文件夹 # npm config ls -l 查看配置
- npm 模块安装时会在当前文件夹中产生node_modules目录,并在该目录中下载npm模块。而nodejs项目运行require一个模块时,会自动地在当前目录下的node_modules目录中加载所需的npm模块,因为可以直接将一个模块放到此目录下
多版本管理器
- nodejs更新速度很快,有时候新版本还会将旧版本的一些api废除。多版本管理器(nvm)就是用于在一台机器上维护多个版本的nodejs实例,方便按需切换。
命令
# n --help # n 版本号 可以安装任意已经发布的nodejs,自动编译安装(/usr/local/n/versions)
- n无法管理通过其他方式安装的nodejs版本实例,必须通过n安装的nodejs才能管理多版本的nodejs
详解
- 项目所依赖的npm包放在node_modules目录下,此目录不应该被版本控制,也不应该修改此目录下的文件。
- package.json 文件两个作用
- 描述项目
- 列出依赖项
package.json解析
{ "name": "node", "version": "0.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "body-parser": "~1.17.1", "cookie-parser": "~1.4.3", "debug": "~2.6.3", "express": "~4.15.2", "jade": "~1.11.0", "morgan": "~1.8.1", "serve-favicon": "~2.4.2" } } ^ 表示在下一个【主要版本号】之前,所有以指定版本号开始的版本都能用。