基础知识
zKing 2018-12-06 Node.js
摘要
献上 Node.js 的两个文档。Node.js官网和Node.js中文网
# 了解 Node.js
# 概念
Node.js是一个JS脚本解析器,任何操作系统下安装NodeJS本质上做的事情都是把 Node.js 执行程序复制到一个目录,然后保证这个目录在系统PATH环境变量下,以便终端下可以使用node命令。
# 特点
- Node.js 使用的是一个事件驱动、非阻塞I/O的模型。
- Node.js 使用CMD模块系统,主模块作为程序入口点,所有模块在执行过程中只初始化一次。
- 除非JS模块不能满足需求,否则不要轻易使用二进制模块,否则你的用户会叫苦连天。
- Node.js 适用于高并发、I/O密集的场景,适合用于Web开发,同时可以用作本地代码构建工具,静态资源服务器和一些实用工具,如爬虫脚本等开发。
事件驱动使用的是单线程,但是底层的操作I/O系统是多进程的。另外,cluster可以解决CPU资源浪费问题
进程中包含线程,线程是最小单位
# 实例
终端下直接输入node
命令可进入命令交互模式,很适合用来测试一些JS代码片段
> node
> console.log('Hello World!');
或者直接在终端使用 node xxx.js
文件来运行程序
# 常用的模块
- fs 文件操作模块
- path 路径处理模块
- http 服务器模块
- util 工具模块
- url 处理URL模块
- querystring 获取post数据模块
# 常用的第三方模块
- chalk 可以改变终端输出的命令行颜色之类的
- anywhere 全局安装,简单地搭起静态资源服务器
- yargs 制作cli工具
# 全局变量,全局对象以及全局函数
# 全局变量
_filename
:指向当前运行的脚本文件名。
_dirname
:指向当前运行的脚本所在的目录
# 全局对象
global
:表示Node所在的全局环境,类似于浏览器中的 window 对象。
process
:指向Node内置的 process 模块,允许开发者与当前进程互动。
console
:指向Node内置的 console 模块,提供命令行环境中的标准输入、标准输出功能。
# 全局函数
- 定时器函数
setTimeout(cb, ms),clearTimeout(t),setInterval(cb, ms),setImmediate(cb)
- 加载模块函数
require
require 特性
module 被加载的时候执行,加载后缓存
一旦出现某个模块被循环加载,就只输出已经执行的部分,还未执行的部分不会输出
伪全局变量,主要为module, module.exports, exports
等。
exports 与 module.exports 的区别
其实,exports 就是 module.exports 的一个快捷方式,只是他们的使用方式有区别。
使用 exports 只能增加属性,不能改变指向,比如:exports = { a:1 } 这种是不允许的,只能写成 exports.a = 1
# NodeJs 调试
- 使用条件语句或者
try catch
语句进行简单调试 - 使用 node 自带的调试参数 +
chrome://inspect
+ 谷歌插件 配合使用来进行调试
node --inspect-brk [文件名]
- 使用 IDE 来进行 debug,在 IDE 中配置好调试文件,点击断点进行调试
# 代码的组织和部署
编写代码前先规划好目录结构,才能做到有条不紊。
- node-echo/ # 工程目录
|- bin/ # 存放命令行相关代码
| |-node-echo
|- doc/ # 存放文档
|- lib/ # 存放API相关代码
| |-echo.js
|- node_modules/ # 存放三方包
| |-argv/
|- tests/ # 存放测试用例
|- package.json # 元数据文件
|- README.md # 说明文件
- 稍大些的程序可以将代码拆分为多个模块管理,更大些的程序可以使用包(package)来组织模块。
package.json
- 合理使用node_modules和NODE_PATH来解耦包的使用方式和物理路径。
- 使用NPM加入NodeJS生态圈互通有无,想到了心仪的包名时请提前在NPM上抢注。