一,基础知识部分
1.node是什么?
- node.js基于chromeV8引擎构建的javascript运行时环境。
- 不是框架不是库。
- 说白了就是能够通过node.js来解释执行js的代码。
2.node中的js
- 没有dom和bom,有es;
- 提供了一些服务端操作的api
fs;http;os;path等
3.特性
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
- 事件驱动
在node中执行的代码是通过事件去触发的。 - 非事件驱动,它达到某种状态会执行,他会循环去检查。
- 非阻塞式 I/O 的模型(和异步的概念非常像)
4.npm
npm 是 JavaScript 世界的包管理工具,并且是 Node.js 平台的默认包管理工具。通过 npm 可以安装、共享、分发代码,管理项目依赖关系。
5.node能做什么?
- node让前端拥有服务端开发的能力
- node可以做一些命令行的工具
- npm
- webpack
- 我们平时工作的时候使用做多的就是node的命令行工具,我们不用自己做,一般是使用别人做好的
二,基础操作
1.解析执行JavaScript
1.在文件目录下按住shift点击右键,在此处打开powershell窗口,可以执行命令
2.打开cmd(win+R执行cmd),切换盘符,盘符: 切换盘符(如c:),通过cd切换到指定目录
3.通过vscode提供的命令行工具(直接就在我们当前的目录下了)
执行注意问题:
- 执行脚本 node + 脚本文件路径
- 文件名不能使用node.js作为文件名,最好不要使用中文
2.读写文件
node给我们提供了一个操作文件的模块fs模块,fs是file-system的缩写我们想用这个模块,需要先引入var fs = require('fs')
;就是提供了一些文件操作的api。
- 读文件
readFile(path,function(error,data){})
var fs = require('fs');
fs.readFile('../9.Node.js/hello',function(error,data){
if(error){
console.log(error)
}else{
console.log(data.toString())
}
})
data是一个二进制数据,可以通过toString()方法转换成字符串
2.写文件
writeFile(path,text,function(error){})
var fs = require('fs');
fs.writeFile('../9.Node.js/write-fs','书写文件成功',function(error){
if(error){
console.log(error)
}else{
console.log(data)
}
})
3.http服务
node为我们提供了一个http的模块,通过这个模块我们可以快速构建一个web服务.
如何构建
// ===========构建HTTP服务
// 1.引入http模块
var http = require('http');
//2. 通过http提供的一个api创建web项目
var service = http.createServer();
// 3.监听request请求
service.on('request',function(request,response){
console.log("接收到了请求")
})
//4.要开启这个服务需要监听端口号
service.listen(2000,function(){
console.log('node服务启动在2000端口,可以通过localhost:2000进行访问')
})
参数解释
两个参数:
- request: 携带请求的信息,接受请求的参数。
- response: 对浏览器做出响应
- 使用
response.write()
或response.end()
来向浏览器声明响应结束 - 需要注意的是响应的结构必须是字符串或者二进制,这会用到JSON对象转为字符串
JSON.stringify()
;扩展字符串转为JSON的方式JSON.parse()
。
三,node中的javascript
1.模块化开发
JS 模块化就是指 JS 代码分成不同的模块,模块内部定义变量作用域只属于模块内部,模块之间变量命名不会相互冲突。各个模块相互独立,而且又可以通过某种方式相互引用协作。
所谓模块化开发就是封装细节,提供使用接口,彼此之间互不影响,每个模块都是实现某一特定的功能。模块化开发的基础就是函数。模块化开发使用代码耦合度降低,模块化的意义在于最大化的设计重用,以最少的模块、零部件,更快速的满足更多的个性化需求。
2.为什么要进行模块化开发?
JS 诞生的时候,仅仅是为了实现网页表单的本地校验和简单的 dom 操作处理。所以并没有模块化的规范设计。项目小的时候,我们可以通过命名空间、局部作用域、自执行函数等手段实现变量不冲突。但是到了大一点的项目,各种组件,各种第三方插件和各种 js 脚步融合的时候,就会发现这些技巧远远不够。
3.模块之间如何引用协作
- 通过require()方法进行引入
注意路径问题(如果不加路径的话会默认先去找核心模块,之后找第三方模块) - 可以通过模块暴露的api或者成员变量去进行通信
module.exports我们实际暴露的是module.exports指向的内容。(即 require到的内容与exports的指向改变无关,是由module.exports指向的内容决定的)
exports 就是module.exports的浅拷贝。
4.node里的模块
- 核心模块
node官方文档有提供api - 第三方模块
- 用户自定义模块
5.模块化开发的好处
使我们的系统更加容易维护,提高了代码的灵活性,复用性。
四,简单的服务端开发
1.关于ip和端口号
- ip 地址定位计算机
查看本机IPipconfig
- 端口号定位具体的应用程序
一切需要互联网通信的软件都会占用一个端口号
端口号范围是0 - 65536之间
在计算机中有一些默认端口号,最好不要去使用,例如:http默认的80
我们在开发过程中使用一些简单好记的就可以,例如:3000、5000等没含义的。
// ip和源端口
// const 来声明一个只读的常量
const ip = request.socket.remoteAddress;
const port =request.socket.remotePort;
console.log(`您的IP地址是${ip},您的源端口是${port}`)
2.content-type解决乱码问题
对照关系网站:http://tool.oschina.net/commons
res.setHeader('Content-Type', 'text/html; charset=utf-8')
3.发送文件中的数据
可以通过http结合fs系统
通过http结合fs就可以通过我们开启的服务访问html页面。
注意的是所有通过url访问的文件都需要在服务中配置路径。