这是我学习node的整理笔记。是我对各个视频和文档的综合理解,以备我日后复习存储。如果有错误的地方,还请各位大佬多多赐教。
一、基本概念
1、什么是Node.js?
Node.js 是一个在Chrome 的 V8 引擎 的基础上建立的 javaScript 运行时环境。它既不是一门语言也不是一门框架。
a、Node.js中的JavaScript 与 浏览器中的JavaScript 的区别以及联系
在Chrome 的 V8 引擎出现以前,只有浏览器可以解析执行 JavaScript 代码, 2009年 Ryan Dahl 为了加快浏览器的运行速度借助 V8 引擎 发明了 Node.js , Node.js 可以解析和执行 JavaScript 代码,它往往充当服务器与前端中间的小服务器。两者之间的区别与联系如下表:
基本语法 | 浏览器中的JavaScript | Node.js中的JavaScript |
---|---|---|
ECMAScript | √ | √ |
BOM | √ | × |
DOM | √ | × |
b、Node.js中的JavaScript 详情
b.1、ECMAScript、没有DOM、BOM
b.2、require加载模块:核心模块、第三方模块、用户自定义模块
require作用:
1. 加载文件模块并执行里面的代码。
2.拿到被加载文件模块导出的接口对象。在每个文件模块中提供了一个 对象 exports(默认是一个空对象)。
b.2.1、核心模块(服务级API)
常用的核心模块如下:
操作 | 核心模块 |
---|---|
文件操作 | fs |
服务构建 | http |
路径操作 | path |
操作系统信息 | os |
模块代码引入示例:
var fs = require('fs');
var http = require('http');
var path = require('path');
var os = require('os');
更多模块详情 请看 node官网
b.2.2、第三方模块
b.2.3、用户自定义模块
用户自己编写的文件模块加载
示例如下:
require('./a');
注意:这里引入的路径必须是相对路径,以 ./ 开头。
2、Node.js的特点是什么?
JavaSCript语言是单线程的,这决定了 Node.js 也是 单线程 去处理数据。单线程并不意味着速度就慢,相反我们可以把 Node.js的单线程 看成一个 超级管理员 ,它可以同时去处理多个请求,从而阻止阻塞IO模型。
Node.js 的特点总结如下:
- 事件驱动
- 非阻塞IO模型(异步)
- 轻量高效
3、Node.js可以做什么?
- web服务器后台
- 命令行工具
- npm(node)
- hexo(node)
…
二、软件安装
1、下载软件并安装
下载地址 选择自己电脑相应的版本,然后点击下一步下一步安装就行。
2、检测是否安装成功
三、运行"hello Word!"
1、创建编写JavaScript 脚本文件
注意:不可以使用 node.js 去命名文件
2、打开终端,定位到脚本文件所属目录
3、输入node 文件名执行对应的文件
四、node模块规范以及如何实现多个脚本之间通信运行
1、node模块规范
a、什么是模块化
- 模块(文件)作用域
- 模块(文件)间通信
注意:
- 模块中的所有代码都运行在模块作用域,不会污染全局作用域。
- 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
- 模块加载的顺序,按照其在代码中出现的顺序。
b、CommonJS模块过程
node 应用由模块组成,采用的commonjs模块规范。拥有以下特点:
- 模块作用域
- 使用require方法来加载模块
- 使用module对象用来导出模块中的成员(注意 module 对象中还有一个对象 exports 也可以用来导出模块中的成员)
2、加载用户自定义模块
node 只能一次解析执行一个javaScript文件,如果我们想要执行多个文件,就需要把我们自己编写的文件引入即,加载用户自定义模块。
注意:这里引入的路径必须是相对路径,以 ./ 开头。
示例如下:
如果我们想要 同时执行 我们所编写的a.js和b.js文件
我们可以把我们写的一个文件加载到另一个文件中,例如把 a.js 加载到 b.js 文件中。
require('./a');
运行文件:
具体运行步骤参考上面运行"hello Word!"
3、注意:在node中没有没有全局作用域,只有模块作用域,所以模块之间不可以直接通信
也就是说a文件中的变量函数等只能在a文件中引用,即使a被加载到b文件中,b文件也不能引用a文件的变量函数等。
- 外部(b.js)访问不到内部(a.js)
- 内部(a.js)访问不到外部(b.js)
4、解决模块之间的通信–导出多个成员(由多个成员组成的对象)
想要解决模块之间的通信,我们需要用到 node 中的 commonjs 模块规范:拿到被加载文件模块导出的接口对象。把我们所有需要被外部访问的成员挂载到 module.exports 这个对象的属性上。
注意:为了简化操作,node底层 封装了var exports = module.exports (这里是传址)(也就是说,我们可以直接使用exports) ,最后默认return module.exports (一旦给 exports 重新赋值,指针丢失,就无法返回其值了)
5、解决模块之间的通信–导出单个成员(成员是什么类型拿到的就是什么类型)
想要解决模块之间的通信,我们需要用到 node 中的 commonjs 模块规范:拿到被加载文件模块导出的接口对象。把我们所有需要被外部访问的成员挂载到 module 这个对象上。