一、什么是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>
<% } %>