Contents
  1. 1. Node.js 学习笔记02
    1. 1.1. 全局严格模式
    2. 1.2. 模块系统
      1. 1.2.1. 优先级
      2. 1.2.2. 可用参数
      3. 1.2.3. 执行顺序
    3. 1.3. 路由
    4. 1.4. 全局对象
      1. 1.4.1. 全局对象与全局变量
    5. 1.5. 文件系统
    6. 1.6. GET POST 请求

[TOC]

Node.js 学习笔记02

全局严格模式

1
node --use_strict xx.js

模块系统

优先级

Node.js的require方法的文件查找策略如下:

由于Nodejs中存在4类模块(原生模块和3种文件模块),尽管require方法极其简单, 但是内部的加载缺是十分复杂的,其加载优先级也各自不同.

可用参数

require方法接受以下几种参数的传递:

  • httpfspath等,原生模块。
  • ./mod../mod,相对路径的文件模块。
  • /pathtomodule/mod,绝对路径的文件模块。
  • mod,非原生模块的文件模块。

执行顺序

在路径Y下执行require(X)语句执行顺序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
1. 如果 X 是内置模块
a. 返回内置模块
b. 停止执行
2. 如果 X 以 '/' 开头
a. 设置 Y 为文件根路径
3. 如果 X 以 './' 或 '/' or '../' 开头
a. LOAD_AS_FILE(Y + X)
b. LOAD_AS_DIRECTORY(Y + X)
4. LOAD_NODE_MODULES(X, dirname(Y))
5. 抛出异常 "not found"
LOAD_AS_FILE(X)
1. 如果 X 是一个文件, 将 X 作为 JavaScript 文本载入并停止执行。
2. 如果 X.js 是一个文件, 将 X.js 作为 JavaScript 文本载入并停止执行。
3. 如果 X.json 是一个文件, 解析 X.json 为 JavaScript 对象并停止执行。
4. 如果 X.node 是一个文件, 将 X.node 作为二进制插件载入并停止执行。
LOAD_INDEX(X)
1. 如果 X/index.js 是一个文件, 将 X/index.js 作为 JavaScript 文本载入并停止执行。
2. 如果 X/index.json 是一个文件, 解析 X/index.json 为 JavaScript 对象并停止执行。
3. 如果 X/index.node 是一个文件, 将 X/index.node 作为二进制插件载入并停止执行。
LOAD_AS_DIRECTORY(X)
1. 如果 X/package.json 是一个文件,
a. 解析 X/package.json, 并查找 "main" 字段。
b. let M = X + (json main 字段)
c. LOAD_AS_FILE(M)
d. LOAD_INDEX(M)
2. LOAD_INDEX(X)
LOAD_NODE_MODULES(X, START)
1. let DIRS=NODE_MODULES_PATHS(START)
2. for each DIR in DIRS:
a. LOAD_AS_FILE(DIR/X)
b. LOAD_AS_DIRECTORY(DIR/X)
NODE_MODULES_PATHS(START)
1. let PARTS = path split(START)
2. let I = count of PARTS - 1
3. let DIRS = []
4. while I >= 0,
a. if PARTS[I] = "node_modules" CONTINUE
b. DIR = path join(PARTS[0 .. I] + "node_modules")
c. DIRS = DIRS + DIR
d. let I = I - 1
5. return DIRS

路由

我们要为路由提供请求的URL和其他需要的GETPOST参数, 随后路由需要根据这些数据来执行相应的代码.

全局对象

浏览器JavaScript中,通常window是全局对象
Node.js中全局对象是global,所有全局变量都是global的对象属性(除了global自身)

全局对象与全局变量

global的最根本的作用是作为全局变量的宿主.按照ECMAScript的定义,满足下面条件的变量是全局变量:

  • 在最外层定义的变量
  • 全局对象的属性
  • 隐式定义的变量(未定义直接赋值的变量)

当定义一个全局变量的时候,这个变量就会成为全局对象的一个属性,反之亦然.

  • 注意:

    在Node.js中不可能在最外层定义变量,因为所有用户代码都是属于当前模块的,而模块本身不是最外层上下文.
    永远使用var定义变量以避免引入全局变量,因为全局变量会污染命名空间提高代码耦合性

文件系统

文件系统fs模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()
异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息error

GET POST 请求

Contents
  1. 1. Node.js 学习笔记02
    1. 1.1. 全局严格模式
    2. 1.2. 模块系统
      1. 1.2.1. 优先级
      2. 1.2.2. 可用参数
      3. 1.2.3. 执行顺序
    3. 1.3. 路由
    4. 1.4. 全局对象
      1. 1.4.1. 全局对象与全局变量
    5. 1.5. 文件系统
    6. 1.6. GET POST 请求