nodejs

223 阅读13分钟

0329明日日考__dirname__filename内置模块 path1.path.basename()2.path.dirname(path)3.path.extname(path)4.path.parse()5.path.format()6.path.join7.path.isAbsolute8.path.resolve()FS模块(FS系统)引入FS模块系统fs.readFile()fs.writeFile()npm是什么package是什么package.json是什么node_modulesmodule第三方模块的使用方法版本号项目介绍http内置模块http.createServer()res.writeHead()res.end()server.listen()Node监听Conten-Type写服务器的步骤0327知识点命令行使用技巧cd命令pwdlsmkdirrmclear清屏new-itemNode.jsNode是什么Node执行js的方式NodeJS VS 浏览器module API是什么 module对象NodeJS中的module系统分为几种?模块系统的背景NodeJS中的module分为几种?NPM是什么CommonJS模块系统module对象module.prototype.require()module.exportsApp1.js

0329

明日日考

  1. __dirname是什么

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

  2. __filename是什么

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

  3. path模块的用途是什么?

    提供了处理路径的API

  4. 如何把一个字符串路径转成对象?

    path.parse()

  5. 如何提取当前Js文件的文件名?

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

    console.log(path.basename(__filename,'.js'));

  6. path.join('/fold1',//folder2',../index.html') 的结果是什么?

    \fold1\index.html

  7. path.resolve('/fold1',/folder2',../hello.html') 的结果是什么?

    当前根目录:\hello.html

  8. 写出读取同级文件data.txt内容的代码 Data.txt

    Hello
    

    index.js

    const fs = require("node:fs")
    const content = fs.readFile('./data.text','utf-8',(err,data)=>{
        if(err){
            console.log(err);
        }else{
            console.log(data)
        }
    })
    //Hello
    
  9. NPM是什么?

    Node软件包管理工具

    • 他拥有至少一个模块
    • 拥有package
  10. package.json 文件的用途是什么?

    用于描述和配置模块文件

  11. 如果说使用第三方模块一共有四步,你认为有哪四步?

第一步:创建文件夹

第二步:创建index.js

第三步:安装upper-case模块

第四步:修改index.js内容,运行index.js

__dirname

定义

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

  • Dir: directory 文件夹、目录
  • Name: 名字

语法

console.log(__dirname);//全局变量

示例

console.log(__dirname);

输出

D:\wxy3\js\作业\2023\2023.3.29

绝对路径 vs 相对路径

#绝对路径
\wxy3\js\作业\2023\2023.3.29
\js\作业\2023\2023.3.29
作业\2023\2023.3.29
#相对路径
./wxy3/js/作业
wxy3/js/作业

__filename

定义

__filename表示当前文件(模块)的名称

  • file: 文件
  • Name: 名字

示例

console.log(__filename)

输出

D:\wxy3\js\作业、课堂\2023\3月\2023.3.29\global.js

内置模块 path

定义

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

  • 文件路径
  • 文件夹路径

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

语法

require("node:path")

示例

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:\wxy3\js\作业、课堂\2023\3月\2023.3.29\path.js
path.js  
path     
2023.3.29

1.path.basename()

定义

语法

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

返回值

返回 path 的最后一部分

示例

console.log(__filename);
console.log(path.basename(__filename));
console.log(path.basename(__filename,'.js'));
console.log(path.basename(__dirname));

输出

D:\wxy3\js\作业、课堂\2023\3月\2023.3.29\path.js
path.js
path
2023.3.29

2.path.dirname(path)

定义

dirname()用于返回当前目录的路径

语法

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

返回值

示例

console.log(__dirname);
console.log(path.dirname(__dirname));

输出

D:\wxy3\js\作业、课堂\2023\3月\2023.3.29
D:\wxy3\js\作业、课堂\2023\3月

3.path.extname(path)

定义

返回的是当前文件的扩展名

语法

返回值

示例

输出

4.path.parse()

定义

parse() 方法:从路径字符串返回一个对象

语法

path.parse('路径')

返回值

返回一个表示路径的对象

示例

console.log(__filename);
console.log(path.parse(__filename));

输出

{
  root: 'D:\',
  dir: 'D:\wxy3\js\作业、课堂\2023\3月\2023.3.29',
  base: 'path.js',
  ext: '.js',
  name: 'path'
}

5.path.format()

定义

format()方法:从路径对象转路径字符串

语法

path.format(路径)

返回值

返回路径字符串

示例

const obj = path.parse(__filename);
console.log(path.format(obj));
输出//D:\wxy3\js\作业、课堂\2023\3月\2023.3.29\path.js

6.path.join

定义

join()方法用于把路径片段连接为规范路径

简言之:连接路径片段

语法

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

返回值

返回一个拼接好的规范的路径

示例

const p = path.join('f1','f2','i.html')
console.log(p);
const p2 = path.join('/f1','f2','i.html')
console.log(p2);
const p3 = path.join('/f1','//f2','i.html')
console.log(p3);
const p4 = path.join('/f1','//f2','./i.html')
console.log(p4);
const p5 = path.join('/f1','//f2','../i.html')
console.log(p5);

示例

f1\f2\i.html
\f1\f2\i.html
\f1\f2\i.html
\f1\f2\i.html
\f1\i.html

7.path.isAbsolute

定义

isAbsolute()方法用于检测一个路径是否是绝对路径。

语法

path.isAbsolute(path)

返回值

返回布尔值true、false

示例

console.log(path.isAbsolute(__filename));//true
console.log(path.isAbsolute('./data.json'));//false

8.path.resolve()

定义

resolve()方法用于解析为绝对路径

语法

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

返回值

返回绝对路径字符串

示例

const p = path.resolve('f1','f2','i.html')
console.log(p);
const p2 = path.resolve('/f1','f2','i.html')
console.log(p2);
const p3 = path.resolve('/f1','//f2','i.html')
console.log(p3);
const p4 = path.resolve('/f1','//f2','./i.html')
console.log(p4);
const p5 = path.resolve('/f1','//f2','../i.html')
console.log(p5);

输出

D:\wxy3\js\作业、课堂\2023\3月\2023.3.29\f1\f2\i.html
D:\f1\f2\i.html
D:\f2\i.html
D:\f2\i.html
D:\i.html

FS模块(FS系统)

定义

FS 文件系统模块允许操作计算机系统上的的文件。具体操作如下:

  • 读取
  • 创建
  • 修改
  • 删除

引入FS模块系统

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

语法:基于promise API(标准)

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

const fs = require("node:fs")

fs.readFile()

定义

readFile()方法用于(异步)读取文件内容。

语法

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

返回值

返回读取成功的内容。

数据类型:buffer

示例

const fs = require("node:fs")
const content = fs.readFile('./data.text','utf-8',(err,data)=>{
    if(err){
        console.log(err);
    }else{
        console.log(data)
    }
})
输出//hello

fs.writeFile()

定义

writeFile() 用于异步的写入文件数据。

语法

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

返回值

示例

const fs = require("node:fs")
​
fs.writeFile('./data.md','hello',(err)=>{
    if(err){
        console.log(err);
    }else{
        console.log('成功')
    }
})
输出//成功

npm是什么

  • NPM 是"Node Package Manager"的缩写,意思:Node软件包管理工具

  • NPM的主要内容

    • 安装软件包
    • 删除软件包
    • 分享你自己写的软件包(npmjs.com)
  • NPM是世界上最大软件包平台。

  • NPM的构成:

    • 官网(npmjs.com): 查询软件包
    • CLI(Command Line Interface):命令行交互工具
    • 软件注册表:JS软件包的仓库

package是什么

  • 意思:软件包
  • 一个package由1个或多个module组成。

package.json是什么

  • 用于描述你的模块文件。

  • 用于配置你的模块文件。

  • package.json描述了如何使用模块文件。

  • 一个pacakge(软件包)必须包含一个package.json文件。

  • package.json文件的创建方法:

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

node_modules

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

module

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

第三方模块的使用方法

第一步:创建文件夹

mkdir my-package  

第二步:创建index.js

cd my-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},welcome to you
    !`));
}
hello('zs')
module.exports = hello

第五步:运行index.js

node index

输出结果

HELLOZS,WELCOME TO YOU!

版本号

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

项目介绍

【问候】:同学们好!老师好!我是xxx。

【项目介绍】

第一部分:介绍项目名称:图库APP

第二部分:效果展示

  1. 导航效果展示:什么时候显示? 什么时候隐藏?

    屏幕变宽的时候显示导航,屏幕变窄的时候隐藏导航

  2. 图片效果展示:无限加载

    1. 第一组图片默认加载20张
    2. 滚动条滑动到底,加载第二组图片
    3. 再次滑动到底,加载第三组图片

第三部分:项目技术介绍

这个项目一共用到了几种技术:

  • 导航菜单使用的boostrap框架实现的。

  • 图片数据使用的免费数据接口

  • 加载图片使用了三种技术

    • AJAX /Fetch API

      • fetch是基于ajax请求
    • 懒加载

      • 懒加载就是按需加载。需要就加载,不需要就不加载,针对多图片的页面,只有当该图片出现在页面视区中,再加载该图片。可以防止页面一次性加载完所有的图片,用户等待时间长,影响用户体验。懒加载主要运用了滚动事件,这时候我遇到了一个问题:滚动的时候它会无限调用。在这里我用了一个开关控制,一组数据加载完就关闭,下一组数据加载时打开
    • 瀑布流(图片排列)

      • 瀑布流是一种流式布局,它把内容分成多个模块从左到右依次排列,这些模块的宽度通常是相同的,但高度却不相同。当第二组内容被添加到页面上时,它会寻找各列之中所有元素高度之和的最小者,并将新的元素添加到该列上,然后继续寻找所有列的各元素之和的最小者,继续添加至该列上,如此循环下去,直至所有元素均能够按要求排列为止

http内置模块

http.createServer()

定义

createServer()用于创建Node服务器

  • 创建

  • res对象:使用响应

    • 响应头:用于通知浏览器

      • 状态码
      • 数据类型是什么
      • 数据
      • 其他参数
  • req对象:使用请求对象解析请求头

    • 请求头:包含了请求的具体信息

      • 请求方法:get post put delete
      • 请求数据
      • 请求的地址
      • 浏览器的信息

语法

http.createServer((请求,响应)=> {})
http.createServer((req,res)=> {
    res.writeHead()
    res.end()
})

返回值

示例

http.createServer((req,res)=>{
// res.writeHead(200)
res.writeHead(200,{"Content-Type":"text/plain"})
// res.end('这是服务器发了的响应结果')
res.end('Server is running on http://127.0.0.1:3000')
})

res.writeHead()

定义

用于设置响应头信息

语法

res.writeHead(200,{"Content-Type":"text/plain"})

参数
参数1:必选,三位数的http状态码
参数2:可选,可有可无
参数3:可选,告诉浏览器我发给你的数据是什么类型的

示例

res.writeHead(200,{"Content-Type":"text/plain"})

res.end()

定义

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

语法

res.end('字符串')

参数
只接受服务器响应数据,如果是中文则会乱码

返回值

示例

res.end('Server is running on http://127.0.0.1:3000')

server.listen()

定义

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

语法

server.listen(port, function(){ // the first argument is *not* a potential error /第一个参数*not*是一个潜在的错误});
参数1:端口号

返回值

  • 该方法除了回调函数外没有其他要返回的内容

示例

server.listen(3000,()=>{
    console.log('服务器已经运行在:http://127.0.0.1:3000');
})

Node监听

定义

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

语法

node --wath 文件地址

示例

node --wath 'index.js'

Conten-Type

定义

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

语法

{"Content-Type": 属性值}

属性值

  • text/plain:返回普通文本
  • text/html:返回html文本
  • application/json:返回json文本

写服务器的步骤

  1. const server = 引入http模块
  2. 用方法createServer创建一个服务器
  3. 服务器监听请求server.listen()
  4. 设置服务器的运行端口号

0327

知识点

  1. 习惯使用搜索打开APP

  2. 5个命令。每人创建一个命令笔记,专门整理命令

  3. 学会使用环境变量(全局变量)

  4. 命令行使用技巧

  5. Node.js中的module是什么?

    是一个内置的全局对象、用于表示模块

  6. NodeJS中的module系统分为几种?

    两种:CommonJS模块系统、ECMAScript模块系统

  7. NodeJS中的module分为几种?

    本地模块、内置模块、第三方模块

命令行使用技巧

  1. 打开命令行

    • 全局打开:搜索框=>输入power
    • 定位文件夹打开:按住shift+右键
  2. 快速补全:输入一个字母+tab键可以补充全名

  3. 快速查询上一条录入:使用上方向键

cd命令

定义

cd命令用于改变目录。cd即:change die

示例

#bash

cd images
#进入当前目录下的images目录
cd ./images
#进入上一级目录下的aaa目录
cd ../aaa
#进入当前硬盘的根目录
cd /
#进入当前用户的根目录
cd ~

pwd

定义

pwd用于显示当前目录

ls

定义

ls用于查看当前目录下的内容(文件和文件夹)

mkdir

定义

用于创建文件夹 “make directory”

示例

#在当前目录下创建一个aaa的文件夹
mkdir aaa
#在当前用户桌面上创建一个bbb文件夹
mkdir ~/desktop/bbb
##在根目录下创建一个ccc的文件夹
mkdir /ccc

rm

定义

用于删除指定的目录或文件 “remove”的缩写

参数

-r 递归删除

-f 强制删除 f:force :强制、暴力、武力

示例

文件目录分两种:空目录和非空目录

- users
    - projectA (删除projectA)
        - index.html
        - css
            - style.css

clear清屏

new-item

创建文件

new-item index.html

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浏览器
语法相同支持ECMAScript支持ECMAScript
API不同Global、module、buffer、domain等BOM、DOM
老大不同Globalwindow
交互对象在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文件中代码块,拥有独立的作用域,Node会把任何一个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')
// math = {sum,minus}
const {sum,minus} = math
console.log(sum(2,3));
console.log(minus(2,3));