1. node.js介绍
node.js是一个开发平台,该平台使用的编程语言是JavaScript,是基于Chrome V8 JavaScript引擎构建的,可以开发控制台程序(命令行程序、CLI程序)、桌面应用程序(GUI)(借助node-webkit、electron等框架实现)、web应用程序(网站)。
node.js全栈开发技术栈:MEAN - MongoDB、Express、Angular、node.js。
特点:事件驱动(当事件被触发时,执行传递过去的回调函数);非阻塞 I/O模型(当执行I/O操作时,不会阻塞线程);单线程;拥有世界最大的开源库生态系统 - npm。
2. 区别
(1)传统PHP等开发网站
(2)node.js开发网站
3. REPL
全称Read-Eval-Print-Loop,即交互式解释器,R 读取,读取用户输入,解析输入了JavaScript数据结构并存储在内存中;E 执行,执行输入的数据结构;P 打印,输出结果;L 循环,循环操作以上步骤直到用户两次按下ctrl-c按钮或输入'.exit'退出,直接在控制台输入'node'命令进入REPL环境,和浏览器开发人员工具中的控制台功能类似。
4. 初体验
for(var i=0; i<10; i++){
for(var j=0; j<=i; j++){
process.stdout.write('*');
}
console.log();
}
// process模块在使用的时候无需require()函数加载该模块,可直接使用,fs模块则需加载,var fs = require('fs');
// process模块是全局的模块,而fs模块不是,全局模块可直接使用,非全局模块需加载
5. 文件操作
(1)写文件
// 写文件:fs.writeFile(file, data[, options], callback)
var fs = require('fs');
var msg = 'Hello, Karry!';
fs.writeFile('./hello.txt', msg, 'utf-8', function(err) {
if(err) {
console.log('写文件出错!具体错误:' + err);
} else {
console.log('OK');
}
})
(2)读文件
var fs = require('fs');
// 读文件:fs.readFile(path[, options], callback)
// 此处./hello.txt相对路径,相对的是执行node命令的路径,而不是相对于当前正在执行的js文件
// __dirname: 表示当前正在执行的js文件所在的目录
// __filename: 表示当前正在执行的js文件的完整路径
// var filename = __dirname + '\\' + 'hello.txt';
// fs.readFile(filename, 'utf8', function(err, data) {
fs.readFile('./hello.txt', 'utf8', function(err, data) {
if(err) {
throw err;
}
// data参数的数据类型是一个buffer对象,里面保存的是一个一个的字节,需转换成字符串
// console.log(data.toString('utf8'));
// 函数调用时传入'utf8'则不需转换
console.log(data);
})
(3)path路径拼接
var path = require('path');
var filename = path.join(__dirname, 'hello.txt');
(4)创建文件夹
var fs = require('fs');
// 创建文件夹,父文件夹下有三个子文件夹
fs.mkdir('./tfboys', function(err) {
if(err) {
throw err;
}
// 创建./tfboys/Karry目录,无论是否存在./tfboys目录
fs.mkdir('./tfboys/Karry', { recursive: true }, function(err) {
if(err) {
throw err;
}
});
fs.mkdir('./tfboys/Roy', { recursive: true }, function(err) {
if(err) {
throw err;
}
});
fs.mkdir('./tfboys/Yee', { recursive: true }, function(err) {
if(err) {
throw err;
}
});
})
PS:对于异步操作,try-catch是无法捕获异常的,要通过判断错误号(err.code)来进行出错处理。
6. NPM
Node Package Manager,Node包管理器,以JavaScript编写的软件包管理系统。
(1)常用命令
(2)模块(modules)和包(packages)的区别
(3)package.json文件:包说明文件(项目描述文件、元数据),用来管理组织一个包(一个项目),位于当前项目根目录下,json格式;常见项name包的名字、version版本、description描述、author作者、main包的入口js文件,从main字段这里指定的那个js文件开始执行、dependencies当前包依赖的其他包,前两项为必有项。
package-lock.json文件:项目依赖说明文件,加载更快。
7. node.js模块分类
(1)核心模块Core Module、内置模块、原生模块:fs、http、path、url等,所有内置模块在安装node.js时就已经编译成二进制文件,可以直接加载运行(速度较快),部分内置模块在node.exe这个进程启动的时候就已经默认加载了,可以直接使用。
(2)文件模块:按文件后缀划分,加载时,没有指定后缀名例如example,则按照如下顺序依次加载相应模块:example.js、example.json、example.node、example文件夹(模块)-> package.json -> main(入口文件 app.js -> .js、.json、.node)。
(3)自定义模块(第三方模块):mime、cheerio、moment、mongo。
(4)require函数加载模块原理(被加载的模块会先执行一次,返回一个对象{}):检查Module._cache中是否有缓存的模块实例;如果缓存中没有,那么创建一个Module实例;将创建的Module实例保存到缓存中,供下次使用;调用module.load()读取模块内容,然后调用module.complie()编译执行(封装成一个沙箱),该模块如果加载解析出错,那么从缓存中删除该模块;返回module.exports。
(5)CommonJs:为JavaScript语言定制的一种模块规范、编程API规范,例如规定了require加载模块,node.js遵循了这些规范。
(6)exports和module.exports指向的是同一个对象,最终require()函数返回的是module。exports中的数据,return module.exports,即当exports的指向改变时,返回的module.exports不发生改变。