一,什么是nodejs
node.js是一个基于chrome V8引擎的JavaScript运行环境 (node.js并不是一门新的语言)
二。node.js的特点
1.事件驱动
2.非阻塞I/O
3.单线程
4.不能利用多核CPU的优势
什么是非阻塞I/O?
就好比在一条马路上车子都并排的向前开如果前面的车子停下来了不继续向前则会造成堵车后面的车子无法继续走了这就是阻塞io,而非阻塞io就是如果前面车子停下来了后面的车子就绕开它走不影响继续向前
三。node.js模块
node.js模块总共分为三种类型
1.nodejs内置模块,如fs模块,http模块
2.第三方模块,在npm等论坛上程序员大佬编写的模块
3.自定义模块,在实际业务中根据需求所写的模块
四。常用内置模块
1.URL模块
2.fs模块
3.path模块
4.http模块
stream模块
五。用node.js原生API搭建一个服务器
首先先聊一下什么是服务器
服务器指的是提供服务的程序或者设备,他的功能有接收并处理请求,处理并响应数据信息
主要功能:
- 接收客户端请求
- 处理请求
- 响应请求
接下来就是项目环节
使用的插件:nodemon(用于代码实时编辑完刷新的工具),
项目需求描述:使用node.js原生代码实现,图片,HTML/CSS/JS文件的访问
原理:根据req.url来区分客户的请求路径,根据不同的访问路径响应不同的内容
var http = require('http')//引入http模块
var fs = require('fs')//需要操作文件因此引入fs模块
var path = require('path')//路径模块
var express = require('express')
var server = http.createServer(function(req,res)){ //创建一个web服务器
var url = req.url
//favicon.ico
if(url !='/favaicon.ico'){//由于没favacion控制台会报404所以在这里做个判断
//url路径处理 当用户直接访问根路径时直接跳转到index.html
url = url ==='/'?'/index.html':url
var filePath = path.join(__dirname,'/public'+url)
//判断传入的是否是文件
fs.stat(fliePath,function(err,stats){
//报错文件不存在时
if(err||!stats){
res.writeHead(404,{'Content-Type':'text/plain;charset=utf-8;'})
res.end('文件不存在')
}
//如果是一个文件那就读取文件响应到客户端
if(stats&&stats.isFile()){
res.statusCode = 200 //浏览器的状态码
res.setHeader('Content-text','text/plain')
//读取文件,响应给客户端
fs.createReadStream(filePath).pipe(res)//管道流传入客户端
}
})
}
}
//添加一个端口监听
server.listen(8000,function(){
console.log('server is running on 8000')
})
npm包管理器
- npm是啥?
- npm 是基于commonJS规范的包管理工具
在node.js的安装中,npm也跟着同步安装
- npm能干啥?
1.便于模块化管理
- 便于代码转移
3.能安装模块
4.package.json能记录开发的依赖模块
1.全局安装 npm 所需要下载的模块 -g
2.本地安装 :npm 所需要下载的模块 -S (程序上线之后也依赖的包)
npm 所需要下载的模块 -D(仅项目开发环节需要使用后续上线用不上)
npm init
执行npm init之后会在项目的根目录生成一个package.json文件用来记录项目所需要的各自依赖包
Express框架的使用
- 使用Express的脚手架工具express-generator搭建项目
使用npm安装
npm install express-generator -g
如下命令创建了一个名称为 myapp 的 Express 应用。此应用将在当前目录下的 myapp 目录中创建,并且设置为使用 Pug 模板引擎
$ express --view=pug myapp
create : myapp
create : myapp/package.json
create : myapp/app.js
create : myapp/public
create : myapp/public/javascripts
create : myapp/public/images
create : myapp/routes
create : myapp/routes/index.js
create : myapp/routes/users.js
create : myapp/public/stylesheets
create : myapp/public/stylesheets/style.css
create : myapp/views
create : myapp/views/index.pug
create : myapp/views/layout.pug
create : myapp/views/error.pug
create : myapp/bin
create : myapp/bin/www
项目结构详解
(1)package.json文件详解
body-parser 用于解析HTTP请求体中的body数据
cookie-parser 用于解析cookie会话数据
ejs 页面模块
morgan 是一个日志工具
serve-favicon 用于设置网站的favicon
(2) /bin/www 入口文件详解
端口号设置
服务启动时的事件监听onError / onListen
(3)app.js文件详解
中间件:next()表示交给下一个中间件处理
路由配置:res.render('index', {})渲染index模板引擎
模块引擎的配置
express.static(),设置静态资源目录
bodyParser中间件,用于处理form表单默认的 application/x-www-form-urlencoded 数据编码
cookieParser中间件,用于解析cookie数据
404中间件,渲染error模板引擎
(4)路由详解
不能两次调用 res.send()
向前端发送文件
res.sendFile(__dirname+'form.html')
如何定义一个路由?
router.get('/xxx',function(req,res,next){})
router.post('/xxx',function(req,res,next){})
同时支持GET/POST:
router.all('/xxx', function(req,res,next){})
路由可以使用正则表达式
router.get('/ab*cd', fn)
(5)ejs模板引擎详解
结合ejs官网,介绍什么是ejs?
常用标签介绍(在代码中演示一下这些标签的用法):
<% %> 流程控制标签,用于包裹js代码
<%= %> 直接输出值,不对“值”执行解析
<%- %> 输出值,会对“值”中的HTML进行解析
<%# %> 注释标签
% 对特殊符号进行转义,如 %%
<%- include('head', data) %>
express渲染ejs的语法:
res.render('ejs', data, options)