Node.JS的介绍

一、什么是NodeJS

1、nodejs:node是一个平台,是服务器端JavaScript的解析器,nodejs本身运行Google V8 JavaScript引擎,所以速度和性能非常好  
2、nodejs旨在解决创建高性能的网络应用程序,可以编写每秒处理上万条同时访问物理机器的连接代码,并且可处理高并发和异步I/O
3、node中BOM、DOM不能使用,ECMAScript可以使用
4、node主要用来操作文件的读写,数据库的请求,处理前端ajax请求。
5、 注意:因为node完美支持ES6,所以在node环境中可以使用ES6的所有语法

二、前端最主流的JavaScript运行环境

1.使用Nodejs最大的优点是可以让javascript运行在服务器端,Node.js是一个基于Chrome V8引擎的JavaScript运行环境。
2.Node.js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效。
		2.1 阻塞 / 非阻塞
			2.1.1 阻塞:I/O时进程休眠等待I/O完成后进行下一步

			阻塞代码实例
					var fs = require("fs");
					var data = fs.readFileSync('input.txt');
					console.log(data.toString());
					console.log("程序执行结束!");

			2.1.2 非阻塞:I/O时函数立即返回,进程不等待I/O完成
					非阻塞代码实例
					var fs = require("fs");
					fs.readFile('input.txt', function (err, data) {
					    if (err) return console.error(err);
					    console.log(data.toString());
					});
					console.log("程序执行结束了!");
					
		2.2 事件驱动
			2.2.1  I / O等异步操作结束后通知
			2.2.2观察者模式

		Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件
		// 引入 events 模块
		var events = require('events');
		// 创建 eventEmitter 对象
		var eventEmitter = new events.EventEmitter();
		
		// 引入 events 模块
		var events = require('events');
		// 创建 eventEmitter 对象
		var eventEmitter = new events.EventEmitter();
		
		// 创建事件处理程序
		var connectHandler = function connected() {
		   console.log('连接成功。');
		
		   // 触发 data_received 事件
		   eventEmitter.emit('data_received');
		}
		
		// 绑定 connection 事件处理程序
		eventEmitter.on('connection', connectHandler);
		
		// 使用匿名函数绑定 data_received 事件
		eventEmitter.on('data_received', function(){
		   console.log('数据接收成功。');
		});
		// 触发 connection 事件
		eventEmitter.emit('connection');
		console.log("程序执行完毕。");
		node event.js
		连接成功。
		数据接收成功。
		程序执行完毕。

3.Node.js的包管理器npm,是全球最大的开源库生态系统,npm是一个模块管理工具。

三、NodeJS的安装

NodeJS提供了一些安装程序,都可以在**nodejs.org**这里下载并安装。
Windows系统下,选择和系统版本匹配的**.msi**后缀的安装文件。Mac OS X系统下,选择**.pkg**后缀的安装文件。

编译安装
Linux系统下没有现成的安装程序可用,一般使用以下方式编译方式安装NodeJS。

确保系统下g++版本在4.6以上,python版本在2.6以上。
从nodejs.org下载tar.gz后缀的NodeJS最新版源代码包并解压到某个位置。
进入解压到的目录,使用以下命令编译和安装。
 $ ./configure
 $ make
 $ sudo make install

四、NodeJS如何运行

打开终端,键入node进入命令交互模式,可以输入一条代码语句后立即执行并显示结果,或先写一个JS文件再运行。例如:

$ node
> console.log('Hello World!');
Hello World!
或
function hello() {
    console.log('Hello World!');
}
hello();

写好后在终端下键入node hello.js运行,结果如下:

$ node hello.js
Hello World!

五、NodeJS模块

	核心模块
	
	创建一个.JS文件,在文件里面引入模块
	在node中,所有功能均已被封装成模块,默认使用模块化开发
	其中开启服务中需要用到的模块:
	           http模块:用来开启服务
	             fs模块:用来操作模块
	            url模块:用来解析url
	    querystring模块:用来解析url携带的数据

