1、什么是Node.js?
Node.js三个特点:
缺点:
应用场景:
什么是V8?
目前几乎所有主流浏览器都支持JavaScript,也就意味着他们都有JavaScript引擎,不是只有V8才能执行JavaScript程序
(Firefox:spidermoney;Safari:JavaScriptCore;Chrome:V8等)
浏览器最核心的部分就是浏览器内核,浏览器内核主要包括排版渲染引擎和JavaScript引擎:
① 排版渲染引擎主要负责:对网页语法的解释并渲染(显示)网页,它决定浏览器如何显示网页的内容、页面格式信息等
常见的排版渲染引擎有:
② JavaScript引擎主要负责:编译(或解译)执行JavaScript
常见的JavaScript引擎有:
为什么是选择V8引擎?
2、node.js、浏览器、JavaScript、V8之间的关系?
JavaScript:
①JavaScript是一种“胶水语言”,它让开发者可以使用它来组装图片和插件之类的组件,代码可以直接编写在网页标记中;
它是一种脚本语言,不像C等编译型语言可以在编译之后直接在操作系统上运行,它必须依赖JavaScript引擎来运行。
②刚开始JavaScript运行在浏览器环境中,由浏览器的引擎负责编译或者解译执行(V8是先编译成机器码再执行;其他引擎如Spidermonkey(Mozilla)会逐行解译,然后将解译过的指令暂存);
③后来有了JavaScript作为服务端脚本的概念,JavaScript也可以运行在服务器。注意:Node.js并不是采用“服务端脚本”的首创者,但是它的发布的确让JavaScript作为服务端脚本这一概念声名鹊起。
Node.js与JavaScript的关系:
①JavaScript是一门语言;
②Node.js不是一门语言,更不是JavaScript的一种方言,它是JavaScript在服务器端的的运行环境(JavaScript和Node.js的关系类似于Java和JVM);
③node.js本身用C++实现的,但是它用来运行JavaScript,封装)了大量的用JavaScript编写的内置模块,JavaScript跟node.js这一平台的实现没有关系;
④是Node.js选择了JavaScript,而不是JavaScript发展产生node.js(node.js也可以选用其他语言,不是非要用JavaScript,只不过JavaScript更合适)
浏览器端和服务端JavaScript的组成有何区别:
① 浏览器端的JavaScript实际上包含三部分:
② 服务器端:
引用大神的两段话何一张图解释JS、Web容器、V8之间的关系:
原文请猛戳 >>https://www.cnblogs.com/sniper007/archive/2011/10/27/2226270.html
JavaScript运行环境一般都由宿主环境和执行期环境共同构成。其中宿主环境是由外壳程序生成的,如Web浏览器就是一个外壳程序,它提供了 一个可控制浏览器窗口的宿主环境。执行期环境则由嵌入到外壳程序中的JavaScript引擎(或称为JavaScript解释器)生成,在这个环境中 JavaScript能够生成内置静态对象,初始化执行环境等.
外壳程序不仅仅是Web浏览器,只要能够提供JavaScript引擎执行的环境都可以算做外壳程序。很多服务器、桌面应用系统也都提供能够允许 JavaScript引擎执行的运行环境,这些运行环境也是宿主环境。同时,大部分JavaScript引擎自身也带有一个用于代码调试的程序,这个简单 的程序被运行时,也会创建一个宿主环境。
小结:
web浏览器是构建可以控制浏览器窗口的JavaScript宿主环境的;
V8是chrome浏览器的一种JavaScript引擎,用来执行JavaScript;
Node.js对V8引擎进行了封装,是JavaScript在服务器端的运行平台;
V8是内置于Chrom(web浏览器)中,现在也内置于node.js中
================= ===分隔线 ====================
3、Node相关知识点总结:
1)首先了解一下模块:
它解决了:命名冲突、文件依赖的问题
①定义模块:
node.js采用commonJs模块规范(前端的模块规范有AMD和CMD,ES6也有对应的模块规范),由模块组成,每个js文件都是一个独立的模块,它们拥有自己的作用域,里面的变量、方法等对其他模块不可见。
②模块的导入和导出
在commonJs中,每个模块内部 module变量代表当前模块,这是一个对象,它的exports属性是对外的接口,用module.exports或exports导出向外暴露模块内部成员,加载模块就是加载module.exports属性;加载模块用require方法。
exports与module的关系:
module.exports = exports = {} 两者不能同时使用
导出示例:
//aa.js
var a = 1;
1)用exports导出:
// exports.导出的数据别名 = 要导出的变量名/函数/对象等
exports.m = a; //a为要导出的变量,m为别名,导入模块之后,通过m可以得到a的值
//导出一个函数,别名为fn
exports.fn = function(){
console.log('lllllll');
}//用exports导出,必须要导出别名,否则接收不到数据
exports=a //接收不到数据
2)用module.exports导出
/*module.exports可以导出一个模块,也可以导出多个,module.exports.导出的数据别名 = 要导出的变量名(如果只导出 一个模块(变量/函数/类等),可以省去别名),即匿名导出,但是导出多个必须加上别名,否则只会接受最后一个的值*/
① 导出一个:
示例:
// module.exports=a; //匿名导出变量a
module.exports.fn=function(){
console.log('hello')
}导入:require('./aa.js'); //从bb.js导入aa.js模块,./代表当前路径
② 导出多个模块
//示例:定义多个需导出的模块
var f1 = function(){
.........
}
var v1 = 3;
var f2 function(){
..........
}
var o1 = {name:"张三"}
..........
//导出方式1:
module.exports.fn1 = fn1;
module.exports.fn2 = fn2;
module.exports.o1 =o1;
module.exports.v1 = v1;
//导出方式2:
module.exports = {
fn1:fn1,
fn2:fn2,
v1:v1,
o1:o1
}
//当k:v中k和v同名时,可以只写k
module.exports = {
fn1,
fn2,
v1,
o1
}
// 导入: var bbb = require('./aa.js')
// 使用模块:console.log(bbb.v1); var ff = bbb.f1();
注意:
var myfile1 = require('./myfile1'); //默认去同级目录内部的myfile1文件夹下寻找index.js作为入口
var myfile2 = require('myfile2'); //去node_modules文件夹内部寻找myfile2 文件夹,把index.js作为入口;如果没有index.js,自动去package.json文件中寻找main的值并将之作为入口文件,如果同级目录下找不到node_modules,会向上寻找,但不会向下寻找
根据参数的不同格式,require命令去不同路径寻找模块文件(如下是阮一峰先生的博客原文)
(1)如果参数字符串以“/”开头,则表示加载的是一个位于绝对路径的模块文件。比如,require('/home/marco/foo.js')将加载/home/marco/foo.js。
(2)如果参数字符串以“./”开头,则表示加载的是一个位于相对路径(跟当前执行脚本的位置相比)的模块文件。比如,require('./circle')将加载当前脚本同一目录的circle.js。
(3)如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。
commonJs特点(引用网友观点):
所有代码都在模块作用域内运行,不会变量污染;
运行时加载,无法在编译的时候的静态优化;
按照模块在在代码中出现的顺序加载模块
浏览器不兼容commonJs
2)npm的介绍:
npm是随node.js一起安装的包管理工具
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用;
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用;
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
常用的npm命令:
① 初始化: npm init -y
② 安装node.js模块: npm install 模块名
eg: npm install/i express [-g全局安装不加则是本地安装]
使用下载的模块时,直接 require('模块名')即可: var express = require('express')
③ 查看所有全局安装的模块: npm list -g
④ 查看某个模块的版本信息 如express:npm list express
⑤ 卸载express模块:npm uninstall express
⑥ 更新express模块: npm update express
⑦ 查找express模块: npm search express
......
菜鸟教程:
3) node.js REPL交互式解释器
进入REPL的方式:
①在命令提示符中输入 node命令进入环境
②直接开始那里搜索找到 node运行命令
退出REPL的方式:
按一次ctrl+c退出当前终端
按两次ctrl+c退出REPL
可以执行以下任务:
4) node.js常用核心模块及其作用:
① path模块,文件路径操作
//node内置模块中,除了global,process和buffer,其他都要自己导入
//从node_modules中导入path模块(内置的),引入模块一般用const
const path = require('path')
var base = path.basename(__dirname);
//获取路径的最后一层地址(当前文件所在的文件夹名)
console.log(base)var base1 = path.basename(__filename,'.js');
//获取当前文件名(不带后缀)
console.log(base1)console.log(path.delimiter);
//获取环境变量的分隔符console.log(process.env.PATH)
//获取环境变量var dir = path.dirname(__dirname);
//获取当前路径的目录(当前文件夹的父级的完整目录,不包括当前文件夹)
console.log(dir);var ext = path.extname(__filename);
//获取当前文件的后缀,可用于判断文件类型
console.log(ext)//把路径字符串转化为对象
var parse = path.parse(__filename);
//把路径对象转化为字符串
var format = path.format(parse);console.log(parse);
console.log(format);//判断是否为绝对路径
var absolute = path.isAbsolute('\\D\try.txt');
console.log(absolute)//拼接/解析路径
var jion = path.join(__dirname,'my/my.txt','..');
console.log(join)//解析路径
var normalize = path.normalize('C:////temp\\\\/\\/\\/foo/bar');
console.log(normalize);//from a to b 的路径 ,相对路径
var relative = path.relative('C:\\orandea\\test\\aaa','C:\\orandea\\buu\\ddd');
console.log(relative);//返回最后一个根路径,如果没有,会拼接当前路径
var resolve = path.resolve('/wwr','/stati_files/png','../gif/images.png');
console.log(resolve);
② fs模块,用于文件操作
const fs=require('fs');
const path=require('path');// 创建目录
fs.mkdir(path.join(__dirname,'folderName'),(err)=>{
if(err) throw err;
//...
})// 删除目录
fs.rmdir(path.join(__dirname,'folderName'),(err)=>{
if(err) throw err;
//...
})// 写(/创建)文件
fs.writeFile(path.join(__dirname,'myfile.html'),str,'utf-8',(err)=>{
if (err) throw err;
//...
})// 删除文件
fs.unlink(path.join(__dirname,'myfile.html'),(err)=>{
if(err) throw err;
//...
})//检测文件状态
fs.stat(__filename,(err,stats)=>{
if(err) throw err;
console.log(stats.isFile()); //是否为一个文件
console.log(stats.isDirectory());//是否为一个目录
})//读目录
fs.readdir(__dirname,'utf-8',(err,files)=>{
if(err) throw err;})
// 读文件
fs.readFile(path.join(__dirname,'09path.js'),'utf-8',(err,data)=>{
// data得到的是buffer
// 第一种:data.toString()
// 第二种:设置编码:'utf-8'
// console.log(data.toString());
console.log('data')
})
③ url模块,URL操作处理
④ http模块,网络操作
⑤ querystring模块,查询字符串处理
⑥ global模块
//在服务器端没有window对象,有global对象
global.console.log('111');console.log(__dirname);
console.log(__filename);var t1 = setInterval(()=>{
console.log('111')
},2000)clearInterval(t1)
var t2 = setTimeout(()=>{
console.log('222')
},1000)
clearTimeout(t2)
⑦ process模块
//arch属性返回一个字符串,该字符串标识编译Node.js二进制文件所用的操作系统CPU体系结构
console.log(process.arch);//返回一个数组,包括node.exe所在的路径、当前文件路径
console.log(process.argv);
5)原生node.js创建http服务器
① 导入http模块
const http = require('http');
② 创建http服务器
let server = http.createServer((req,res)=>{
})③ 监听端口
server.listen(8989)
//也可以指定IP:
//server.listen('8989','172.20.16.101')
6)访问静态资源
./div/数字
模糊匹配
7) get请求和post请求
8)express创建服务器的方法,get,post,访问静态资源
9) websocket
10)cookie,session,storage
待更新。。。
参考文章:
commonJs的运行时加载 https://www.cnblogs.com/jerrypig/p/8145206.html
浅析 Node.js 单线程模型 https://blog.csdn.net/THMAIL/article/details/79025279
node.js的三大特点:https://blog.csdn.net/L1061256268/article/details/80461070
node.js和JavaScript的关系 https://www.cnblogs.com/thinkam/p/8262743.html
node.js和V8的关系 http://www.broadview.com.cn/article/419435
JS引擎-- Chrome V8 引擎入门 https://blog.csdn.net/kangle0228/article/details/82885672
ECMA-262与ECMAScript、JavaScript的联系 https://blog.csdn.net/weixin_36347219/article/details/79850071
浏览器渲染引擎到底做了什么 https://www.jianshu.com/p/281b574ee3f8
【NodeJS】深入理解Node.js基于事件驱动的回调 https://blog.csdn.net/u013451157/article/details/78755708
维基百科 :
Node.js https://wikipedia.dx.gugeeseo.com/baike-Node.js
Javascript https://wikipedia.dx.gugeeseo.com/wiki/Javascript
V8 https://wikipedia.dx.gugeeseo.com/baike-V8_(JavaScript%E5%BC%95%E6%93%8E)