严格模式
1 | ; |
使用严格模式的目的:
- 消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的 Javascript 做好铺垫。
内置对象
global
是 NodeJS 服务器端的全局对象。在 Node 环境中输入global
可以查看其包含的所有属性和方法。process
代表当前 Node 进程。通过process
可以拿到很多有用的信息。1
2
3
4
5
6
7process === 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16;
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;
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');同步读文件
1
2
3
4
5
6;
const fs = require('fs');
let data = fs.readFileSync('sample.txt', 'utf-8');
// 将读取到的文件直接返回,赋值给 data异步写文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16;
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,则写入的是二进制文件。
*/同步写文件
1
2
3
4
5
6;
const fs = require('fs');
let data = 'Hello, Node.js';
fs.writeFileSync('output.txt', data);选择异步还是同步
由于 Node 环境执行的 JavaScript 代码是服务器端代码,所以,绝大部分需要在服务器运行期反复执行业务逻辑的代码,必须使用异步代码,否则,同步代码在执行时期,服务器将停止响应,因为 JavaScript 只有一个执行线程。
服务器启动时如果需要读取配置文件,或者结束时需要写入到状态文件时,可以使用同步代码,因为这些代码只在启动和结束时执行一次,不影响服务器正常运行时的异步执行。
path 模块
path
模块提供了一些用于处理文件与目录的路径的实用工具。使用 path
模块可以忽略不同平台路径表示方式的差异,或针对不同平台做不同的处理。
常用属性和方法:
path.sep
:平台特定的路径片段分隔符- Windows 上是
\
- POSIX 上是
/
- Windows 上是
path.delimiter
:平台特定的路径定界符- Windows 上是
;
- POSIX 上是
:
- Windows 上是
path.dirname(path)
:获取路径的目录名,例如:1
2
3
4
5path.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
5path.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
11path.extname('index.html');
// 结果: '.html'
path.extname('index.');
// 结果: '.'
path.extname('index');
// 结果: ''
path.extname('.index');
// 结果: ''如果
path
不是字符串,则抛出TypeError
。path.join(path1, path2, ...)
:将路径拼接在一起。注:
__dirname
表示当前文件所在绝对路径。