一、Node.js 简介
- node.js是什么?
以前:JS代码写好了,写过HTML引入浏览器解析运行
现在: JS代码写好了,直接通过Node软件解析运行即可 Node.js是JavaScript运行环境,可以解析JS代码
- 能干嘛?
作用:让Javascript成为与PHP,python平起平坐的语言 前端脱离后端,直接通过JS写项目(接口、爬虫、桌面应用)
node.js的相关基础知识点
1.命令行窗口:
cmd、shell、dos窗口
- 常用指令:
dir:列出当前目录下的所有文件
cd+目录名:进入指定的目录
md+目录名:创建文件夹
rd+目录名:删除文件夹
-
目录: . 表示当前目录 .. 表示上一级目录
-
环境变量(windows系统中的变量)
当我们用命令行窗口打开一个文件,或调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到了则直接打开,如果没有则依次到环境变量path的路径中寻找,直到找到为止
2.进程和线程
进程
-进程负责为程序的运行提供必备的环境
-进程相当于工厂中的车间
线程 -线程是计算中最小的计算单位,线程负责执行进程中的程序
-线程就相当于工厂中的工人
单线程 -JS是单线程的 多线程
3.Node.js简介
nodejs是一个能够在服务器端运行js的跨平台运行环境、单线程
4.模块化
1.在node中,一个js文件就是一个模块,js文件中的所有代码都默认在一个function内执行,可用console.log(arguments.callee+“”)显示出来
2.在node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问
3.如果想向外部暴露,只需要将需要暴露给外部的变量或方法设置为exports的属性即可
4.在node中,通过require()函数来引入外部的模块, require中传递的文件路径并须使用相对路径,使用.或..开头
5.使用require引用模块后,会返回一个对象,该对象代表的是引入的模块
6.node会默认在最顶端加如下代码function (exports, require, module, __filename, __dirname) {,在最底端加 },实际上我们使用的exports和require都是node为我们传递进来的实参,filename表示当前模块的完整路径,dirname表示所在文件夹的完整路径
7.可使用module.exports = { }进行批量暴露
exports只能使用.的方式来向外暴露内部变量,module可以直接赋值
5.模块标
1)核心模块
由node引擎提供的模块
核心模块的标识就是模块的名字,不用写路径,直接写名字
2)文件模块
由用户自己创建的模块
文件模块的标识就是文件的路径(相对路径或绝对路径)
6.CommonJs的包规范由包结构和包描述文件
package.json是最主要的成分,相当于包的简介
json文件中不能写注释
7.NPM(Node Package Manager)
NPM就是package包管理规范,NPM帮助node完成第三方模块的发布、安装和依赖,通过npm下载的包都放在node_modules文件夹中,直接通过包名引入即可
1)npm -v 查看npm版本
2)npm version 查看所有模块的版本
3)npm search 包名 搜索名
4)npm install / i 包名 安装包,同时下载当前项目所依赖的包
5)npm remove / r 包名 删除包
6)npm install 包名 --save 安装包并添加到依赖中
7)npm install 包名 --g 全局安装包(一般都是一些工具,计算机使用的,不是项目使用的)
8.npm引入模块规则
1)首先会在当前目录的node_modules中寻找该模块
2)如果有则直接引用,如果没有则去上一级目录的node_modules中寻找
3)一直往上,直到找到磁盘的根目录,如果依然没有则报错
9.Buffer(缓冲区)
1)Buffer的结构和数组很像,操作的方法也和数组类似
2)数组中不能存储二进制的文件,而buffer就是专门用来存储二进制数据
3)使用buffer不需要引入模块,直接使用即可
4)在buffer中存储的都是二进制数据,而计算机显示时都是以16进制的形式显示,但打印数字时,控制台只显示10进制,非数字的则可以通过toString(进制数)进行输出
5)Buffer中每一个元素的范围是从00 - ff,buffer.length返回的是占用内存的大小
6)new Buffer(数字)创建指定大小(字节)的Buffer对象,但是已经被废弃了
7)Buffer.alloc(数字) 为常用的创建方法,通过索引来操作buf的元素,Buffer.allocUnsafe(size)创建的Buffer不清除之前的内存数据,可能存在敏感数据
8)Buffer的大小一旦确定,则不能修改,扩充会导致内存不连续,不利于性能维护
9)Buffer中存储的数据,如果大小越界,则取二进制的后8位
10)buf.toString() 将缓冲区中的数据转换为字符串
node.js与JavaScript的区别
- 基于异步I/O相关接口
- 基于node_modules和require的模块依赖
- 提供C++ addon API与系统交互
特性
- 事件驱动
- 单线程/异步/非阻塞
- npm
二、Node.js语法
数据类型
原始数据类型 Number
String
Boolean
Null```
Undefined
Symbol
引用数据类型
Object
Array
Function
Map
Set
...
2.对象
let obj ={
a:1,
b:{
c:"hello",
d:true
}
};
console.log(obj.b.c);
let arr=[1,2,3];
console.log(arr.length);
console.log(arr.map(v => v*2));
typeof arr;
3.变量定义
- var 可以重复定义
- let 只允许定义一次
- const 不可重新赋值
使用变量 需要$进行包裹
4.异步
setTimeout(function(){
console.log('world');
},1000);
console.log('hello');
setTimeout(() => {
console.log(1);
setTimeout(() => {
console.log(2)
}, 1000);
}, 1000);
使用这种方式需要回调,所以考虑下面promise的方式
const promise1=new Promise(function(resolve,reject){
setTimeout(function(){resolve('foo')},300)
});
promise1.then((value)=>{
console.log(value);
});
console.log(promise1)
const { resolve } = require("promise")
function timeout(time){
return new Promise(function(resolve)
{
setTimeout(resolve,time);
});
}
timeout(1000).then(function(){
console.log(1);
}).then(function(){
timeout(1000);
}).then(function(){
console.log(2);
});
//////////////////////////////////////////////
async function timeout(time)
{
return new Promise(function(resolve){
setTimeout(resolve,time);
});
}
let main = async function() {
await timeout(1000);
console.log(1);
await timeout(1000);
console.log(2);}
main();
Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成 ,又称Fulfilled)和 Rejected(已失败)。
resolve(data)将这个promise标记为resolved,然后进行下一步then((data)=>{//do something}),resolve里的参数就是传入then的数据
执行到 resolve()这个方法的时候,就改变promise的状态为resolved,当状态为 resolved的时候就可以执行.then()
当执行到 reject() 这个方法的时候,就改变 promise的状态为 reject,当promise为reject就可以.catch()这个promise了
这两个方法可以带上参数,用于.then()或者 .catch() 中使用。他们的作用就是 用于改变promise的状态,因为状态改变了,所以才可以执行相应的.then()和 .catch()操作。
5 函数
一般表达方式
function say(word) {
console.log(word);
}
function execute(someFunction, value) {
someFunction(value);
}
execute(say, "Hello");
匿名表达方式
function execute(someFunction, value) {
someFunction(value);
}
execute(function(word){ console.log(word) }, "Hello");
HTTP例子
var http = require("http");
http.createServer(function(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}).listen(8888);
原型
var http = require("http");
function onRequest(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
http.createServer(onRequest).listen(8888);
三、模块和npm
1.HTTP服务
var http = require("http");
function onRequest(request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
response.end();
}
http.createServer(onRequest).listen(8888);
console.log('服务器运行中....')
2.模块
- 内置模块:编译进Node中,例如http fs net process path等
- 文件模块:原生模块之外的模块,和文件夹一一对应
自定义模块
const pi=Math.PI;
exports.area=function(r){
return pi*r*r;
};
exports.circumference=function(r){
return 2*pi*r;
};