1.模块化
1.模块化与作用域
- 编程领域中的模块化:遵守固定的规则,把一个大文件拆成独立并相互依赖的多个小模块。
- 模块化好处:提高代码复用性,可维护性和按需加载
- 模块化语法规范
CommonJS
:require
引用模块 与module.exports
向外暴露成员CommonJS
规范了: 模块的特性 以及 各模块之间如何相互依赖- module 变量代表当前模块,是一个对象,其exports属性是对外接口,需要require( )方法加载该属性
- Node.js 的 模块分类:内置模块(fs,path,http,由官方提供),自定义模块(用户创建的每个js文件),第三方模块(由第三方开发,非官方提供,使用前需要下载)
- 执行模块:通过 require( ) 方法(会自动补全 js 后缀)可以加载使用模块,执行被加载模块中的代码
- 模块作用域:与和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域(防止了全局变量污染的问题)
2. module 模块
- 相关属性:
module.path
[ 文件的相对路径 ] ;.filename
:[文件路径内的完整名称];.exports
:[ 指向空对象 ](可以通过其向外共享成员) module.exports
对象:将模块内的成员共享出去,供外界使用,外界使用 require 方法导入自定义模块时,得到的就是module.exports
所指向对象- 默认 exports 和 module.exports 指向同一个对象,最终共享的结果,还是以 module.exports 指向的结果为准
- 防止混乱尽量不要在同一个模块中使用 exports 和 module.exports
3.npm与包
-
包:又叫第三地方模块
-
包的来源:由第三方个人或团队开发,供人免费试用
-
包的作用:基于内置模块封装而成,提供了更高级,更方便的API,提高开发效率。
-
包与内置模块的关系类似于jQuery 与 浏览器内置API 之间的关系
-
npm i moment
安装成功后会多一个node_modules
文件夹【存放所有已安装到项目的包,require 从该目录查找并导入加载包】和两个 js 文件(package - lock.json
【记录上面文件夹的目录下的每一个包的下载信息】和package,json
),注意,不要手动修改以上任何代码,npm包管理工具会自动维护。 -
package.json
【包管理配置文件,用来记录与项目有关的一些配置信息】,必须包含在项目根目录中。
1.包含的配置信息:1. 项目的名称,版本号,描述, 2. 项目中用到那些包 3. 那些包只在开发期间会用到 4. 那些包在开发和部署时都需要用到
-
包的语义化规范:版本号以‘’点分十进制‘’定义,总共三位数字,例2.24.0.
1.第1位:大版本,第2位:功能版本,第3位:Bug修复版本
2.版本号提升,后面全部归零 -
多人项目开发不需要上传node_module 文件夹到github,将其添加到.gitignore忽略文件中,而可以创建
package.json
用来记录项目中安装的包,方便团队成员共享项目源代码。- 新建
package.json
文件快捷键:npm init -y
【只能在 英文 或 无空格 目录运行,运行npm install 命令安装包,npm自动将包名称等信息记录其中】,其中必须包含 name,version 以及 main属性 dependencies
节点 [ 核心依赖包 ]【存放在项目开发以及上线后均会用到的包】 用来记录使用npm i 命令安装了哪些包,方便误删 node_module 后重新安装所有依赖包- 卸载依赖包:命令
npm uninstall + 包的名称
, devDependencies
节点 [开发依赖包] :存放只在项目开发阶段而项目上线后不会用到的包,使用npm i 包名 -D
【是npm i --save-dev
包名 的缩写】快捷命令将指定包安装 其中
- 新建
-
【扩展】镜像:一种文件存储形式。一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本。例如·:淘宝NPM镜像服务器(解决下包速度慢的问题)
- 下包镜像源:下包的服务器地址。 检查下包镜像源命令·:
npm config set registry
- 切换为淘宝镜像源命令:
npm config set registry=https://registry.npm.taobao.org/
nrm
: 方便查看和切换 包镜像源 。安装npm i nrm -g
,查看所有镜像源nrm ls
,下包镜像源切换nrm use taobao
- 下包镜像源:下包的服务器地址。 检查下包镜像源命令·:
-
包的分类:开发依赖包和核心依赖包。
- 全局包:提供 -g 参数,
npm i包名-g //全局安装指定的包
npm uninstall 包名-g//卸载全局安装的包
2.`i5ting_toc`: 一个吧md文档转为html页面的工具
//将i5ting_toc安装为全局包
npm install -g i5ting_toc
//调用,轻松实现md转换为html的功能
i5ting_toc -f 要转换的md文件路径 -o
-
开发自己的包:
1.初始化 package.json ,必备属性:1. name :包名,需要具备唯一性 2. version:包版本号 3. main : 外界默认入口文件 4. description:包的简短信息 5. keywords,搜索关键字 6. license :默认许可协议,ISC
- 开发属于自己的包
1.需要实现的功能
格式化日期
转义Html中的特殊字符
还原html中的特殊字符 - 发布 npm publish 包名,删除npm unpublish 包名 --froce
- 开发属于自己的包
-
模块的加载机制:
1. 优先从缓存中加载
模块在第一次被加载后会被缓存。这也意味着多次调用 require() 不会导致模块的代码被多次执行。注意:不论是内置模块,自定义模块,还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。
2. 内置模块的加载机制
内置模块加载优先级最高。
3. 自定义模块的加载机制
使用require()加载自定义模块时,必须指定以./或…/开头的路径标识符。在加载自定义模块时,如果没有指定的话,则node模块就会把他当成内置模块或者第三方模块进行加载
同时,在使用require()导入自定义模块时,如果省略了文件的拓展名,则node.js就会按顺序分别尝试加载以下的文件
1.按照确切的文件名进行加载
2.补全.js拓展名进行加载
3.补全.json拓展名进行加载
4.补全.node拓展名进行加载
5.加载失败,终端报错
4. 第三方模块的加载机制
如果传递给require()的模块标识符不是一个内置模块,也没有./等等开题,则Node.js会从当前模块的父目录开始,尝试从.node_modules文件夹中加载第三方模块。如果没有找到第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录