diff --git "a/41\351\273\204\351\233\252\350\212\263/\344\275\234\344\270\232\347\273\203\344\271\240/20240229_node\345\210\235\345\247\213\345\214\226\351\241\271\347\233\256.md" "b/41\351\273\204\351\233\252\350\212\263/\344\275\234\344\270\232\347\273\203\344\271\240/20240229_node\345\210\235\345\247\213\345\214\226\351\241\271\347\233\256.md" new file mode 100644 index 0000000000000000000000000000000000000000..299133508fa516cd12e60c8bf60847d806d75d23 --- /dev/null +++ "b/41\351\273\204\351\233\252\350\212\263/\344\275\234\344\270\232\347\273\203\344\271\240/20240229_node\345\210\235\345\247\213\345\214\226\351\241\271\347\233\256.md" @@ -0,0 +1,7 @@ +步骤如下: +~~~html +1.先输入npm init 初始化package.json +2.再输入npm install 来安装所需的依赖包 +~~~ +结果如下: +![node初始化项目-2024-2-2922:30:56.png](https://gitee.com/huangxuefang0929/xiu_img/raw/master/node%E5%88%9D%E5%A7%8B%E5%8C%96%E9%A1%B9%E7%9B%AE-2024-2-2922:30:56.png) \ No newline at end of file diff --git "a/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240229_\345\210\235\345\247\213Nodejs.md" "b/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240229_\345\210\235\345\247\213Nodejs.md" new file mode 100644 index 0000000000000000000000000000000000000000..3b4ab6cdcda08ec2e9ee090320a820ae45517692 --- /dev/null +++ "b/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240229_\345\210\235\345\247\213Nodejs.md" @@ -0,0 +1,68 @@ +### 一、区别npm与nvm +- npm包管理器:用于管理项目中的依赖包 +- nvm命令行应用:用于管理node.js版本的管理器 +### 二、npm镜像源的设置 +#### 1.为什么换源 +因为npm使用的是国外的镜像源,国内访问很慢,下载依赖包时可能会报错,为节约时间成本和提高下载速度,最好配置成国内的 +#### 2.切换镜像源 +打开命令窗口输入以下代码 +~~~html +npm config set registry + 地址 +国内最新源:https://registry.npmmirror.com +~~~ +#### 3.查看当前源 +~~~html +npm config get registry +~~~ +### 三、npm的基本命令 +1. npm help:查看npm命令列表 +2. npm -l:查看各个命令的简单用法 +3. npm -v:查看npm的版本 +4. npm config list -l:查看npm的配置 +### 四、npm的基础使用 +1. npm+install:安装项目的全部依赖包,加个包名就是指安装指定依赖包 +2. npm+uninstall + 包名:卸载指定依赖包 +3. npm+date:更新项目的全部依赖包 +4. npm+init:初始化项目,生产package.json文件 +5. npm+search+包名:搜索指定依赖包 +### 五、了解package.json文件和package-lock.json文件 +#### 1.node_modules文件夹 +~~~html +1.在使用npm install安装依赖时,会先去查找npm的配置信息,获取配置信息之后会构建依赖包,接着根据依赖包下载完整的依赖资源 +2.在下载之前,会检查是否有缓存资源,如果有则直接放入node_modules中,如果没有则先下载至本地,校检过后再放入node_modules中 +~~~ +#### 2.package.json文件 +1. 作用:它是项目的配置文件,用于描述项目以及项目所依赖的模板信息 +2. 生成方式:执行npm+init之后生成,会询问基本问题,不会自动生成;也可以使用【npm init -y或npm init -f】一键生成 +#### 3.package-lock.json文件 +1. 作用:用于锁定依赖包的版本 +2. 生成方式:当使用npm+install安装包之后就会自动生成,若存在且包有发生变化会自动同步更新 +3. 优点: + - 当删除node_modules目录时,想通过npm+install恢复,可以提高下载速度 + - 锁定版本,防止自动升级(最新版不一定最优) +### 六、第一个node程序 +1. 先创建一个js文件,并写上想要运行的代码 +~~~js +'use strict'; +console.log("超级侦探"); +~~~ +2. 在命令窗口找到该文件所处目录,输入以下命令运行这个程序 +~~~html +node 文件名 +~~~ +3. 注意点: + - 不能用Word和写字板敲代码,必须用UTF-8格式 + - 文件名必须以.js结尾,只能是英文字母、数字和下划线的组合 + - 要找对目录,否则会报错 + +## + +### 练习: + +#### Node和环境变量的关系 + +1. Node.js是基于Chrome V8引擎的JavaScript运行的环境,允许我们使用JavaScript在服务器端运行代码,而不仅限制于浏览器中。 +2. 环境变量是在操作系统中设置的全局变量,可以被各种程序访问。它们包含了一些配置信息,用于指定程序运行时的行为。环境变量一般包括系统和用户的变量。 +3. Node.js通过process.env对象访问操作系统设置的环境变量,这些环境变量用来配置和指导Node.js应用程序的行为 + ###### *process.env对象:JavaScript对象,它的属性对应于环境变量的键,属性的值对应于环境变量的值,可以使用process.env来获取环境变量的值,或者在运行时设置环境变量的* + diff --git "a/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240301_Node\345\274\200\345\217\221\347\216\257\345\242\203&\346\250\241\345\235\227.md" "b/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240301_Node\345\274\200\345\217\221\347\216\257\345\242\203&\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..3f8bfc2133b5c631338ee27c284070683687ca5b --- /dev/null +++ "b/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240301_Node\345\274\200\345\217\221\347\216\257\345\242\203&\346\250\241\345\235\227.md" @@ -0,0 +1,47 @@ +## 一、Node开发环境(vscode) +### 1.项目根目录中的.vscode文件夹 +用于存放目录相关的配置文件,提供一些管理和开发项目的功能和设置,与项目本身无关 +### 2..vscode目录下的文件和内容 +1. launch.json:调式配置文件属性,例如调式任务的名称、启动文件的路径等等 +2. extensions.json:推荐当前项目使用的插件 +3. setting.json:vscode编辑器和插件的相关配置 +4. task.json:任务配置 + +## 二、模块 +### 1.什么是模块 +- 为了让node.js文件可以相互调用,node.js提供了一个模块系统 +- 一个node.js文件就是一个模块,这个文件可能是js代码、json或编译过的C/C++扩展 +### 2.模块的好处 +1. 提高代码的可运维性,当程序出现bug时,可以快速准确找到错误的模块进行修复,不用对整个程序进行修改 +2. 避免函数名和变量名发生冲突 +### 3.暴露模块 +module.exports +~~~js +//示例: +//创建一个名为super的模块,并创建一个函数 +'use strict'; +var input = '超级侦探'; +function greet(){ + log('我是'+input+'!'); +} +module.exports = greet;//暴露模块 +~~~ +==注意:== +任何数据类型都可以被作为模块的输出暴露,并被引入模块 +### 4.引入模块 +require(被引入模块的相对路径) +~~~js +var greet = requir('./super');//引入模块 +greet(); +~~~ +==注意:== +1. 引入的模块作为一个变量需要被接收 +2. 引入可以多层套用,调式不建议1使用,阅读不便,效率低 +### 5.CommonJs规范 +#### 1.概念 +这种node模块化就叫作CommonJs规范 +#### 2.特点 +1. 模块在运行时加载和执行,并且只在首次加载时运行一次,然后将运行结果缓存 +2. 模块加载方式为同步加载,多个模块依次按照顺序加载 +3. require语句可放在块级作用域或条件语句中 +4. 模块内部各自使用的变量名和函数名互不冲突 \ No newline at end of file diff --git "a/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240302_ES6\344\270\255export\344\270\216import.md" "b/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240302_ES6\344\270\255export\344\270\216import.md" new file mode 100644 index 0000000000000000000000000000000000000000..9b13d3f49b2445b141d4e30dd425f4b4db0c7d21 --- /dev/null +++ "b/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240302_ES6\344\270\255export\344\270\216import.md" @@ -0,0 +1,56 @@ +### 一、引出 +JavaScript ES6支持模块化编程,js文件内部的所有变量与函数都被局限于该模块内部,外部模块无法访问。若要调用,则需要将内部的变量与函数必须设为输出(暴露),通过export关键字实现。 +### 二、export输出 +export可以位于模块中如何位置,但是必须是在模块顶层,如果在其他作用域就会报错 +~~~js +示例: +//输出变量方式1 +export var name = '小明'; +//输出变量方式2 +var name = '小明'; +export {name};//可以批量输出 +~~~ +### 三、import导入 +import后接上一对大括号,里面指定要导入的变量名/函数名,from后接上指定导入模块的路径(可以是相对也可以是绝对) +~~~js +示例: +//导入模块为super.js +impot {name} from './super.js'; +console.log(name); +//如果想给导入的变量另起一个名字,可以用as +//impot {name} as newName from './super.js'; +~~~ +### 四、module的整体导入 +除了可以单个导入输出值,还可以用*指定一个对象,所有变量都会导入在这个对象上 +~~~js +示例: +//c.js输出2个函数 +export function area(r){ + return Math.PI*r*r; +} +export function cir(r){ + return Math.PI*r*2; +} +//main.js导入 +//方法1 +import {area,cir} from './c.js'; +log(area(4),cir(4)); +//方法2 +import * as circle from './c.js'; +log(circle.area(4),circle.cir(4)); +~~~ +### 五、export default +前面使用import导入时,都需要知道变量名/函数名,用【export default】就不用 +~~~js +示例: +export default '超级侦探';//匿名变量 +export default function(){ + console.log('超级侦探'); +};//匿名函数 +//注意:一个模块不能有2个匿名输出 + +import x from './super.js'; +~~~ +==注意:== +1. 在使用【export default】时,import不用加大括号 +2. 【export default】也可以用在非匿名函数前 \ No newline at end of file diff --git "a/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240303_Node\345\237\272\346\234\254\346\250\241\345\235\227&FS\346\250\241\345\235\227.md" "b/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240303_Node\345\237\272\346\234\254\346\250\241\345\235\227&FS\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..cb90e567881c65a07ee28ce7e61ef2db1e4bbadd --- /dev/null +++ "b/41\351\273\204\351\233\252\350\212\263/\347\254\224\350\256\260/20240303_Node\345\237\272\346\234\254\346\250\241\345\235\227&FS\346\250\241\345\235\227.md" @@ -0,0 +1,249 @@ +## 一、基本模块 +### 1.global +- 在Node.js环境中,唯一的全局对象叫global +- 进入Node.js交互环境,可直接输入: + ~~~js + global.console......(后面可跟log、info、warn、error等等) + ~~~ +### 2.process(全局) +- 是Node.js的一个对象,代表当前Node.js进程 +- 运用: + 1. 内容相关获取:process.memorUsage() + 2. CPU相关获取:process.cpuUsage() + 3. 查看运行目录、Node环境、CPU架构、用户环境等等 +## 二、FS模块 +### 1.概念 +是Node.js的文件系统模块,负责文件读取、写入、删除等操作 +### 2.文件写入 +#### 1.语法 +~~~js +fs.writeFile(filename,data,[options],callback) +~~~ +#### 2.参数说明 +- filename:文件名 +- data:要写入的内容 +- options:可选,指定文件写入选项flag + - a:追加 + - w:写入(默认替换) +#### 3.示例 +~~~js +'use strict'; +var fs = require('fs'); +fs.writeFile('t.txt','超级侦探',function(err){ + if(err){ + console.log(err); + } + else{ + console.log('ok'); + } +}//回调函数只关注是否成功,故只需一个参数err +) +~~~ +#### 4.同步写入 +writeFileSync,且无回调 +#### 5.追加数据 +~~~js +fs.appendFile(filename,data,[options],callback); +其中options包含三个参数: + - encoding:编译方式,默认为utf-8 + - mode:文件的权限描述,默认为0o666 + - flag:文件操作方式,默认为a,即追加 +### 3.读取文件 +#### 1.语法 +~~~js +fs.readFile(filename,文件编码utf-8,callback) +~~~ +#### 2.示例 +~~~js +fs.readFile('t.txt','utf-8',function(err,data){ + if(err){ + console.log(err); + } + else{ + console.log(data); + } +}//回调函数接收两个参数,正常读取时,err为null,data为读取内容 +//读取错误时,err代表错误对象,data为undefined +) +~~~ +#### 3.同步读取 +fs.readFileSync,且无回调 +### 4.获取文件信息 +#### 1.语法 +~~~js +fs.stat(filename,callback) +~~~ +#### 2.示例 +~~~js +fs.stat('write.txt',function(err,stat){ + if(err){ + console.log(err); + } + else{ + console.log('isFile: ' + stat.isFile());// 是否是文件: + console.log('isDirectory: ' + stat.isDirectory()); // 是否是目录: + if (stat.isFile()) { + console.log('size: ' + stat.size);// 文件大小: + console.log('birth time: ' + stat.birthtime);// 创建时间 + console.log('modified time: ' + stat.mtime); // 修改时间 + } + } +}) +~~~ +### 5.文件名修改 +#### 1.语法 +~~~js +fs.rename(要修改的filename,修改后fliename,callback) +~~~ +#### 2.示例 +~~~js +fs.rename('write.txt','t.txt',function(err){ + if(err){ + log(err); + } + else{ + log('ok'); + } +}) +~~~ +### 6.删除文件 +#### 1.语法 +~~~js +fs.unlink(filename,callback) +~~~ +#### 2.示例 +~~~js +fs.unlink('del.txt',function(err){ + if(err){ + log(err); + } + else{ + log('ok'); + } +}) +~~~ +### 7.读取文件夹 +#### 1.语法 +~~~js +fs.readdir(path,callback); +~~~ +#### 2.示例 +~~~js +import fs from 'fs'; +fs.readdir('./',function(err,data){ + if(err) console.log(err); + else console.log(data); +}) + +//如果多层目录嵌套,想要全部读取,方法如下 +//方法1:使用recursive +fs.readdir('./',{recursive:true},function(err,data){ + if(err) console.log(err); + else console.log(data); +}) +//方法2:递归遍历 +function listAll(filePath){ + //定义一个数组接受最后结果 + let resArr = []; + //定义一个变量同步读取的路径状态 + let fileStat = fs.statSync(filePath); + //定义一个变量接收是否为文件的结果 + let isFile = fileStat.isFile(); + //如果是文件,就通过数组的push添加到结果数组的末尾 + if(isFile){ + resArr.push(filePath); + } + //如果是文件夹,就继续以下操作 + else{ + //同步读取文件夹里的全部内容(包括文件和文件夹) + let arr = fs.readdirSync(filePath); + if (arr.length === 0) { + // 如果文件夹为空,则将文件夹路径添加到结果数组中 + resArr.push(filePath); + } + // **(重点)遍历目录下的所有内容项目,再利用当前方法listAllFile来处理对应路径的信息 + arr.forEach(element => { + //判断项目的/符号的位置是否在末尾 + //定义一个变量接收判断结果 + let last = filePath.lastIndexOf('/') === filePath.length-1; + //通过三元运算符,如果最后没有/符号就加上/,如果最后有/符号就不做修改 + let path = last?filePath+element:`${filePath}/${element}`; + //将处理好的路径调用listAllfile函数继续处理 + let newArr = listAll(path); + //拿到的结果newArr和原结果resArr合并,并再重新赋值给原结果resArr + resArr = resArr.concat(newArr); + }); + } + //返回 + return resArr; +} +var res = listAll('./'); +console.log(res); +~~~ +### 8.创建目录 +#### 1.语法 +~~~js +fs.mkdir(path,[options],callback); +path:文件路径 +options:可选,参数是recursive和mode + - recursive:是否以递归的方式创建目录,默认为false + - mode:设置目录权限(操作系统中用于控制对目录的访问和操作权限的设置),默认为0777 +~~~ +#### 2.示例 +~~~js +//mulut必须存在 +fs.mkdir('./tmp/t',function(err){ + if(err) console.log(err); + else console.log('ok'); +}) +//添加 recursive: true 参数,不管创建的目录haha是否存在: +fs.mkdir('./haha/hh',{recursive:true},function(err){ + if(err) console.log(err); + else console.log('ok'); +}) +~~~ +### 9.删除目录 +#### 1.语法: +~~~js +fs.rmdir(path,callback) +~~~ +#### 2.示例: +~~~js +fs.rmdir('./haha',(err)=>{ + if(err) console.log(err); + else{ + console.log('ok'); + } +}) +//要删除的目录必须为空 +//方法一: +//先安装fs-extra模块npm install fs-extra +//使用remove删除 +var fs = require('fs-extra'); +fs.removeSync('./tmp'); +//方法二:递归 +var fs = require('fs'); +function del(path){ + let exists = fs.existsSync(path); + if(exists){ + let stat = fs.statSync(path); + if(stat.isDirectory()){ + let files = fs.readdirSync(path); + files.forEach(element => { + let fullPath = `${path}/${element}`; + del(fullPath); + }); + } + fs.rmdirSync(path); + } +} +var res = del('./tmp'); +~~~ +### 10.拷贝文件 +~~~js +js.copyFile(src,dest,[options],callback); +示例: +fs.copyFileSync('try.txt', 'copy.txt',function(err){ + if(err) console.log(err); + else console.log('ok') +});