NodeJS学习笔记一

news2024/9/27 7:24:23

文章目录

    • 1. 模块化
        • 1.1 模块作用域
    • 2. 内置API模块
    • 3. 自定义模块
        • 3.1 向外共享模块作用域中的成员
        • 3.2 使用误区
        • 3.3 CommonJS模块化规范
    • 4. 第三方API模块
        • 4.1 npm包管理目录
        • 4.2 包管理配置文件 package.json
        • 4.3 devDependencies节点
        • 4.4 切换npm的包镜像源
        • 4.5 包的分类
            • 4.5.1 项目包
            • 4.5.2 全局包
        • 4.6 开发属于自己的包
    • 5. 模块加载机制
        • 5.1 优先从缓存中加载
        • 5.2 内置模块的加载优先级最高
        • 5.3 自定义模块加载机制
        • 5.4 第三方模块加载机制
        • 5.5 目录作为模块

JavaScript可以在浏览器中运行,是因为浏览器中有JavaScript解析引擎,不同的浏览器,其JavaScript解析引擎不同。JavaScript在浏览器中运行,还需要依赖浏览器内置的DOM、BOM函数。

JavaScript不仅可以运行在浏览器,也可以运行在NodeJS,NodeJs是一个基于Chome V8引擎的JavaScript运行环境。

1. 模块化

  • 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。
  • 编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多 个小模块。
  • 把代码进行模块化拆分的好处:
    ① 提高了代码的复用性
    ② 提高了代码的可维护性
    ③ 可以实现按需加载
  • NodeJs中模块的分类
    ① 内置模块 (内置模块是由Node.js官方提供的,例如fs、 path、 http等)
    ② 自定义模块(用户创建的每个js文件,都是自定义模块)
    ③ 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)

1.1 模块作用域

和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。

2. 内置API模块

加载内置 fs文件系统模块、 path模块、 http模块

const http = require('node:http');
const fs = require('node:fs');
const path = require('node:path');

其它内置模块,可以查看NodeJS官网文档:
https://nodejs.org/dist/latest-v18.x/docs/api/documentation.html

3. 自定义模块

3.1 向外共享模块作用域中的成员

  1. 在每个js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息
    在这里插入图片描述

  2. 在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用。外界用require0方法导入自定义模块时,得到的就是module.exports所指向的对象。

  3. 为了简化向外共享成员的代码,Node提供了exports对象。默认情况下,exports和module.exports指向同一个对象。最终共享的结果,还是以module.exports指向的对象为准。

  4. require0模块时,得到的永远是module.exports指向的对象:

3.2 使用误区

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3 CommonJS模块化规范

① 每个模块内部,module 变量代表当前模块。
② module 变量是一个对象, 它的exports属性(即module.exports)是对外的接口。
③ 加载某个模块,其实是加载该模块的module.exports属性。require( )方法用于加载模块。

4. 第三方API模块

  • 第三方API模块,又叫做包
  • 全球最大包共享平台:https://www.npmjs.com/
  • 可以用 Node Package Manager (npm包管理工具) 从 https://registry.npmjs.org/ 下载包
  • 安装包的命令:例如安装moment包 npm install moment
    可以简写为 npm i moment
  • 安装指定版本的包 npm -i comment@2.29.4 (大版本.功能版本.Bug修复版本)
  • 一次性安装所有依赖的包 npm install 或者 npm i
    在这里插入图片描述
  • 卸载指定的包 npm uninstall comment

4.1 npm包管理目录

  • node_modules文件夹用来存放所有已安装到项目中的包。require()导入第三方包时,就是从这个目录中查找并加载包。
  • package-lock.json配置文件用来记录node_modules目录下的每一个包的下载信息, 例如包的名字、版本号、下载地址等。
    在这里插入图片描述

4.2 包管理配置文件 package.json

在这里插入图片描述

  • 项目开发中,要把node_modules文件夹,添加到.gitignore忽略文件中.
  • npm init -y 可以在执行命令时所处的目录中,快速创建package.json 这个包管理配置文件,该命令只能在英文的目录下成功运行,且目录中不能含有空格
  • 运行npm install命令安装包的时候,npm包管理工具会自动把包的名称和版本号,记录到package.json

4.3 devDependencies节点

如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到devDependencies节点中。
如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到dependencies节点中。
在这里插入图片描述

4.4 切换npm的包镜像源

npm config get registry
npm config set registry=https://registry.npm.taobao.org/
在这里插入图片描述
nrm 快速切换包镜像源
在这里插入图片描述

4.5 包的分类

4.5.1 项目包

