Node.js

Node是什么

Node.js是一个基于V8引擎运行环境。

- v8引擎:JS的渲染器

Node.js是一个服务器平台。

Node.js底层使用C++编写的。

Node.js是安装在操作系统上的一个程序,这个程序的工作的时候是跟操作系统在对话。(交互)

Node执行js的方式

在Node.js中,运行js代码的方式有两种

  • 直接运行js文件:node app.js
  • 使用REPL模式运行js代码
    • R:Read读取js代码
    • E: Execute执行JS代码
    • P:Print打印js代码
    • L: Loop 循环js代码

NodeJS VS 浏览器

Node和浏览器都是运行js的环境

Node.js 浏览器
语法相同 支持ECMAScript 支持ECMAScript
API不同 Global、module、buffer、domain等 BOM、DOM
老大不同 Global window
交互对象 在node.js运行js,是和操作系统对话 在浏览器中运行js,,是和浏览器对话

module API是什么

  • module是一个内置的全局对象。

  • module用于表示模块。

  • 模块:模块就是封装在一个js文件中的代码块。(在Node的模块系统中,每一个js文件都是一个模块)

    const sum = (a,b) => {
        return a + b
    }
    const minus = (a,b) => {
        return a - b
    }
    
  • module对象

> module
Module {
  id: '<repl>',
  path: '.',
  exports: {},
  filename: null,
  loaded: false,
  children: [],
  paths: [
    '/Users/zj/Desktop/7/0327/repl/node_modules',
    '/Users/zj/Desktop/7/0327/node_modules',
    '/Users/zj/Desktop/7/node_modules',
    '/Users/zj/Desktop/node_modules',
    '/Users/zj/node_modules',
    '/Users/node_modules',
    '/node_modules',
    '/Users/zj/.node_modules',
    '/Users/zj/.node_libraries',
    '/usr/local/lib/node'
  ]
}

NodeJS中的module系统分为几种?

模块系统的背景

  • JS缺点1:没有模块

  • JS缺点2:存在命名冲突(set map 模块)

    <head>
      <script src='./jquery.js'></script>
      <script scr='./tquery.js'></script>
      <script scr='./script.js'></script>
    </head>
    
  • CommonJS : 面向服务器 通过Require()

  • RequireJS: 基于CommonJS的一个包装。

  • AMD: Asynchrouns Module D? :面向浏览器

Node.js的模块系统分为两种

  • CommonJS: Node.js的默认模块系统。采用第三方的模块系统。
  • ECMAScript: 是Node.js的标准模块系统。(向原生语言看齐)

NodeJS中的module分为几种?

  • 本地模块:在项目中,由开发者创建的模块。
  • 内置模块:由Node.js提供的预设模块。
    • 内置模块是全局模块。
    • 内置模块是Node.js的核心模块。
  • 第三方模块: 在项目中,由其他开发者创建的模块。

NPM是什么

  • NPM: Node Package Manager Node软件包管理器
  • NPM就是Node.js平台的商店。

CommonJS模块系统

module对象

定义

  • module对象表示一个模块。
  • 一个JS文件就是一个模块。
  • 模块是封装在js文件中代码块,拥有独立的作用域。
  • module对象是一个全局对象。

module.prototype.require()

定义

require()方法用于加载外部模块。

  • require()是node的一个内置函数。
  • require()在工作的时候,它用于包裹(读取+执行)模块文件中的代码块。

语法

module.require(id)
require(id) //module是全局对象,可省略

Id: 表示加载的模块的文件名

返回值

返回从模块文件中导出的模块

示例


module.exports

定义

module.exports 用于暴露/导出/分享模块。(暴露作用域)

  • module.exports是一个对象。
  • Module.exports 用于包裹要导出的模块。

语法

//语法1:导出单个变量(变量名、函数名、类名)
const sum = (a,b) => {
    return a + b
}
module.exports = sum //单个变量名

//语法2:导出单个直接量
module.exports = (a,b) => {
    return a + b
}

//语法3:导出多个变量
const sum = (a,b) => {
    return a + b
}
const minus = (a,b) => {
    return a - b
}
module.exports = {
    // sum:sum,
    // minus: minus
    sum,
    minus
}

//语法4:导出多个变量
module.exports.sum = (a,b) => {
    return a + b
}
module.exports.minus = (a,b) => {
    return a - b
}

//语法5:导出多个变量
module.exports = {
    sum : (a,b) => {
        return a + b
    },
    minus : (a,b) => {
        return a - b
    }
}
//语法6:导出多个变量
const obj = {
    sum : (a,b) => {
        return a + b
    },
    minus : (a,b) => {
        return a - b
    }
}
module.exports = obj