1、http模块:
		    //1.引入模块
		    const http = require("http”);
	
	    //2.开启一个http服务,接收的回调函数中,有两个返回值,req表示请求(客户端到服务端),res表示响应(服务端到客户端)
	    const httpObj = http.createServer((req,res)=>{…})
	
	    //创建服务成功后,每次请求都会触发createServer的回调函数
	    const httpObj = http.createServer((req,res)=>{
	        //http请求默认情况下,会多请求一次favicon.ico图标文件,如不需要可以过滤
	        if(req.url != "/favicon.ico"){
	            //可以在服务端打印信息,只要被访问就会触发
	            console.log("有人访问了");
	            //参数req有属性为url,表示当前服务被哪个url访问,打印访问服务的url
	            console.log("访问的地址是:" + req.url);
	            //如果需要向前端返回数据,而且数据需要以html的形式被解析,有两种方式:
	            //    1.通过head和meta标签设置字符编码
	            //res.write("<head><meta charset='utf-8'></head>");
	            //    2.通过设置请求头,设置字符编码(推荐)
	            res.writeHead(200,{"content-type":"text/html;charset=utf-8"})
	            //通过参数res的write方法,向前端返回数据,此处打印标签进行测试
	            res.write("<mark>晚上吃什么</mark>")
	            //完成此次请求的响应之后,要结束本次响应,否则前端会一直处在请求状态
	            res.end()
	        }
	    })
	
	    //3.监听端口地址,成功开启服务,执行回调函数...
	    httpObj.listen("8001","127.0.0.1",()=>{
	        console.log("server runing...");
	    });


2、fs模块:
		    //引入fs(文件系统)模块
		    const fs = require('fs’);
	    
	    //调用fs模块的读取文件方法,接收三个参数:
	        //参数1:指定读取文件名为请求的文件名
	        //参数2:指定解析文件内容的编码格式,可省略
	        //参数3:回调函数,读取文件后执行,接收两个参数
	                                            //参数1:错误日志,或,null
	                                            //参数2:文件内容
	    fs.readFile("./www/index.html","utf-8",(err,fsCont)=>{
	        if(err){
	            //如果不为null,表示有错误内容,响应404
	            res.write("404")
	        }else{
	            //如果为null,表示找到文件,将文件作为数据响应
	            res.write(fsCont)
	        }
	        res.end(); //结束本次请求
	    })

3、url模块:
	 //引入url模块

    const urlModel = require("url")

    //模拟一个url
    var url = "http://www.baidu.com/data/hahaha/?a=1&b=2#01";
    console.log(typeof url);
    console.log(url);

    //将url解析成对象
    var obj = urlModel.parse(url);
    var obj = urlModel.parse(url,true); //将url中的query属性解析成对象
    console.log(typeof obj);
    console.log(obj);

    //将对象解析成url
    var str = urlModel.format(obj)
    console.log(typeof str);
    console.log(str);
	Url {
			  protocol: 'http:',   							 // 协议
			  slashes: true,								//是否有
			  auth: null,										//用户名和密码					
			  host: 'localhost:3000', 					// 域名 + 端口
			  port: '3000',				 					// 端口号
			  hostname: 'localhost',					 // 域名
			  hash: '#url', 								// 哈希值--片断标识符 指向HTML页面某个DOM元素的ID
			  search: '?user=node&pass=123', // ? + 参数
			  query: 'user=node&pass=123', 	// 字符串形式的参数
			  pathname: '/api', 							// 路由 --- 端口号和?中间的那部分
			  path: '/api?user=node&pass=123', // 路由 + search
			  href: 'http://localhost:3000/api?user=node&pass=123#url'  //原始的URL
	   }

		    url.parse(req.url, true).query				//获取到参数信息
		
		    url.parse(req.url, true).pathname		//获取到路由信息
		
		    url.parse(req.url, true).port					//获取到端口号
		
		    url.parse(req.url, true).protocol			//获取到协议信息
		
		    url.parse(req.url, true).hostname		//获取到域名信息


4、querystring模块:
	    //将查询字符与对象互相转换的模块
	    const querystring = require("querystring");

	    //模拟类似于get方式发送的信息
	    var str = 'name=admin%padd=123';
	    //根据%号,分割字符为对象
	    var obj = querystring.parse(str,"%");
	    console.log(typeof obj);
	    console.log(obj);
	
	    //模拟对象
	    var obj2 = {a:1,b:2}
	    console.log(obj2)
	    //将对象转换成类似于get方式发送的信息,用%号隔开
	    var str2 = querystring.stringify(obj2,"%");
	    console.log(typeof str2)
	    console.log(str2)

第三方模块
	express介绍
	    Express基于 Node.js 平台,快速、开放、极简的 Web 开发框架
	    Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能
	express的安装
		npm install express --save
		npm install express -S
		npm i express -S
		
	也可以使用淘宝镜像cnpm代替npm
	在控制台中输入如下指令,以后即可使用cnpm代替npm
	npm install -g cnpm --registry=https://registry.npm.taobao.org
	
 	创建一个文件夹expressserver,进入文件夹并且安装express
	mkdir expressserver
	cd expressserver
	cnpm i express -S
	
	const express = require('express'); // 引入第三方模块

		// 实例化一个express对象
		const app = express();
		app.get('/', (req, res) => {
		  res.send('hello world');
		})	
		app.get('/login', (req, res) => {
		  res.send('登录')
		})	
		app.get('/test', (req, res) => {
		  res.send('测试')
		})
		app.listen(3000, () => {
		  console.log('your server is running at http://localhost:3000');
		})

	通过应用生成器工具 express-generator 可以快速创建一个应用的骨架
	express-generator 包含了 express 命令行工具
		a)、安装express项目生成器
			cnpm i express-generator -g
		b)、使用命令创建项目
		    --view=ejs 并不是必须得加的,如果不加,最终默认的模板是jade语法
		npm/cnpm start可以启动服务器,是因为package.json文件中scripts选项做了配置
			express proname --view=ejs
			cd proname
			cnpm i
			cnpm start  (node ./bin/www)

六、什么是服务器和前后端分离与耦合架构的概念

1.	服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。在网络环境下,根据服务器提供的服务类型不同,分为文件服务器、数据库服务器、应用程序服务器、WEB服务器等。
2.	前后端分离
		前端HTML页面通过Ajax调用后端的RestFul API并使用Json数据进行交互
3. 前后端耦合
		前端写完的HTML页面交给后端,后端负责渲染数据,前后端相互调整的方式

七、ejs模板
EJS 是一套简单的模板语言,帮你利用普通的 JavaScript 代码生成 HTML 页面。

	router.get('/', function(req, res, next) {
	    res.render('index', {
	        title: '<mark>Express</mark>',
	        list: [ 'a', 'b', 'c', 'd'],
	        flag: true
	    });
	});
	
	    前端ejs模板中使用变量
	
	<%- title %>  // 解析
	<%= title %>  // 转义 --- 原样输出
	
	    给一个页面导入一个代码片段(首页中导入共同头部)--- 包含语法
	
	<%- include('./header.ejs') %>
	
	    条件判断
	
	<% if (!flag) { %>
	    <ul>
	        <li>week1</li>
	    </ul>
	<% } %>
	
	    循环语句
	
	<% for (var i = 0; i < list.length; i++) { %>
	    <p><%- list[i] %></p>
	<% } %>
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值