那些被安装到项目的node_modules 目录中的包,都是项目包。
项目包又分为两类,分别是:
● 开发依赖包 (被记录到devDependencies节点中的包,只在开发期间会用到)
● 核心依赖包 (被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到)
在这里插入图片描述

4.5.2 全局包

在执行npm install命令时,如果提供了-g 参数,则会把包安装为全局包。
全局包安装目录:C:\Users\Administrator\AppData\Roaming\npm\node_modules
在这里插入图片描述
只有工具性质的包,才有全局安装的必要性。因为它们提供了好用的终端命令。
例如: npm install -g i5ting_toc 将md文件转换为html文件
npm install -g nrm

4.6 开发属于自己的包

在这里插入图片描述

在这里插入图片描述

5. 模块加载机制

5.1 优先从缓存中加载

模块在第一次加载后会被缓存。这也意味着多次调用 require()不会导致模块的代码被执行多次。
注意: 不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。

5.2 内置模块的加载优先级最高

内置模块是由Node.js官方提供的模块,内置模块的加载优先级最高。
例如,require("fs’) 始终返回内置的fs模块,即使在node_ modules目录下有名字相同的包也叫做fs。

5.3 自定义模块加载机制

使用require()加载自定义模块时,必须指定以 ./ 或 …/ 开头的路径标识符。在加载自定义模块时,如果没有指定 ./ 或…/ 这样的路径标识符,则node会把它当作内置模块或第三方模块进行加载。
同时,在使用require() 导入自定义模块时,如果省略了文件的扩展名,则Node.js会按顺序分别尝试加载以下的文件:
① 按照确切的文件名进行加载
② 补全js扩展名进行加载
③ 补全json扩展名进行加载
④ 补全.node扩展名进行加载
⑤ 加载失败,终端报错

5.4 第三方模块加载机制

如果传递给require() 的模块标识符不是一个内置模块,也没有以 ./ 或 …/ 开头, 则Node.js会从当前模块的父目录开始,尝试从/node_modules文件夹中加我第三方模块。

如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。

5.5 目录作为模块

当把目录作为模块标识符,传递给require0进行加载的时候,有三种加载方式:
① 在被加载的目录下查找一个叫做 package.json的文件,并寻找main属性,作为require() 加载的入口
② 如果目录里没有package.json 文件,或者main入口不存在或无法解析,则Node.js 将会试图加载目录下的index.js文件。
③ 如果以上两步都失败了,则Node.js会在终端打印错误消息,报告模块的缺失: Error: Cannot find module xo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【cfeng-Work】work项目理解

work 项目 内容管理入职项目环境搭建商用项目 和 学习项目经验分享easily 分享work 见解 学习项目(非商用)相比工作中的商用项目差别还是很大的… Cfeng 最近开始工作, 接下来我将分享一下对于学校中的project环境和 work环境的相关理解 入职…

生成式对抗网络(GAN)原理推导与网络构建思路

0 引言 设想这样的场景:你是一个工作室的老板,你的工作室主要用来生产名画的赝品;而真正的名画则为前人所创造,存放在收藏室中。你的赝品画会和真品画一起被鉴定家鉴定,而你的终极目标是成为一个以假乱真的工艺大师。…

设置 Postman 环境并调用 API

云开发自带 API 调试 功能,可快速进行 API 接口调试,同时也支持通过 Postman 调用 API 获取设备信息或控制设备。本文介绍如何设置调用云开发 API 的 Postman 开发环境及调用接口实践。 配置环境 安装 Postman 8.2.2 及以上版本桌面软件。 版本过低会出…

Python类中的__init__() 和 self 的解析

1、Python中self的含义 self,英文单词意思很明显,表示自己,本身。 此处有几种潜在含义: 1.这里的自己,指的是,实例Instance本身。 2.同时, 由于说到“自己”这个词,都是和相对而…

《计算机网络》——第七章知识点

防火墙:特殊编程的路由器,实施访问控制策略。分为网络级防火墙(防止网络出现非法入侵)和应用级防火墙(进行应用的访问控制)。 本次文章详细PDF请点击以下链接查看: https://download.csdn.net/download/qq_53142796/87353770https://download.csdn.n…

市场回暖进行时,实体店商户们千万不要做这三件事!

随着防控措施的进一步优化,市场环境逐渐复苏,许多商户都趁着这段时间开始着手做准备,想要趁年前赚到消费回暖的第一波红利。 但是方向一旦错了,不管付出的努力有多少,最终也只能和想要的结果背道而驰;为了避…

图文结合带你搞懂MySQL日志之Slow Query Log(慢查询日志)

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:KAiTO文章来源:GreatSQL社区原创 什么是慢查询日志 MySQL 的慢查询日志,用来记录在 M…

ORB-SLAM2 --- Tracking::Track 追踪线程解析

1.函数作用 ORB-SLAM2的三大线程之一---跟踪线程,负责估计运动信息、跟踪局部地图。 追踪线程的主要工作原理就是我们从数据集中读入一帧帧,刚开始的时候跟踪线程没有进行初始化(没有初始化不知道世界坐标系的原点和相机的位姿)&a…

做开发的朋友说软件测试是个人都能学,我当面怒怼

那就分析一下测试工程师需要会哪些技能: 01 软件测试理论 作为一个软件测试人员,总不能不知道软件测试本身的东西吧。 你总要知道软件测试是什么?什么是测试用例?什么是缺陷?软件测试有些什么特点?这些…

OpenHarmony#深入浅出学习eTs#(八)“猜大小”小游戏

本项目Gitee仓地址:[深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com)]( 上一章节提到的模拟器存在的BUG问题,目前没有办法直接改善,本来打算直接使用鸿蒙远程设备来实现,但是发现支持API8的设备都被抢光了(包括模…

如何使用谷歌地图和LightningChart创建地理空间地图图表?

LightningChart JS 是一款高性能的 JavaScript 图表工具,专注于性能密集型、实时可视化图表解决方案。 LightningChart .JS | 下载试用(qun:740060302)https://www.evget.com/product/4189/download Google Static Maps API 是一…

前端基础(二)_JavaScript变量、JavaScript标识符、JavaScript获取元素、JavaScript的鼠标事件

一、JavaScript变量 变量是存储数据的容器,例x10,则x中存储的值为10。 语法:var 变量名 值。 1.1、变量的声明 先声明后赋值 var x; // 声明变量x alert(x); // undefined 所有声明了但是没有赋值的变量,结果都为undefined X…

单商户商城系统功能拆解55—后台设置

单商户商城系统,也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法,例如拼团,秒杀,砍价,包邮…

水文监测系统 水文遥测终端机 遥测终端机-助力母亲河平稳度汛

平升电子水文监测系统/水文遥测终端机/遥测终端机实现对江河流域水位、降水量、流量、流速、水质、闸门开启度、墒情等数据的实时采集、报送和处理。为防汛抗旱减灾提供科学依据和有效信息共享,保障人民群众生命财产安全,满足水利和经济社会发展对水文服…

虚拟化平台安装并升级显卡驱动

前言 在虚拟化平台上,虚拟化要使用vGPU,需要同时在主机和虚拟机上安装显卡驱动,主机和虚拟机的显卡驱动需要保守一致。安装驱动时先安装主机驱动,再安装虚拟机驱动。 驱动下载 可以从显卡官网许可中心下载对应的虚拟化驱动&…

一篇文章教小白学会搭建 vite + ts + vue3 项目,手把手教程,不会算我输

目录 一、基础环境和工具 1. 使用 pnpm 代替 npm 2. 使用 pinia 代替 vuex 3. 使用 windicss 4. 使用 vscode 5. 使用 sourcetree 6. 了解 vite ts vue 二、项目搭建 1. 流程图 2. 初始化项目 2.1 使用命令初始化项目 2.2 项目结构 3. 使用 git 3.1 创建本地的…

【JavaSE成神之路】数组思考题讲解

哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容是数组的思考题讲解,也就是上一节我留下的两个小作业。 数组是非常重要的知识点,也是我们后续学习各种数据结构的基础&am…

【MMC子系统】 一、MMC/SD/SDIO介绍

个人主页:董哥聊技术我是董哥,嵌入式领域新星创作者创作理念:专注分享高质量嵌入式文章,让大家读有所得!文章目录1、前言2、MMC/SD/SDIO介绍3、总线接口4、参考文章1、前言 该节学习Linux Kernel的MMC子系统&#xff…

JVM学习笔记(3)—— 运行时数据区—— 程序计数器、虚拟机栈、本地方法栈

程序计数器、虚拟机栈、本地方法栈都是线程私有的,jvm中每个线程都有一份 一、程序计数器 JVM中的程序计数器是一个与PC寄存器功能类似的逻辑结构,用于记录当前线程要执行的下一条jvm指令的地址,解释器读取到对应的jvm指令后将其翻译成机器指…

解决ubuntu(Linux)桌面/应用不插电掉帧问题

解决ubuntu(Linux)桌面/应用不插电掉帧问题 笔记本安装的ubuntu的gnome桌面,插电状态下触摸板动画丝滑,翻看浏览器文章的时候也不会有延迟掉帧的情况,但是离开了充电器,电池供电就会掉帧。 思路:在插电模式下&#x…