1.node基础

本文介绍了Node.js的起源、V8引擎的作用,强调了Node.js作为JavaScript运行环境的特性,如异步I/O和单线程设计,以及其在I/O密集型应用中的优势。还详细讲解了Node.js的模块分类、安装、运行机制和与浏览器JavaScript的区别。
摘要由CSDN通过智能技术生成

1.node基础

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的演讲,之后node.js逐渐流行于世;
  • Ryan Dahl于2010年加入Joyent公司【IBM旗下的一个公司】,全职负责node.js项目的开发。从此node.js项目已经从个人项目变成一个公司组织下的项目
Node.js是什么

Node不是编程语言,node也不是服务器,也不是数据库, 他就是一个基于Chrome V8引擎的Javascript运行环境
Node是基于Chrome V8引擎的Javascript运行环境,不要再说node是服务器了
为什么node能够进行文件操作?

使用了node中的http模块,Ruan Dahl将js代码翻译为C或者C++语言,实现文件操作,需要借助libuv库

Node.js有什么特点

![外链图片转存失败,源站可能有防盗链机制请添加图片描述

优点
  1. 异步非阻塞的I/O(I/O线程池)
  2. 特别适用于I/O密集型的应用
  3. 事件循环机制
  4. 单线程
  5. 跨平台

对于node来说,异步非阻塞;服务器直接把数据甩给数据库了,这个用户名,这个人要注册一个账号,你给他写好,写好之后告诉我一声,这就叫做异步;写完之后会告诉咱们是否写好了,那告诉的这个过程,就是回调函数;这就是异步非阻塞的IO

缺点
  1. 回调函数嵌套太多,太深(俗称回调地狱)
  2. 单线程,处理不好CPU密集型任务

Node特别适合IO密集型应用;Java适合CPU密集型应用;
IO指的是input和output,在服务器端就指的是数据库的操作,那就是说node适用于数据库密集型的操作;
总结:node特别适用于频繁操作数据库的应用
IO密集型和CPU密集型的程序

总结

Node.js是什么
node.js不是一门语言
Nodejs不是库,不是框架
nodejs是一个javascript的运行环境
简单点来说就是node.js可以解析和执行js代码
以前只有浏览器可以解析和执行js代码
也就是说现在js可以完全脱离浏览器来运行,一切都要归功于nodejs

node常用linux命令

ls显示当前文件夹下的所有文件详情;windows下用dir
cd进入某个文件夹
cd /? //获取使用帮助
cd c: 进入c盘
cd …/ 返回上级目录
del 删除某个文件(window)/rm(mac)
ping 返回ip相关信息
ipconfig 查看自己的ip
cls清屏windows / clear mac
vim文件名,编辑某个文件
i编辑
:wq 保存退出

node.js的安装

一键式傻瓜安装

下载地址
https://nodejs.org/en/ 英文版
https://nodejs.org/zh-cn/ 中文版请添加图片描述

查看是否安装成功

node -vnode --version // 查看node是否安装成功
npm -v // 查看npm是否安装成功
where node  window查看路径
which node  mac查看路径

通过node解析执行js

  1. 创建便携javascript脚本文件
  2. 打开终端,定位到脚本文件所属目录
  3. 输入 node 文件名执行对应的文件
  4. nodejs的后缀名为js

注意:文件名不要使用node.js来命名,其他都可以,这样并不会执行文件,反而会打开文件;最好也不要使用中文;

运行js代码
  1. 使用win + r / shift + r 直接打开cmd进入文件夹,通过npm 文件名运行js文件
    cd 进入某个文件夹
    dir windows下显示目录
    cd …/ 返回上级目录
    E:进入E盘
    清屏 cls windows/clear Mac
  2. 找到文件所在位置,在地址栏中输入 cmd
  3. 找到需要运行的文件的所在位置,右键使用git bash here打开控制台,跟cmd是一样的
  4. 快捷运行方式:安装插件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文件

导出单个自定义模块

exports.导出名称 = uname; // 可以导出变量,函数等类型

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 将内部的值, 共享给外界

// 集体导出[只能导出变量]
module.exports = {uname,add};

注意:

  • 引入文件的时候,.js后缀名可以省略,默认找的就是.js,执行是没有问题的;
  • 引入自定义模块的相对路径中的 ./不能省略,如果省略,系统就把它识别为系统模块了
  • 只有被导出的模块才能在其他文件中使用,这个被称为模块作用于
  • 在node中没有全局作用域,所有的一切都是模块,所有内容只在当前文件有效,文件之间要想进行通讯,通过exports进行导出,用require进行加载;

模块和模块之间,默认情况下是互不来往的,可以加载文件,但是在不暴露的情况下是没有办法访问里面的成员的;
有时候加载文件模块的目的,不是为了简单的执行里面的代码;
更重要的是为了使用里面的某个成员或者方法;

导入自定义模块
// 获取所有导入数据
let two = require('./two'); //相对路径,常用
let two = require('../two'); //相对路径,常用
let two = require('/two');  //根目录,不常用
let two = require('c:/a/two'); //根目录,不常用

// 使用解构赋值形式获取所有导入数据
let {uname,age,sum} = require('./two.js');

导入模块时,路径必须添加 ./或者…/

// 引入自定义模块的方式
require('b'); // 不可以

require('./b.js'); // 可以

require('./b'); // 推荐:可以省略后缀名
案例:使用自定义模块模拟实现系统的fs模块
exports.readFile=function(path,callback){
    console.log('文件路径:'+path);
}

其实在底层fs模块的底层就可以这样写,咱们使用的时候,直接调用就行了;

var fs=require('fs');
fs.readFile('./a.js',function(err,data){
  if(err){
      console.log('获取文件失败');
  }else{
       console.log(data.toString());
  }
})

第三方模块

明天单独讲

解析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值,不会再次执行该模块代码。

请添加图片描述
请添加图片描述

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值