居安思危,思则有备,有备无患。 —— 《左传·襄公十一年》
NodeJS和JS
一、概念
JavaScript是一门动态脚本语言,可以运行于宿主环境(如浏览器等包含Js引擎的环境)。浏览器通过内置一个Js引擎可以解释执行Js代码,浏览器实现Js标准规范(ECMAScript),提供API(DOM和BOM),可以使用JavaScript调用,支持操作页面DOM,调用某些浏览器操作等客户端功能,可以说JavaScript = ECMAScript + DOM + 宿主环境(BOM)
。
Node.js是一个基于Google V8引擎(Js引擎的某一种)构建的JavaScript运行环境,提供API(操作系统、文件系统、网络系统、数据库等),可以使用JavaScript调用,支持读取本地文件,开启本地主机端口服务,发送/接受请求等服务端功能,可以说Node.js = JavaScript + Node环境
。
要执行JavaScript代码必须要有一个Js引擎,而浏览器和Nodejs环境都内置了Js引擎。所以如果Js代码中调用了浏览器提供的API,则必须安装一个浏览器;若调用了Nodejs提供的API,则必须安装nodejs环境,然后以各自规定的方式加载、执行JavaScript代码。
前端JS是基于浏览器端的JavaScript,Node.js则一个是基于服务端的javascript(后端NodeJs)。
二、对比
- JavaScript是一门编程语言(脚本语言),而Node.js是一个运行环境。
- JavaScript以前是在浏览器里执行的,需要浏览器里的JavaScript引擎,Firefox有叫做Spidermonkey的引擎,Safari有JavaScriptCore的引擎,Chrome有V8的引擎,现在有人把Chrome有V8的引擎的引擎拿出来做了包装,加入了内置基本模块(大多用JavaScript编写),就构成了Node.js。
- Node.js可以说是JavaScript的一种独立于浏览器的运行环境。
- 两者侧重点也不太一样:
- JavaScript
- DOM(一些操作页面元素的方法)
- BOM(一些操作浏览器的方法)
- Node.js
- OS(操作系统)
- file(文件系统)
- net(网络系统)
- database(数据库)
- JavaScript
三、参考
修改npm镜像
一、概念
定义:npm全称为Node Package Manager,是一个基于Node.js的包管理器,也是整个Node.js社区最流行、支持的第三方模块最多的包管理器,它的初衷是为了让JavaScript开发人员更容易分享和重用代码。
常见使用场景:
- 获取第三方包并使用。
- 将自己编写的包发布。
常用命令
- 安装
npm install [<name><version>][-g]/[--save][-dev]
- 卸载
npm uninstall [<name><version>][-g]/[--save][-dev]
- 更新
npm update [<name><version>][-g]/[--save][-dev]
- 搜索
npm search [<name><version>][-g]/[--save][-dev]
- 查看安装模块
npm list/ls/la/ll [-g]
- 查看模块路径
npm root [-g]
- 查看模块信息
npm view <name> [package.json属性名称]
- 查看官方文档
npm docs <name>
- 安装
二、修改镜像
- 常见镜像
- 使用
- 临时使用
npm --registry https://registry.npm.taobao.org install <name>
- 持久使用
- 配置源
npm config set registry https://registry.npm.taobao.org
- 查看源
npm config get registry
或npm info express
- 配置源
- 通过
cnpm
使用 - 安装cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
- 使用cnpm和使用npm命令一样,正常操作就行了
- 临时使用
三、参考
Node运行机制
一、事件循环
众所周知,JS从诞生之日起就是一门单线程的非阻塞的脚本语言。单线程是由其最初的用途来决定的——与浏览器交互,JS代码在执行的任何时候都只有一个主线程来处理所有的任务。非阻塞则是当代码需要进行一项异步任务的时候(如I/O事件,无法立刻返回结果,需要花一定时间才能返回),主线程会挂起(pending)这个任务,然后在异步任务返回结果的时候再根据一定规则去执行相应的回调。要实现非阻塞,就要说到我们的主角——事件循环。
JavaScript引擎本身不实现事件循环机制,浏览器中的事件循环由浏览器实现的,NodeJS中事件循环主要是由底层Libuv库实现的。
二、I/O多路复用
- select
- poll
- epoll(kqueue/iocp)
三、参考
Mac下nvm安装使用
一、概念
nvm是node版本管理工具,为了解决node各种版本存在不兼容现象,nvm是让你在同一台机器上安装和切换不同版本的node的工具。
二、安装使用
安装
brew install nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
配置,正常安装完后会有相应提示,如
1 | Please note that upstream has asked us to make explicit managing |
source .bash_profile
- 查看nvm版本
nvm --version
- 安装node指定版本
nvm install 版本号
- 查看本地node的所有版本
nvm list
- 切到指定node版本
nvm use 版本号
- 卸载指定的node版本
nvm uninstall 版本号
- 安装最新的node稳定版本
nvm install --lts
- 查看node的所有的版本
nvm ls-remote
- 使用node指定版本执行指定文件
nvm exec 版本号 node 要执行的文件路径
- 设置默认版本的Node,每次启动终端都使用该版本的node
nvm alias default 版本号
三、参考
Node操作MongoDB
一、准备阶段
- 安装node
- 安装MongoDB
二、开始(Mac)
进入主目录
cd ~
创建node项目目录
mkdir node
安装依赖
npm install mongodb
开撸
- 创建文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/';
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true}, function (err, con) {
if (err) {
throw err;
}
var db = con.db("mydb");
db.createCollection('student', function (err, res) {
if (err) {
throw err;
}
console.log("Create dbs and collections success !");
con.close();
});
});- 插入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, {useUnifiedTopology: true, useNewUrlParser: true}, function (err, con) {
if (err) {
console.log("Connect error");
}
var db = con.db('mydb');
var obj = {"name" : "张三", "age" : 12};
db.collection("student").insertOne(obj, function (err, res) {
if (err) {
console.log("InsertOne fail");
}
// console.log(res);
console.log("InsertOne success");
con.close();
});
var obj = [
{"name" : "张三", "age" : 12},
{"name" : "李四", "age" : 13},
{"name" : "王五", "age" : 14},
];
db.collection("student").insertMany(obj, function (err, res) {
if (err) {
console.log("InsertMany fail");
}
// console.log(res);
console.log("InsertMany success");
con.close();
});
})- 查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, con) {
if (err) {
console.log("Connect error");
}
var db = con.db("mydb");
var filter = {"name":"张三"}; // 查询条件
var fields = {age: 0}; // 过滤字段
// db.collection("student").find(filter).project(fields).toArray(function (err, result) {
db.collection("student").find(filter, {fields: {name: 1}}).toArray(function (err, result) {
// db.collection("student").find(filter, {projection: {age:0}}).toArray(function (err, result) {
// db.collection("student").find(filter, fields).toArray(function (err, result) { // 不起作用
if (err) {
throw err;
}
console.log(result);
con.close();
});
});- 更新
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, con) {
if (err) {
console.log("Connect error");
}
var db = con.db("mydb");
var filter = {"name":"张三"};
var replace = {$set: {"name":"张五"}};
db.collection("student").updateOne(filter, replace, function(err, res) {
if (err) {
throw err;
}
console.log("Update one success");
con.close();
});
var filter = {"name":"张三"};
var replace = {$set: {"name":"张五"}};
db.collection("student").updateMany(filter, replace, function(err, res) {
if (err) {
throw err;
}
console.log("Update many success");
con.close();
});
});
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, con) {
if (err) {
throw err;
}
var db = con.db("mydb");
var filter = {name: "李四"}; // 查询条件
var replace = {$set: {name: "张三"}}; // 替换
db.collection("student").replaceOne(filter, replace, function(err, res) {
if (err) {
throw err;
}
console.log(res.result.n + "条被替换");
con.close();
});
});- 删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, con) {
if (err) {
throw err;
}
var db = con.db("mydb");
var filter = {name: "张五" }; // 查询条件
db.collection("student").deleteMany(filter, function (err, res) {
if (err) {
throw err;
}
console.log(res.result.n + " 条文档被删除");
con.close();
});
});三、参考