APP1.js

const math = module.require('./lib1')
// const {sum,minus} = math
console.log(math.sum(3,3));
console.log(math.minus(3,3));

// console.log(sumFn(3,3))

http 内置模块

http.createServer()

定义:用于创建node服务器

  • 创建服务端和客户端通信的方式
  • res对象:使用响应对象设置响应头
    • 响应头:用于通知浏览器:
      • 状态码
      • 数据类型是什么
      • 数据
      • 其他参数
  • req对象:使用请求对象解析请求头
    • 请求头:包含了请求的具体信息
    • 请求方法:get post put delete
    • 请求数据
    • 请求的地址
    • 浏览器信息
    • 等其他信息

语法

http.createServer((req,res)=>{
    //1.解析请求
    
    //2.处理响应
})

返回值

示例

res.weiteHead()

定义:用于设置响应头信息

语法

返回值

示例

res.end()

定义:用于通知客户端响应结束。结束的时候可以携带一些数据

语法

返回值

示例

server.listen()

定义:用于设置服务器的监听端口

语法

返回值

示例

Node监听

定义:Node监听就是在不重启服务器的情况下,自动刷新页面

语法:

node --watch 文件地址

示例:

node --watch './app/index.js'

Content-Type

定义:Content-Type用于指定响应头的数据类型

语法:

{"Content-Type":属性值}

属性值:

  • text/plain:普通文本
  • text/html:HTML文本
  • application/json:JSON文本

全局变量

__dirname

定义:表示当前文件(模块)所在的目录名称

  • Dir:文件夹、目录
  • name:名字

语法:

console.log(__dirname)//全局直接调用

示例:

console.log(__dirname);
//D:\web前端\2023第二期\三月\0329

绝对路径 VS 相对路径

# 绝对路径
\Users\zj\Desktop\7\0329
\zj\Desktop\7\0329
\Desktop\7\0329
# 相对路径有三种
images/aaa.jpg
./images/aaa.jpg
../images/aaa.jpg

__filename

定义:表示当前文件(模块)的名称

  • file:文件
  • name:名字

示例:

console.log(__filename);
//D:\web前端\2023第二期\三月\0329\1.giobai.js

内置模块path

定义:node:path是一个内置模块,它提供了处理路径的API。路径分为:

  • 文件路径
  • 文件夹路径

使用path模块,第一步要做什么?

path.basename()

定义:

语法:

path.basename('路径','删除的后缀名')

返回值:返回路径最后一部分

示例:

const path = require('node:path')
console.log(__filename);
console.log(path.basename(__filename));
console.log(path.basename(__filename,'.js'));
console.log(path.basename(__dirname));

输出结果:

D:\web前端\2023第二期\三月\0329\2-path.js
2-path.js
2-path
0]\]]

path.dirname(path)

定义:用于返回当前目录的路径

语法:

path.dirname('path')

返回值:

示例:

const path = require('node:path')
console.log(__dirname)
console.log(path.dirname(__dirname));

输出结果

D:\web前端\2023第二期\三月\0329
D:\web前端\2023第二期\三月

path.extname(path)

定义:返回的是当前文件的扩展名

语法:


返回值:

path.parse()

定义:从路径字符串返回一个对象

语法:

path.parse('路径')

返回值:返回一个表示路径的对象

示例:

const path = require('node:path')
console.log(__filename)
console.log(path.parse(__filename));

输出结果:

D:\web前端\2023第二期\三月\0329\2-path.js
{
  root: 'D:\\',
  dir: 'D:\\web前端\\2023第二期\\三月\\0329',
  base: '2-path.js',
  ext: '.js',
  name: '2-path'
}

path.format()

定义:从路径对象转路径字符串

语法

path.format(路径对象)

返回值:返回路径字符串

示例

const path = require('node:path')
console.log(__filename)
console.log(path.parse(__filename));
const obj = path.parse(__filename)
console.log(path.format(obj));

输出结果

D:\web前端\2023第二期\三月\0329\2-path.js
{
  root: 'D:\\',
  dir: 'D:\\web前端\\2023第二期\\三月\\0329',
  base: '2-path.js',
  ext: '.js',
  name: '2-path'
}
D:\web前端\2023第二期\三月\0329\2-path.js

path.join()

定义:用于把路径片段连接为规范路径

语法:

path.join()
path.join('路径片段1','路径片段2',...)

返回值:

