Node.js诞生史
Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型, 让JavaScript 运行在服务端的开发平台
V8引擎执行Javascript的速度非常快,性能非常好,基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用
- Node.js之父,Ryan Dahl(瑞安.达尔)
- 并非科班出身的开发者,在2004年在纽约的罗彻斯特大学数学系读博士
- 2008年Google公司Chrome V8引擎横空出世,Javascript脚本语言的执行效率得到质的提升
- 2008年的2月,按新的想法他提交了项目的第一行代码,这个项目的名字最终被定名为“node”
- 2009年5月,正式向外界宣布他做的这个项目
- 2009年度,Ruan Dahl在柏林举行了JSConf EU(js峰会)会议上发布了关于 Node.js的演讲,之后nide.js逐渐流行于世;
- Ryan Dahl于2010年加入Joyent公司【IBM旗下的一个公司】,全职负责node.js项目的开发。从此node.js项目已经从个人项目变成一个公司组织下的项目
Node.js是什么
Node不是编程语言,node也不是服务器,也不是数据库, 他就是一个基于Chrome V8引擎的Javascript运行环境
Node是基于Chrome V8引擎的Javascript运行环境,不要再说node是服务器了
为什么node能够进行文件操作?
Node.js有什么特点
优点
-
异步非阻塞的I/O(I/O线程池)
-
特别适用于I/O密集型的应用
-
事件循环机制
-
单线程
-
跨平台
缺点
- 回调函数嵌套太多,太深(俗称毁掉地狱)
- 单线程,处理不好CPU密集型任务
Node特别适合IO密集型应用;Java适合CPU密集型应用;
IO指的是input和output,在服务器端就指的是数据库的操作,那就是说node适用于数据库密集型的操作;
总结:node特别适用于频繁操作数据库的应用
IO密集型和CPU密集型的程序
总结
node常用linux命令
node.js的安装
一键式傻瓜安装
下载地址
https://nodejs.org/en/ 英文版
https://nodejs.org/zh-cn/ 中文版
查看是否安装成功
node -v
node --version
where node window查看路径
which node mac查看路径
通过node解析执行js
- 创建便携javascript脚本文件
- 打开终端,定位到脚本文件所属目录
- 输入 node 文件名执行对应的文件
- nodejs的后缀名为js
快捷运行方式:安装插件Code Runner,安装成功之后,直接右键执行
node没有dom和bom
node中并没有页面,所以不存在bom和dom
// node不支持window对象
console.log(window); // window is not defined
在node中,采用ECMaScript进行编码,没有bom和dom,和浏览器中的javascript不一样
模块的分类
- 核心(系统/内置)模块
- 用户自定义模块
- 第三方模块
核心模块有:http,fs,path,os,system
核心模块
核心模块有:http,fs,path,os,system;
特点:直接使用,无须下载
他有自己的js文件,只不过被隐藏了
let fs=require('fs'); // 内置模块fs文件操作
let os=require('os');
// 获取当前汲取的CPU信息
console.log(os.cpus());
// memory 内存
console.log(os.totalmem());
// TB GB MB KB Byte bit
let path=require('path');
// extension name 扩展名 获取扩展名
console.log(path.extname('c:/a/b/c/index.html'));
用户自定义模块
自定义模块:自己创建的js文件
使用时,路径必须添加 ./或者…/
// 引入自定义模块的方式
require('b'); // 不可以
require('./b.js'); // 可以
require('./b'); // 推荐:可以省略后缀名
倒入自定义模块
let two = require('./two'); //相对路径,常用
let two = require('../two'); //相对路径,常用
let two = require('/two'); //根目录,不常用
let two = require('c:/a/two'); //根目录,不常用
导出单个自定义模块
let uname = 'jack';
function add(a,b){
return a+b
}
exports.uname = uname;
exports.add = add;
exports.age = 18;
exports.age = {
uname:uname,
add:add,
age:age
}
集体导出
// 集体导出[只能导出变量]
module.exports = {uname,add};
模块和模块之间,默认情况下是互不来往的,可以加载文件,但是在不暴露的情况下是没有办法访问里面的成员的;
有时候加载文件模块的目的,不是为了简单的执行里面的代码;
更重要的是为了使用里面的某个成员或者方法;
解析fs文件操作
fs和http其实就是一个内部js文件,然后在文件的内部有自己的一些成员,咱们在这里只需要引用就可以了;
但是不管是核心模块还是自定义模块 他的使用规则都是一样的; 只不过自定义模块能看到里面的内容,核心模块看不到;
https://github.com/nodejs 查看node源码;核心模块和自定义模块的本质是一样的,都是由各个js文件构成的;
nodejs的require 方法的加载规则
不会重复输出!!!!
可以看出:main去加载a.js,然后a在去加载b.js过程中,并没有打印两次 a.js被加载,Node会直接从require.cache中根据传入的id,取出该对象的exports值,不会再次执行该模块代码。