Node.js笔记
1.简介
Node.js是什么
- Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境。
- Node.js不是一门语言,不是库,不是框架而是一个JavaScript运行时环境,可以解析和执行JavaScript代码。以前只有浏览器可以解析执行JavaScript代码,有了Node.js可以说JavaScript可以脱离浏览器来运行
- 浏览器中的JavaScript包括ECMAScript,BOM,DOM
- Node.js中的JavaScript没有BOM和DOM操作只是通过ECMAScript编码
- Node.js的特性、
1.event-driven 事件驱动
2.non-blocking I/O model 非阻塞IO模型(异步)
3.lightweight and efficient 轻量和高效
Node.js能做什么
- Web 服务器后台
- 命令行工具,例如:
1.npm(node)
2.git(C语言)
3.hexo(node)
2.起步
2.1 node.js的安装
2.1.1 查看电脑是否安装node
命令: node --version
2.1.2下载地址
https://nodejs.org/en/只管点击下一步安装
2.2 Hello World
注意:文件名不要使用’node.js’来命名
- 创建编写JavaScript脚本文件
- 打开终端,定位到脚本文件所属目录
- 输入node 文件名 执行对应的文件
2.3 文件的读取
1.引入fs模块
var fs =require('fs');
2.读取文件(第一个参数是文件路径,第二个参数是回调函数)
fs.readFile('文件路径',function(error,data){
//error参数代表读取是否成功,data代表读取的内容
if(error){
//文件读取失败
console.log(error);//这儿值是错误对象
//[Error: ENOENT: no such file or directory, open 'F:\lyh\Node\01\data\helloa.txt'] {
//errno: -4058,
//code: 'ENOENT',
//syscall: 'open',
//path: 'F:\\lyh\\Node\\01\\data\\helloa.txt'}
console.log(data);//undefined
console.log(‘读取文件失败’)
}else{
//文件读取成功
console.log(error); //null
console.log(data); //<Buffer e4 bd a0 e5 a5 bd e4 b8 96 e7 95 8c> 数据为16进制编码
console.log('文件读取成功')
}
})
2.4 文件的写入
1.引入fs模块
var fs = require('fs');
2.写入文件(三个参数 :第一个写入文件的路径 ,第二个写入文件的内容 ,第三个回调函数)
fs.writeFile('写入文件的路径','写入的内容',function(error){
if(error){
//写入失败
console.log(error)//此时文件error是一个错误对象
//[Error: ENOENT: no such file or directory, open 'F:\lyh\Node\01\data\你好>.md'] {
//errno: -4058,
//code: 'ENOENT',
//syscall: 'open',
//path: 'F:\\lyh\\Node\\01\\data\\你好>.md'}
}else{
//写入文件成功
console.log(error)//null
}
})
2.5 使用http模块构建服务器
1.引入http模块
var http = require('http');
2.使用http.createServe()方法创建一个Web服务器
var serve = http.createServer();
3.注册request请求事件,需要接受两个参数(第一个参数是请求数据,第二个参数是响应)
serve.on('request',function(request,response){
// 可以通过write()写入响应的内容(内容必须是字符串或者是二进制) 并且必须end()结束
// response.write('Hello Nodejs');
// request.url可以获取请求路径
if(request.url == '/' ){
response.end('index page')
}else if(request.url == '/login'){
response.end('login page')
}else{
response.end('404 Not Found')
}
//响应请求必须有end()结束 否则页面会一直转圈群
response.end('Hello Nodejs');
})
4.serve.listen(3000,function(){
console.log('服务器启动成功')
})
此时运行这个文件 `node 文件名`
3.Node中的JavaScript
3.1 核心模块
Node为JavaScript提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中了。例如文件操作的 fs模块 http服务构建 http模块 path路径操作模块 os操作系统信息模块。。。
require是一个方法它的作用就是用来加载模块的,在Node中模块有三种
- 具名的核心模块 ,例如 fs,http
- 用户自己编写的模块(相对路径必须加 ./不能省略否则报错 ,可以省略后缀名)
- 在Node中没有全局作用域,只有模块作用域(外部访问不到内部变量或者函数等,内部也访问不到外部的变量,函数等)
3.2模块作用域如何实现模块与模块之间的通讯
在每个文件模块中都提供了一个对象 : exports
exports 默认是一个空对象
-
1.将a文件中需要全局使用的变量或者函数挂载到exports对象上面
exports.foo='hello'; exports.add = function(x,y){ return x+y }
-
2.将a文件引入到b文件中
var a =reqire('./a'); console.log(a);//{ foo: 'Hello', add: [Function] } console.log(a.foo);//hello console.log(a.add(1,2));//3
4.Web服务器开发
4.1 ip地址和端口号
- ip地址是用来定位计算机位置
- 端口号用来定位具体的应用程序
- 一切需要联网通信的软件都会占用一个端口号
- 端口号的范围从0 - 65536之间
- 在计算机中的默认端口号最好不要去使用 例如:80
4.2 响应内容类型 Content-Type
Content-Type的对照表地址是:https://tool.oschina.net/commons
var http = require('http');
var serve = http.createServer();
serve.on('request',function(req,res){
//在响应的中添加响应头Content-Type
res.setHeader('Content-Type','Text/plain; chartset=utf-8');
res.end('Hello Nodejs')
})
serve.listen(3000,function(){
console.log('服务器启动成功')
})
4.3 响应页面或者文件
//1.引入需要的模块
var http = require('http');
var fs = require('fs');
//2.创建一个Web服务器
var serve = http.createServer();
//3.注册请求事件
serve.on('request',function(req,res){
var url = req.url;
//根据请求的路径的不同返回的内容不一样
if(url == '/'){
fs.readFile('./index.html',function(err,data){
if(err){
res.setHeader('Content-Type','Text/plain;charset=utf-8');
res.end('文件读取失败')
}else{
res.setHeader('Content-Type','Text/html;charset=utf-8');
res.end(data)
}
})
}else{
res.setHeader('Content-Type','Text/plain;charset=utf-8');
res.end('404 Not Found')
}
})
serve.listen(3000,function(){
console.log('服务器启动成功')
})
4.4 服务端渲染和客户端渲染
1. 服务端渲染:在服务器端使用模板引擎,将数据直接在服务端添加然后再讲页面的整个内容返回给客户端
2. 服务端渲染和客户端渲染的区别
- 客户端渲染不利于SEO搜索引擎优化,服务端渲染查看网页源代码能看到搜索到信息但是客户端渲染查看网页源代码搜索不到信息
- 服务端渲染可以被爬虫抓取到,客户端异步渲染是很难被爬虫抓取到的
- 网站一般既不是纯异步,也不是纯服务端渲染出来的而是两者的结合,例如 京东的商品列表采用的是服务端渲染目的是为了搜索引擎优化,而它的商品列表为了客户的体验是客户端异步渲染
4.5 处理网站中的静态资源
浏览器收到 HTML 响应内容之后 就要开始从上到下依次解析,在解析的过程中如果发现link ,script ,img , iframe , video ,audio 等具有src 或者 link的href属性标签(外链资源)的时候,浏览器会自动对这些资源发动请求
我们为了方便的统一处理这些资源,把所有的静态资源放到一个文件夹内,不能像上面的根据 `req.url`的请求路径一个一个判断返回不同的内容,此时我们可以这样做
文件的划分
app.js的处理
var http = require('http');
var fs = require('fs');
var serve = http.createServer();
serve.on('request',function(req,res){
var url = req.url;
if(url === '/'){
fs.readFile('./view/index.html',function(err,data){
if(err){
res.end('404 Not Found');
}
res.end(data)
})
}else if(url.indexOf('/public/') === 0 ){
fs.readFile('.'+url , function(err,data){
if(err){
console.log('404 Not Found');
}
res.end(data)
})
}
})
4.6 url模块的parse()方法
url的parse()方法能够将请求路径中的查询字符串给解析成为一个对象
var http = require('http');
var fs = require('fs');
var url = require('url');
var serve = http.createServer();
serve.on('request',function(req,res){
//url.parse第二个参数为true表示直接将查询的字符串转为一个对象(通过query属性来访问)
var parseObj = url.parse(req.url,true);
var pathname = parseObj.pathname;
/**
这是parseObj的内容
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: '?username=ceshi&mes=asd',
query: [Object: null prototype] { username: 'ceshi', mes: 'asd' },
pathname: '/pinglun',
path: '/pinglun?username=ceshi&mes=asd',
href: '/pinglun?username=ceshi&mes=asd'
}
*/
//此时以前的url 可以换成 pathname
if(pathname === 'pinglun'){
console.log(parseObj.query)
}
})
serve.listen(3000,function(){
console.log('服务器启动成功')
})
4.7小案例
地址:https://github.com/SmallLuLu/nodeSallExport.git