NodeJs学习
文章目录
1.node是什么?
- node.js基于chromeV8引擎构建的javascript运行时环境。
- 不是框架不是库。
- 说白了就是能够通过node.js来解释执行js的代码。
2、浏览器中的js是由哪些组成的
es
dom
bom
3、node中的js
没有dom和bom
提供了一些服务端操作的api
fs
http
os
path
4、特性
- Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
- 事件驱动
- 在node中执行的代码是通过事件去触发的。
- 非事件驱动,它达到某种状态会执行,他会循环去检查。
- 非阻塞式 I/O 的模型(和异步的概念非常像)
- 轻量和高效
5、npm
npm 是 JavaScript 世界的包管理工具,并且是 Node.js 平台的默认包管理工具。通过 npm 可以安装、共享、分发代码,管理项目依赖关系。
6、node能做什么?
- node让前端拥有服务端开发的能力
- node可以做一些命令行的工具
- git(不是用node做的)
- npm
- webpack
我们平时工作的时候使用做多的就是node的命令行工具,我们不用自己做,一般是使用别人做好的
7、预备知识?
- HTML
- CSS
- JavaScript
- 简单的命令行操作
cd
dir
ls
mkdir
rm
8、能学到什么?
- bs编程模型
- browser-service浏览器到服务端
- 后台开发
- 任何服务端技术这种BS编程模型都一样,与语言无关
- Node只是我们学习BS编程模型的一个工具而已
- 模块化编程
就是将不同功能的函数封装起来,并提供使用接口,他们彼此之间互不影响
RequireJS
SeaJs
简单的来说,以前在我们JavaScript中只能通过 script 标签来引入js脚本文件,在node中可以更多方式来引入加载JavaScript脚本 - Node常用的api
fs
http
os
path
异步编程
回掉函数
promise
async
…
node起步
1、安装
访问官网
下载
安装
确认是否安装成功
命令行输入node执行
退出命令行工具ctrl+c退出命令行工具
环境变量
2、细节
读写文件
- node给我们提供了一个操作文件的模块
fs模块,fs是file-system的缩写
我们想用这个模块,需要先引入
var fs = require('fs');
就是提供了一些文件操作的api
- 读文件
readFile(path,function(error,data){})
data是一个二进制数据,可以通过toString()方法转换成字符串
- 写文件
writeFile(path,text,function(error){})
http服务
node为我们提供了一个http的模块,通过这个模块我们可以快速构建一个web服务
- 如何构建
引入http模块
var http = require('http');
- 通过http提供的一个api创建web服务
var service = http.createServer();
- 监听request请求
service.on('request',function(req,res){
console.log("接收到了请求");
});
- 两个参数:
request: 携带请求的信息,接受请求的参数。
response: 对浏览器做出相应
response.write();
response.end(); - 需要注意的是响应的结构必须是字符串或者二进制
要开启这个服务需要监听端口号
service.listen(80,function(){
console.log("node服务启动在3000端口,可以通过localhost:3000进行访问")
})
- 请求的流程
提供服务:对数据的服务
发送请求:通过浏览器的地址进行访问
处理请求:回调函数中处理请求
server.on('request', function (request,response) {
console.log('收到客户端的请求了')
})
响应请求:(注意响应结束end())
response.write('hello')
response.write(' nodejs')
// 告诉客户端,我的话说完了,你可以呈递给用户了
response.end()
node中的javascript
模块化开发
为什么要进行模块化开发?
JS 诞生的时候,仅仅是为了实现网页表单的本地校验和简单的 dom 操作处理。所以并没有模块化的规范设计。项目小的时候,我们可以通过命名空间、局部作用域、自执行函数等手段实现变量不冲突。但是到了大一点的项目,各种组件,各种第三方插件和各种 js 脚步融合的时候,就会发现这些技巧远远不够。
是什么
JS 模块化就是指 JS 代码分成不同的模块,模块内部定义变量作用域只属于模块内部,模块之间变量命名不会相互冲突。各个模块相互独立,而且又可以通过某种方式相互引用协作。
所谓模块化开发就是封装细节,提供使用接口,彼此之间互不影响,每个模块都是实现某一特定的功能。模块化开发的基础就是函数。模块化开发使用代码耦合度降低,模块化的意义在于最大化的设计重用,以最少的模块、零部件,更快速的满足更多的个性化需求。
好处
使我们的系统更加容易维护,提高了代码的灵活性,复用性。
模块之间如何引用协作
通过require()方法进行引入
可以通过模块暴露的api或者成员变量去进行通信
module.exports我们实际暴露的是module.exports指向的内容。
exports 就是module.exports的浅拷贝
注意路径问题(如果不加路径的话会默认先去找核心模块,之后找第三方模块)
执行require方法()
a、先执行引入模块的js代码
b、把引入模块的module.exports指向的内容赋值给我们的变量
可以通过模块暴露的api或者成员变量去进行通信
module.exports我们实际暴露的是module.exports指向的内容。
exports 就是module.exports的浅拷贝。
node里的模块
1、核心模块 node官方文档有提供api
2、第三方模块
3、用户自定义模块
简单的服务端开发
- 关于ip和端口号
解释一下Web服务器开发中,ip地址和端口号的概念。
ip 地址定位计算机
端口号定位具体的应用程序
一切需要互联网通信的软件都会占用一个端口号
端口号范围是0 -
65536之间
在计算机中有一些默认端口号,最好不要去使用,例如:http默认的80
我们在开发过程中使用一些简单好记的就可以,例如:3000、5000等没含义的 - Content-Type解决乱码问题
对照关系网站:
http://tool.oschina.net/commons
在服务端默认发送的数据,其实是 utf8 编码的内容
但是浏览器不知道你是 utf8 编码的内容
浏览器在不知道服务器响应内容的编码的情况下会按照当前操作系统的默认编码去解析
中文操作系统默认是 gbk
解决方法就是正确的告诉浏览器我给你发送的内容是什么编码的
在 http 协议中,Content-Type 就是用来告知对方我给你发送的数据内容是什么类型
res.setHeader('Content-Type', 'text/html; charset=utf-8')
- 发送文件中的数据
可以通过http结合fs系统
通过http结合fs就可以通过我们开启的服务访问html页面。
注意的是所有通过url访问的文件都需要在服务中配置路径。