严格模式

1
'use strict';

使用严格模式的目的:

  • 消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为;
  • 消除代码运行的一些不安全之处,保证代码运行的安全;
  • 提高编译器效率,增加运行速度;
  • 为未来新版本的 Javascript 做好铺垫。

内置对象

  1. global 是 NodeJS 服务器端的全局对象。在 Node 环境中输入 global 可以查看其包含的所有属性和方法。

  2. process 代表当前 Node 进程。通过 process 可以拿到很多有用的信息。

    1
    2
    3
    4
    5
    6
    7
    process === global.process;		// output: true
    process.version; // output: 'v5.2.0'
    process.platform; // output: 'linux'
    process.arch; // output: 'x64'
    process.cwd(); //返回当前工作目录
    process.chdir('路径'); // 切换当前工作目录
    process.nextTick(function() { /* some code */ }) // 在下一次事件响应再执行该函数

模块化规范

NodeJS 的模块化使用 CommonJS 规范。

常用内置模块

fs 模块

fs 模块用来读写文件,它同时提供异步和同步两种方式。

  1. 异步读文件

    读取文本文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    'use strict';

    const fs = require('fs');

    fs.readFile('sample.txt', 'utf-8', function (err, data) {
    if (err) {
    console.log(err);
    } else {
    console.log(data);
    }
    });
    /*
    readFile 函数的第二个参数是文件的编码方式。第三个参数是回调函数。
    回调函数接收两个参数,当正常读取时,err 参数为 null,data 参数为读取到的 String;当读取发生错误时,err 参数代表一个错误对象,data 为 undefined。
    这也是 NodeJS 中标准的回调函数写法:第一个参数代表错误信息,第二个参数代表结果。
    */

    读取二进制文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    'use strict';

    const fs = require('fs');

    fs.readFile('sample.png', function (err, data) {
    if (err) {
    console.log(err);
    } else {
    console.log(data);
    }
    });
    //当读取二进制文件时,不传入文件编码时,回调函数的 data 参数将返回一个 Buffer 对象。

    // Buffer 对象可以被转化成 String
    let text = data.String('utf-8');

    // String 也可以转化成 Buffer
    let buf = Buffer.from(text, 'utf-8');
  2. 同步读文件

    1
    2
    3
    4
    5
    6
    'use strict';

    const fs = require('fs');

    let data = fs.readFileSync('sample.txt', 'utf-8');
    // 将读取到的文件直接返回,赋值给 data
  3. 异步写文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    'use strict';

    const fs = require('fs');

    let data = 'Hello, Node.js';
    fs.writeFile('output.txt', data, function (err) {
    if (err) {
    console.log(err);
    } else {
    console.log('文件写入成功');
    }
    });
    /*
    writeFile() 的参数依次为 文件名、数据 和 回调函数。
    如果传入的数据是 String,默认按 UTF-8 编码写入文本文件,如果传入的参数是Buffer,则写入的是二进制文件。
    */
  4. 同步写文件

    1
    2
    3
    4
    5
    6
    'use strict';

    const fs = require('fs');

    let data = 'Hello, Node.js';
    fs.writeFileSync('output.txt', data);
  5. 选择异步还是同步

    由于 Node 环境执行的 JavaScript 代码是服务器端代码,所以,绝大部分需要在服务器运行期反复执行业务逻辑的代码,必须使用异步代码,否则,同步代码在执行时期,服务器将停止响应,因为 JavaScript 只有一个执行线程。

    服务器启动时如果需要读取配置文件,或者结束时需要写入到状态文件时,可以使用同步代码,因为这些代码只在启动和结束时执行一次,不影响服务器正常运行时的异步执行。

path 模块

path 模块提供了一些用于处理文件与目录的路径的实用工具。使用 path 模块可以忽略不同平台路径表示方式的差异,或针对不同平台做不同的处理。

常用属性和方法:

  • path.sep:平台特定的路径片段分隔符

    • Windows 上是 \
    • POSIX 上是 /
  • path.delimiter:平台特定的路径定界符

    • Windows 上是 ;
    • POSIX 上是 :
  • path.dirname(path):获取路径的目录名,例如:

    1
    2
    3
    4
    5
    path.dirname("/foo/bar/baz/asdf/quux.html");
    // 结果:"/foo/bar/baz/asdf"

    path.dirname("/foo/bar/baz/asdf/quux/"); // 如果最后部分是目录
    // 结果:"/foo/bar/baz/asdf"

    如果 path 不是字符串,则抛出 TypeError

  • path.basename(path[, ext]):获取路径的最后一部分,例如:

    1
    2
    3
    4
    5
    path.basename("/foo/bar/baz/asdf/quux.html");
    // 结果:"quux.html"

    path.basename("/foo/bar/baz/asdf/quux.html", ".html"); // 同时去除后缀名
    // 结果:"quux"

    如果 path 不是字符串、或给定了 ext 但不是字符串,则抛出 TypeError

  • path.extname(path):获取路径最后一部分的扩展名,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    path.extname('index.html');
    // 结果: '.html'

    path.extname('index.');
    // 结果: '.'

    path.extname('index');
    // 结果: ''

    path.extname('.index');
    // 结果: ''

    如果 path 不是字符串,则抛出 TypeError

  • path.join(path1, path2, ...):将路径拼接在一起。

    注:__dirname 表示当前文件所在绝对路径。