目录
不利于后续维护 和 二次开发(不好管理,项目结构混乱)
按照一定的规则 将js代码功能进行封装
规范化:由于所有模块 都按照指定的规则进行封装 因此 可以做到格式上的统一
代码复用高
易维护:如果某一个模块除了问题 就只会影响到使用该模块的功能 不影响其他功能 而且 解决问题的时候 也方便定位
这个模块化规则 是node中 使用的规则
模块js文件中 通过exports/module.exports 暴露数据/变量
在哪个js文件中 需要使用这些数据 就在哪个js文件中 引入该模块 即可 require
内置模块
自定义模块(见上一篇)
第三方模块
自定义模块 就是我们自己封装 模块js文件
- //1.编写模块js代码
- //封装函数 通过函数编写各种功能
- let fn1 = ()=>{....};
- let fn2 = ()=>{....};
- ....
- //2.将功能函数 暴露出去
- //我们可以通过module.exports将数据暴露出去
- //module.exports本身是一个 对象 我们可以通过给他添加属性和方法的方式 将数据暴露出去
- //本质上 模块js文件 暴露的 就是module.exports
- module.exports.fn1 = fn1
- module.exports.fn2 = fn2
- ...
-
- //我们也可以专门暴露某一个指定数据
- //单个暴露
- //本质上 模块js文件 暴露的 就是module.exports
- module.exports = 要暴露的数据
-
-
- //exports
- //我们还可以使用 exports 来暴露模块数据 但是 这种方式只能批量暴露 不能单个暴露
- //批量暴露 和 module.exports的暴露方式相同
- //就是将 要暴露的数据 作为属性或方法 添加给exports 即可
- exports.fn1 = fn1;
- exports.fn2 = fn2;
- ....
- //exports 本质是一个变量 let exports = module.exports
- //module.exports本质上是一个对象 因此 exports 是由 module.exports直接赋值的 因此二者会互相影响
- //因此 我们给exports添加属性 就相当于 给 module.exports 添加属性
-
-
- //exports不能像module.exports一样 单个暴露数据
- //因为 exports是一个变量 其值为 module.exports
- //let exports = module.exports
- //因此 如果想像module.exports一样单个暴露数据 就会写作:exports = 要暴露的数据
- //这样写 exports 就和 module.exports毫无关系了 因此也就暴露不了了
单个暴露——一种
module.exports = 要暴露的数据
批量暴露——两种
module.exports.属性名/方法名 = 要暴露的数据
exports.属性名/方法名 = 要暴露的数据
引入模块js中暴露的数据的方式 两种
let 变量 = require("模块名/路径")
let {变量名1,变量名2,...} = require("...")
npm:node package manager node的包管理工具
我们如果想使用第三方模块 需要单独对模块进行下载和安装 下载安装的操作 就由npm来完成
npm 已经内置到了 node安装包中 因此 我们安装node之后 就会捆绑安装npm
在cmd命令行中 我们可以通过 npm -v命令 检测我们安装的npm的版本
npm的作用
1.下载并安装第三方模块包
2.管理本地的模块包
我们下载第三方模块包 都是从 npm官网进行下载——npm
下载并安装第三方模块——npm install 模块包名 / npm i 包名 默认安装方式 安装的就是产品依赖
下载并安装指定版本的模块——npm i 包名 @版本号
下载开发依赖—— npm install 包名 --save-dev / npm i 包名 -D
下载产品依赖—— npm install 包名 --save / npm i 包名 -S
注意:当我们在项目文件夹中 第一次安装第三方模块包的时候 就会自动生成一个文件夹——node_modules 和 一个文件 package-lock.json
node_modules文件夹:用来存放 我们下载安装的模块包 以及 其所依赖的模块包
package-lock.json文件:用来 记录我们下载安装过的 模块包 的相关信息
卸载第三方模块包:npm uninstall 模块包名 / npm r 包名
全局安装:npm i 包名 -g
全局安装的模块包 在任何路径下 都可以使用
非全局安装的模块包 只能在自己的项目文件夹中使用
下面 我们以 nodemon模块 来演示
nodemon模块 是 node代码运行的热更新 工具
1.在cmd中 输入 npm i nodemon -g
2.全局安装的模块包 会保存在 C:\Users\Administrator\AppData\Roaming\npm\node_modules
3.我们需要先检查一下 环境变量 如果环境变量Path中 有上述值,我们就可以直接使用了 如果没有 需要我们自己写入
控制面板--->系统--->高级系统设置--->环境变量--->配置Administrator的Path变量
就是将C:\Users\Administrator\AppData\Roaming\npm\node_modules 添加到path中即可
注意:path中各个路径之间 要使用 分号隔开
C:\Users\Administrator\AppData\Roaming\npm;C:\Users\Administrator\AppData\Roaming\npm\node_modules
4.测试 能不能在任意文件夹 使用nodemon
nodemon的用法
在执行js文件的时候 我们可以使用nodemon命令——nodemon 文件名
这样执行的js文件 会实现 热更新、
在cmd命令行工具中 结束命令的快捷键 是 ctrl+c
全局卸载:npm r 包名 -g
卸载的是 C:\Users\Administrator\AppData\Roaming\npm\node_modules中的模块包
生成命令:npm init / npm init -y
npm init : 需要我们手动进行确认
npm init -y:自动生成 不需要确认 所有参数都是用默认值
当我们执行 npm init命令后 会要求我们确认以下信息
package name: 默认值为当前项目文件夹名
注意:不能设置为中文
version:版本号 默认 1.0.0
description:项目描述信息
entry point:入口文件 可以自行设置
test command:测试命令 可以手动配置 我们不在这里配置
git repository:git远程仓库地址
keywords:关键词
author:作者
license:协议
- //生成好的package.json 内容如下
- {
- "name": "allens-program",//项目包名
- "version": "1.0.0",//项目版本号
- "description": "this is allen's project",//项目描述信息
- "main": "01-test.js",//项目入口文件
- "dependencies": {
- "trim": "^1.0.1"//当前项目中 安装的 模块包
- },
- "devDependencies": {},//当前项目中 安装的 开发依赖 模块包
- "scripts": {//scripts属性中 存放的是 当前项目中 所有可以使用的命令 这些命令的用法为:npm run 命令名
- //但是 如果我们配置命令名为start 的命令 则可以直接写 npm start
- "test": "echo \"Error: no test specified\" && exit 1"
- },
- "author": "allen",//作者
- "license": "ISC"//协议
- }
注意:json文件的编写规则
在json文件的对象中 属性名 必须加 双引号
数组和对象 最后一个成员 后面都不能加 逗号
一个json文件中 只能写一个数据
json文件中不能写注释
单独说明
scripts:用来配置 项目中的快捷命令 我们可以通过配置快捷命令的方式来实现代码的快速开发
"scripts": {//scripts属性中 存放的是 当前项目中 所有可以使用的命令 这些命令的用法为:npm run 命令名
//但是 如果我们配置命令名为start 的命令 则可以直接写 npm start
作用:cnpm 可以在网速不好的时候 帮助我们下载第三方模块 更快捷
原因:npm下载模块 是从境外服务器上 因此 速度慢 cnpm 下载模块 是从 国内服务器(淘宝镜像上) 因此速度更快
如果网速不好的时候 简易配置cnpm
配置命令
配置cnpm:npm install -g cnpm@指定版本 --registry=https://registry.npm.taobao.org
注意:如果是nodev12版本 需要使用6版本的 cnpm 版本如果出问题 会导致报错 如果是最新稳定版node 就可以使用最新版本的cnpm
配置npm的下载源:npm config set registry https://registry.npm.taobao.org
cnpm命令 和 npm命令 完全相同 只是将npm 改为了 cnpm
内置模块包的加载机制
内置模块的优先级最高 会优先加载
具体体现
- let fs = require("fs");
- //如果我们这时 下载了一个第三方模块 也叫 fs 这里引入的fs模块 就一定是 内置的fs模块
自定义模块的加载机制
自定义模块的引入:let 变量 = require("相对路径")
使用require()加载自定义模块时,必须指定以./或../开头 如果没有指定./或../这样的路径标识符,则Node.js会把它当作内置模块或第三方模块进行加载。
//假设自定义模块 就写在当前文件夹中
let 变量名 = require("./模块名") 自定义模块不要放在node_modules中。
注意:我们在编写node代码的时候 不要动node_modules文件夹
在引入自定义模块的时候 可以省略其后缀名
原因:如果我们省略了后缀名 node会执行如下操作
1.默认给我们补充.js后缀名 进行查找 如果找到了 就引入 如果没找到
2.就继续给我们重新替换后缀名为.json 继续进行查找 如果找到了,就引入json文件 如果还没找到
就报错 cannot find module "xxx"
第三方模块加载机制
1.先在当前文件夹的node_modules文件夹中 查找第三方模块 如果找到 就直接引入并使用
2.就向上一级父文件夹中的node_modules文件夹中 查找模块 如果有 就直接引入 如果还没有 就继续向上一级父文件夹查找 一直查找到 根目录 如果有就可以引入 如果到根目录还没有
3.去环境变量中 配置过的路径中 查找其中的node_modules文件夹 如果有模块 就可以引入 如果还没有 就报错cannot find module "xxx"