示例

const path = require('node:path')
const p1 = path.join('fold1', 'folder2', 'index.html')
console.log(p1);
const p2 = path.join('/fold1', 'folder2', 'index.html')
console.log(p2);
const p3 = path.join('/fold1', '/folder2', 'index.html')
console.log(p3);
const p4 = path.join('/fold1', '//folder2', 'index.html')
console.log(p4);
const p5 = path.join('/fold1', '//folder2', './index.html')
console.log(p5);
const p6 = path.join('/fold1', '//folder2', '../index.html')
console.log(p6);

输出结果

fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\folder2\index.html
\fold1\index.html

path.isAbsolute()

定义:用于检测一个路径是否是绝对路径

语法

path.isAbsolute(path)

返回值:返回布尔值;true或false

示例

console.log(path.isAbsolute(__filename));
//true

path.resolve()

定义:用于解析绝对路径

语法:

path.resolve([...paths])//路径片段

返回值:返回绝对路径字符串

示例:

const p1 = path.resolve('fold1', 'folder2', 'index.html')
console.log(p1);
const p2 = path.resolve('/fold1', 'folder2', 'index.html')
console.log(p2);
const p3 = path.resolve('/fold1', '/folder2', 'index.html')
console.log(p3);
const p4 = path.resolve('/fold1', '//folder2', 'index.html')
console.log(p4);
const p5 = path.resolve('/fold1', '//folder2', './index.html')
console.log(p5);
const p6 = path.resolve('/fold1', '//folder2', '../index.html')
console.log(p6);

输出结果

D:\web前端\2023第二期\三月\0329\fold1\folder2\index.html
D:\fold1\folder2\index.html
D:\folder2\index.html
D:\folder2\index.html
D:\folder2\index.html
D:\index.html

FS模块(FS系统)

定义:FS文件系统模块允许操作计算机系统上的文件。

具体操作如下:
  • 读取
  • 创建
  • 修改
  • 删除

引入FS文件系统

要使用fs文件系统,请先引入fs模块

语法:基于Promise API(标准)

语法:基于回调函数(默认)

const fs = require('node:fs')

fs.readFile()

定义:用于异步读取文件内容

语法:

fs.readFile('文件路径','callback')
fs.readFile('文件路径','err,data') => {
    if(err) console.log(err)
    console.log(data)
}

返回值:返回读取成功的内容

数据类型:buffer

示例:

fs.writeFile

定义:用于异步的写入文件数据

语法:

fs.writeFile(file, data[, options], callback)

返回值:

示例:

npm

定义:Node软件包管理工具

  • npm的主要内容
    • 安装软件包
    • 删除软件包
    • 分享你自己写的软件包(npmjs.com)
  • npm是世界上最大软件包平台
  • npm的构成:
    • 官网(http://npmjs.com):查询软件包
    • CLI(Command Line Interface):命令行交互工具
    • 软件注册表:JS软件包的仓库

node_modules

  • 用于存储第三方模块的文件

package是什么

  • 意思:软件包
  • 一个package由一个或多个模块组成

package.json

  • 用于描述你的模块文件
  • 用于配置你的模块文件
  • package.json描述如何使用软件包
  • 一个package(软件包)必须包含一个package.json文件。

创建方法:

  • 手动创建
  • 半自动:npm init命令创建
  • 自动:npm init - yes命令创建

node_modules

  • 用于存储第三方模块的文件
  • 打包项目发给别人之前,可删除node_modules文件夹,以减少文件体积
  • 注意:package.json 和 package-lock.json不能删
  • 可使用npm install重新安装模块

module

  • 模块就是一个js文件或文件夹
  • 所有的模块必须拥有package.json文件

第三方模块的使用方法

第一步:创建文件夹

mkdir buhaoqi-package  

第二步:创建index.js

cd buhaoqi-package
New-item index.js

第三步:安装upper-case模块

npm install upper-case

第四步:修改index.js内容

const upperCase = require('upper-case').upperCase
function hello(name){
    console.log(upperCase(`hello ${name},good good study!`));
}
hello('zhangsan')
module.exports = hello

第五步:运行index.js

node index

输出结果

HELLO ZHANGSAN,GOOD GOOD STUDY!

版本号

npm采用的是Sementic Version Controls系统

语法

X.Y.Z

1.1.3
初始版本号一般默认:0.1.0
正式发布:1.0.0

X : Major Version 主版本号:较大变化

Y: Minor Version 副版本号:增加了一个函数

Z: patch Version Bug版本号:修复bug



待续……


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容