目录
1.模块化简介
(1) 传统开发项目结构 的 缺陷
-
不利于后续维护 和 二次开发(不好管理,项目结构混乱)
(2)模块化
-
按照一定的规则 将js代码功能进行封装
(3)模块化的优点
-
规范化:由于所有模块 都按照指定的规则进行封装 因此 可以做到格式上的统一
-
代码复用高
-
易维护:如果某一个模块除了问题 就只会影响到使用该模块的功能 不影响其他功能 而且 解决问题的时候 也方便定位
2.Common.js模块化规则
-
这个模块化规则 是node中 使用的规则
-
模块js文件中 通过exports/module.exports 暴露数据/变量
-
在哪个js文件中 需要使用这些数据 就在哪个js文件中 引入该模块 即可 require
-
3.模块的分类
-
内置模块
-
自定义模块(见上一篇)
-
第三方模块
4.自定义模块
-
自定义模块 就是我们自己封装 模块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("...")
-
5.第三方模块
npm和包
-
npm:node package manager node的包管理工具
-
我们如果想使用第三方模块 需要单独对模块进行下载和安装 下载安装的操作 就由npm来完成
-
npm 已经内置到了 node安装包中 因此 我们安装node之后 就会捆绑安装npm
-
在cmd命令行中 我们可以通过 npm -v命令 检测我们安装的npm的版本
-
-
npm的作用
-
1.下载并安装第三方模块包
-
2.管理本地的模块包
-
-
我们下载第三方模块包 都是从 npm官网进行下载——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 生成package.json
-
生成命令: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
-
6.配置cnpm
作用: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
7.各种模块的加载机制
-
内置模块包的加载机制
-
内置模块的优先级最高 会优先加载
-
具体体现
-
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"
-