什么是Node.js
是使用了V8引擎,运行在服务端,能解析js的程序。
优势
- 脱离浏览器的执行环境
- 提供高性能的web服务
- IO性能强大
- 事件处理机制完善
- 天然处理DOM
- 社区活跃,生态圈完善
- 处理大流量数据,异步处理大量并发连接
- 适合实时交互的应用
- 完美支持对象数据
安装
官网:https://nodejs.org/en/download/
中文网:http://nodejs.cn/download/
淘宝镜像:https://npm.taobao.org/mirrors/node
本文以window为例,安装的是 msi 文件。
node -v // 下载相关文件,安装后,查看版本来判断是否安装了
NPM 内置的包管理器
从NPM服务器下载第三方包,如gulp、webpack、vue等等
npm 常用命令
npm install 模块 -g // 全局安装
npm install 模块 // 安装好后不写入package.json中
npm install 模块 --save // 安装好后写入package.json的dependencies中(生产环境依赖)
npm install 模块 --save-dev // 安装好后写入package.json的devDepencies中(开发环境依赖)
npm uninstall 模块 // 全局卸载
npm uninstall 模块:删除模块,但不删除模块留在package.json中的对应信息
npm uninstall 模块 // --save 删除模块,同时删除模块留在package.json中dependencies下的对应信息
npm uninstall 模块 --save-dev // 删除模块,同时删除模块留在package.json中devDependencies下的对应信息
有时使用npm安装包会比较慢,可以用淘宝的的 NPM 镜像,cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org //安装cnpm
Hello World
// helloworld.js 使用 http 模块提供服务
var http = require('http');
http.createServer(function(req, res){
// 发送相应数据
res.end('hello world!\n');
}).listen(8000);
//服务运行后输出一行信息
console.log('server is running...');
node helloworld.js // 在 helloworld.js 所在目录打开命令提示符,启动服务,用浏览器打开 http://localhost:8000 体验吧
阻塞与非阻塞
程序等待调用结果(消息、返回值)的状态。阻塞则是拿到结果才继续往下执行,而非阻塞则是继续做其他事,等结果拿到后通过回调来响应处理。
// 阻塞代码
var fs = require('fs');
var data = fs.readFileSync('data.txt'); // 同步读取
console.log(data.toString());
console.log('hei');
// 非阻塞代码
var fs = require('fs');
var data = fs.readFile('data.txt', function(err, data){
if(err){
return console.error(err);
}
console.log(data.toString());
});
console.log('没等待文件读取完毕,就执行到这了');
事件
var connctHandler = function connected(){
console.log('connected')
}
eventEmitter.on('connection', connctHandler); // 绑定事件处理函数
// 触发事件
eventEmitter.emit('connection');
模块化
模块是 Node.js 应用程序的基本组成部分。
文件和模块意义对应,一个文件对应一个模块 。
模块分为:原生模块、文件模块
模块加载方式:从文件模块缓存中加载、从原生模块找、从文件模块找
// 模块案例
// hello.js
function hello(){
this.sayHello = function(){
console.log('hello');
}
}
module.exports = hello;
// main.js
var Hello = require('./hello.js');
var h = new Hello();
h.sayHello();
node main.js //运行,结果:控制台打印“hello”
路由
// http.js
var http = require('http');
var url = require('url');
function start (router) {
function req (req, res) {
var path = url.parse(req.url).pathname;
router(path, res);
}
http.createServer(req).listen(8888);
console.log('Server start');
}
exports.start = start;
// router.js
function router(path, res) {
if (path === '/') {
res.end('首页');
} else if (path === '/user') {
res.end('用户中心');
} else {
res.end('404');
}
}
exports.router = router;
// main.js
var http = require('./http');
var router = require('./router.js');
http.start(router.router);
// 运行
node main.js