diff --git "a/39\344\275\231\346\242\246\345\251\267/Note/20240229-lesson1 Node.js\345\205\245\351\227\250/20240229-\345\256\211\350\243\205Node.js\345\222\214npm\343\200\201nvm.md" "b/39\344\275\231\346\242\246\345\251\267/Note/20240229-lesson1 Node.js\345\205\245\351\227\250/20240229-\345\256\211\350\243\205Node.js\345\222\214npm\343\200\201nvm.md" new file mode 100644 index 0000000000000000000000000000000000000000..83084ae096e01413bfc67d52abbc297ffb87720f --- /dev/null +++ "b/39\344\275\231\346\242\246\345\251\267/Note/20240229-lesson1 Node.js\345\205\245\351\227\250/20240229-\345\256\211\350\243\205Node.js\345\222\214npm\343\200\201nvm.md" @@ -0,0 +1,12 @@ +# 安装Node.js +首先,从[Node.js官网](https://nodejs.org/)下载对应平台的安装程序。 +安装完成后,在Windows环境下,请打开命令提示符,然后输入`node -v`,如果安装正常,可以看到控制台输出对应的版本号。 +继续在命令提示符输入`node`,此刻你将进入Node.js的交互环境。在交互环境下,你可以输入任意JavaScript语句,例如`100+200`,回车后将得到输出结果。 +![](https://gitee.com/a-dove/figure-bed/raw/master/2024-2-2919:47:39-1709207237222.png) +要退出Node.js环境,连按两次Ctrl+C。 +# npm +`npm`是Node Package Manager(Node.js 包管理器)的缩写,是随同Node.js一起安装的包管理工具。通过npm可以方便地安装、更新、卸载Node.js模块,以及管理这些模块之间的依赖关系。 +当我们使用Node开发时,会用到很多别人写的js代码。为了避免使用某个包时去检索官方网站下载解压再使用......这一系列过程非常繁琐。为了方便,大家便将自己开发的模块打包到npm官网上,方便大家安装直接使用。 +而且,有些模块依赖于其它模块,甚至形成依赖链。npm可以根据依赖关系,把所有依赖包都下载管理起了。 +# nvm +nvm 是 Node Version Manager 的缩写,它是一个用于在同一台计算机上管理多个 Node.js 版本的工具。使用 nvm 可以很方便地在不同的 Node.js 版本之间进行切换,这对于需要在不同项目中使用不同 Node.js 版本的开发者来说非常有用。通过 nvm 安装和管理 Node.js 版本可以避免全局安装的冲突,并使得管理多个项目的 Node.js 版本变得更加简单。 diff --git "a/39\344\275\231\346\242\246\345\251\267/Note/20240301-lesson2 \346\250\241\345\235\227/20240301-\346\250\241\345\235\227.md" "b/39\344\275\231\346\242\246\345\251\267/Note/20240301-lesson2 \346\250\241\345\235\227/20240301-\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..81bffc8b5af615b60b9b559a0b12be7a2264f476 --- /dev/null +++ "b/39\344\275\231\346\242\246\345\251\267/Note/20240301-lesson2 \346\250\241\345\235\227/20240301-\346\250\241\345\235\227.md" @@ -0,0 +1,74 @@ +# 模块的概念 +在Node.js中,模块是一种组织和封装代码的方式,用于提高代码的可重用性和可维护性。 + +## 模块的种类 +### 内置模块: +1. Node.js 自带的模块,包含在核心库中,提供常见功能和工具,如fs模块用于处理文件系统操作,http模块用于创建HTTP服务器等。 +2. 内置模块在安装Node.js时就已经包含了,可直接在代码中使用,无需额外安装配置。 + +### 自定义模块: +1. 开发者根据需求创建的模块,通过将相关的功能封装在一个模块中,用于组织功能并提高代码复用性,可以将代码组织得更加清晰和模块化。 +2. 自定义模块可以包含函数、对象、类等,使用 module.exports 导出模块内容,供其他文件引入使用。 + +## 模块是什么? +随着代码的日渐增多,为了后期维护,于是将函数分组放在不同文件夹中,每个文件夹的代码较少。在Node.js中,一个.js文件就称之为一个模块。 + +## 模块有什么好处? +- 代码重用性:模块化结构提高代码复用性,减少重复编写代码。 +- 可维护性:模块化代码更易维护,修改功能时只需关注特定模块。 +- 代码组织:清晰分离不同功能代码,便于管理和团队协作。 +- 避免命名冲突:不同模块间函数名和变量名不会冲突。 + +**代码示例:** + +```js +// 这是一个名为dome.js的文件 + +'use strict' + +var title = 'java'; +function myFunction(s){ + console.log(s+"like"+title) +}; + +module.exports = myFunction + +``` + +```js +// 这是一个名为main.js的文件 + +'use strict' + +var dome = require('./dome'); +var s = "Monica"; + +dome(s); + +``` +```bash +node main.js +``` + +# CommonJS规范 +## 什么是CommonJS? +CommonJS是一种用于组织和管理JavaScript代码的模块化规范。它最初由Node.js社区提出,并被广泛采用在Node.js等环境中,以实现模块化开发。 + +CommonJS 规范为 JavaScript 提供了一种有效的模块化解决方案,使得 JavaScript 在大型应用程序开发中更加灵活和可控。 +## CommonJS的模块规范 +一个文件就是一个模块,每个模块都拥有自己独立的作用域,模块内部的变量和函数对外部是不可见的,除非显示地通过 `module.exports` 导出。其他模块可以通过 `require` 来引入另一个模块的功能。 + +CommonJS对模块的定义十主要分为模块引用、模块定义和模块标识3个部分。 + +1. **模块应用** + `var math = require('maath');` + 在CommonJS规范中,存在require()方法。这个方法接受模块标识,以此引入一个模块的API到当前上下文中。 +2. **模块定义** + 在模块中,上下文提供require()方法来引入外部模块。对应引入的功能,上下文提供了exports对象用于导出当前模块的方法或变量,并且它是唯一导出的出口。在模块中,还存在一个module对象,它代表模块自身,而exports是module的属性。在Node.js中,一个文件就是一个模块,而方法挂载在exports对象上作为属性即可定义导出方式。 +3. **模块标识** + 模块标识就是传递给require()方法的参数,它必须是符合小驼峰命名的字符串,或者以./开头的相对路径或者绝对路径。它可以没有文件名后缀js。 +**核心概念:** +1. `module.exports`:用于导出模块的功能,可以是变量、函数或对象。 +2. `require`:用于引入其它模块的功能,返回导出的内容供当前模块使用。 + +这种模块化机制使得 JavaScript 代码更易于组织、维护和重用,因为它允许开发者将代码分割成多个模块,从而降低了代码的复杂性,并提高了可维护性和可扩展性。 diff --git "a/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-es6 export\346\232\264\351\234\262.md" "b/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-es6 export\346\232\264\351\234\262.md" new file mode 100644 index 0000000000000000000000000000000000000000..d2c98ffb5f645a2721202c5d79202e288716a84e --- /dev/null +++ "b/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-es6 export\346\232\264\351\234\262.md" @@ -0,0 +1,76 @@ +ES6的模块暴露和引入可以让我们实现模块化编程,export或export default暴露,import引入变量。 + +# ES6三种模块暴露方法 +## 多行暴露:多个export + +```js +//多行暴露 +export function foo() { + console,console.log('foo() moudle1'); +} + +export function bar() { + console.log('bar() moudle1') +} + +``` +## 统一暴露:export暴露多个:export {foo,bar} + +```js +function fun1() { + console.log('fun1() module2') +} + +function fun2() { + console.log('fun2() module2') +} +// 统一暴露 +export {foo,bar} + +``` +以上两种向外暴露方式在主文件引入时必须使用对象的解构赋值引用(不能使用变量接收的方式来映入) +## 默认暴露:export default 方式 + +```js +export default{ + obj={ + name:"导出" + }, + fuc:function(){ + console.log('导出') + } +} +``` +***注***:通用引入方式调用时需加'default'属性 + +```js +//这里是通用引用方式 +import * as ex from './js/export.js' //个人文件夹 +console.log(ex.default.obj.name) //导出 +``` + +# 引入方式 + +## 通用引用 + +```js +//使用关键字as引入 +import * as ex from './js/export.js' //个人文件夹 +console.log(ex.obj.name) //导出 +``` + +## 解构赋值 + +```js +import { obj,fuc}from './js/export.js' +// 默认暴露的解构赋值引入写法 +import {default as ex} from './js/export.js' +console.log(ex.obj.name)//导出 +``` + +## 简便形式 (只针对默认暴露) + +```js +import ex from './js/export.js' +console.log(ex.obj.name)//导出 +``` \ No newline at end of file diff --git "a/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-fs\346\250\241\345\235\227.md" "b/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-fs\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..85e3f430332eddc98c941a8ff28f46f02c06bb62 --- /dev/null +++ "b/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-fs\346\250\241\345\235\227.md" @@ -0,0 +1,137 @@ +Node.js 的 `fs` 模块是一个用于与文件系统进行交互的模块,提供了一系列的方法来执行文件的读写、创建目录、读取目录内容、更改文件权限等操作。这些操作既可以以异步的方式进行,也可以以同步的方式进行。 +### 引入 `fs` 模块 + +在使用 `fs` 模块之前,你需要先引入它: + +```javascript +const fs = require('fs'); +``` + +### 异步与同步 + +Node.js 中的 `fs` 方法大多数都有异步和同步两种形式。异步方法的最后一个参数通常是完成回调函数,回调函数的第一个参数是错误对象。如果操作成功完成,则错误对象为 `null` 或 `undefined`。 + +### 读取文件 + +- **异步读取** + +```javascript +fs.readFile('/path/to/file', 'utf8', (err, data) => { + if (err) { + console.error(err); + return; + } + console.log(data); +}); +``` + +- **同步读取** + +```javascript +try { + const data = fs.readFileSync('/path/to/file', 'utf8'); + console.log(data); +} catch (err) { + console.error(err); +} +``` + +### 写入文件 + +- **异步写入** + +```javascript +fs.writeFile('/path/to/file', 'Hello, world!', err => { + if (err) { + console.error(err); + return; + } + console.log('File has been written'); +}); +``` + +- **同步写入** + +```javascript +try { + fs.writeFileSync('/path/to/file', 'Hello, world!'); + console.log('File has been written'); +} catch (err) { + console.error(err); +} +``` + +### 创建目录 + +- **异步创建** + +```javascript +fs.mkdir('/path/to/dir', { recursive: true }, err => { + if (err) { + console.error(err); + return; + } + console.log('Directory created'); +}); +``` + +- **同步创建** + +```javascript +try { + fs.mkdirSync('/path/to/dir', { recursive: true }); + console.log('Directory created'); +} catch (err) { + console.error(err); +} +``` + +### 读取目录内容 + +- **异步读取** + +```javascript +fs.readdir('/path/to/dir', (err, files) => { + if (err) { + console.error(err); + return; + } + console.log(files); +}); +``` + +- **同步读取** + +```javascript +try { + const files = fs.readdirSync('/path/to/dir'); + console.log(files); +} catch (err) { + console.error(err); +} +``` + +### 删除文件 + +- **异步删除** + +```javascript +fs.unlink('/path/to/file', err => { + if (err) { + console.error(err); + return; + } + console.log('File deleted'); +}); +``` + +- **同步删除** + +```javascript +try { + fs.unlinkSync('/path/to/file'); + console.log('File deleted'); +} catch (err) { + console.error(err); +} +``` diff --git "a/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-\345\220\214\346\255\245\345\274\202\346\255\245.md" "b/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-\345\220\214\346\255\245\345\274\202\346\255\245.md" new file mode 100644 index 0000000000000000000000000000000000000000..4f5a00a01cd1a44b0f13b2c85ec065a0dcf8837f --- /dev/null +++ "b/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-\345\220\214\346\255\245\345\274\202\346\255\245.md" @@ -0,0 +1,53 @@ +# IO操作 +``` +IO分两阶段(一旦拿到数据后就变成了数据操作,不再是IO): + 1.数据准备阶段 + 2.内核空间复制数据到用户进程缓冲区(用户空间)阶段 + +在操作系统中,程序运行的空间分为内核空间和用户空间。 + 应用程序都是运行在用户空间的,所以它们能操作的数据也都在用户空间。 + +同步IO和异步IO的区别就在于第二个步骤是否阻塞: + 如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO +``` +# 同步与异步(线程间调用) +``` +同步与异步是对应于调用者与被调用者,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的 + + 同步操作时,调用者需要等待被调用者返回结果,才会进行下一步操作 + + 而异步则相反,调用者不需要等待被调用者返回调用,即可进行下一步操作,被调用者通常依靠事件、回调等机制来通知调用者结果 +``` +# 同步与异步调用/线程/通信 +同步就是两种东西通过一种机制实现步调一致,异步是两种东西不必步调一致 + +## 同步调用与异步调用 + + 在用在调用场景中,无非是对调用结果的不同处理。 + + 同步调用就是调用一但返回,就能知道结果,而异步是返回时不一定知道结果,还得通过其他机制来获知结果,如: + + a. 状态 b. 通知 c. 回调函数 + + +## 同步线程与异步线程 + + 同步线程:即两个线程步调要一致,其中一个线程可能要阻塞等待另外一个线程的运行,要相互协商。快的阻塞一下等到慢的步调一致。 + + 异步线程:步调不用一致,各自按各自的步调运行,不受另一个线程的影响。 + + +## 同步通信与异步通信 + + 同步和异步是指:发送方和接收方是否协调步调一致 + + 同步通信是指:发送方和接收方通过一定机制,实现收发步调协调。 + 如:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式 + + 异步通信是指:发送方的发送不管接收方的接收状态。 + 如:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。 + + +阻塞可以是实现同步的一种手段!例如两个东西需要同步,一旦出现不同步情况,我就阻塞快的一方,使双方达到同步。 + +同步是两个对象之间的关系,而阻塞是一个对象的状态。 \ No newline at end of file diff --git "a/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-\345\237\272\347\241\200\346\250\241\345\235\227.md" "b/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-\345\237\272\347\241\200\346\250\241\345\235\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..aa77710cff48400eda6b745287076efd6a0062e6 --- /dev/null +++ "b/39\344\275\231\346\242\246\345\251\267/Note/20240302-es6 export\346\232\264\351\234\262\343\200\201\345\220\214\346\255\245\345\274\202\346\255\245\343\200\201\345\237\272\347\241\200\346\250\241\345\235\227/20240302-\345\237\272\347\241\200\346\250\241\345\235\227.md" @@ -0,0 +1,29 @@ +# goal +在浏览器 JavaScript 中,通常window 是全局对象, 而 Nodejs中的全局对象是 global +在NodeJS里,是不可能在最外层定义一个变量,因为所有的用户代码都是当前模块的,只在当前模块里可用,但可以通过exports对象的使用将其传递给模块外部 +所以,在NodeJS中,用var声明的变量并不属于全局的变量,只在当前模块生效 +像上述的global全局对象则在全局作用域中,任何全局变量、函数、对象都是该对象的一个属性值 + +# process +进程对象,提供有关当前进程的信息和控制 +包括在执行node程序进程时,如果需要传递参数,我们想要获取这个参数需要在process内置对象中 +启动进程: +```bash + node index.js 参数1 参数2 参数3 +``` +index.js文件如下: +```javascript +process.argv.forEach((val, index) => { + console.log(`${index}: ${val}`); +}); +``` + +输出如下: + +```bash +/usr/local/bin/node +/Users/mjr/work/node/process-args.js +参数1 +参数2 +参数3 +``` diff --git "a/39\344\275\231\346\242\246\345\251\267/homework/20240229.md" "b/39\344\275\231\346\242\246\345\251\267/homework/20240229.md" new file mode 100644 index 0000000000000000000000000000000000000000..8ca5c212e85954f2b66ff63f2bfe4730bb8e5afb --- /dev/null +++ "b/39\344\275\231\346\242\246\345\251\267/homework/20240229.md" @@ -0,0 +1,4 @@ +# Node和环境变量的关系 +环境变量通常用于配置应用程序的行为,例如数据库连接信息、API 密钥等敏感信息。通过使用环境变量,您可以在不同的部署环境中轻松地配置应用程序,而不需要修改代码。 +# Node初始化一个项目 +![](https://gitee.com/a-dove/figure-bed/raw/master/2024-2-2919:42:44-1709206932413.png) diff --git a/readme.md b/readme.md deleted file mode 100644 index 4c7fce1a6d837b4222a7ace58bcfe14ff9050cf9..0000000000000000000000000000000000000000 --- a/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -## net前端班笔记 - -上课录屏地址:https://www.alipan.com/s/R85ZxiyYWBg \ No newline at end of file