1. node.js模块化开发
1.1 JavaScript开发弊端
JavaScript在使用时存在两大问题,文件依赖和命名冲突
文件之间的引用存在先后关系
后引入的js文件定义重名的变量会覆盖
1.2 软件中的模块化开发
一个功能就是一个模块,多个模块可以组成完整应用,抽离一个模块不会影响其他功能的运行
1.3 Node.js 中模块化开发规范
- Node.js规定一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下外部无法得到
- 模块内部可以使用exports对象进行成员导出,使用require方法导入其他模块
1.4 模块成员的导出
1.5 模块成员的导入
1.6 模块成员的导出的另一种方式
exports是module.exports的别名(地址引用关系),导出对象最终以module.exports为准
1.7 导出的两种方式的区别
2. 系统模块
2.1什么是系统模块为系统模块
Node运行环境提供的API,因为这些API都是以模块化的方式进行开发的,所以我们又称Node运行环境提供的API
2.2 系统模块fs文件操作
- file文件,s:system 系统,文件操作系统
const fs = require(‘fs’);
读取文件内容
fs.readFile(‘文件路径、文件名称’[,‘文件编码’], callback);
// 通过模块进行引用
const fs = require('fs');
fs.readFile('../try/reset.css', 'utf-8', (err, doc) => {
if (err == null) {
//如果没错,err为null,那么输出文档内容
console.log(doc);
}
})
写入文件操作
fs.writeFile(‘文件路径、文件名称’, ‘数据’, callback);
// 通过模块进行引用
const fs = require('fs');
const content = '<h3>这是我写入的</h3>';
fs.writeFile('./1.txt', content, (err, doc) => {
if (err != null) {
//如果写入错误那么就输出错误
console.log(err);
}
})
fs.readFile('./1.txt', 'utf-8', (err, doc) => {
if (err == null) {
//如果没错,err为null,那么输出文档内容
console.log(doc);
}
})
2.3 系统模块path路径操作
为什么要进行路径拼接
- 不同的操作系统的路径分隔符不统一
- /public/uploads/avatar
- windows上时/ 和\
- Linux上时 /
路径拼接语法
// 导入path模块
const path = require('path');
// 路径拼接
const finalPath = path.join('public', 'upload', 'avatar');
// 输出
console.log(finalPath);
3.第三方模块
3.1 什么是第三方模块
别人写好的,具有特定功能的,我们能直接使用的模块即第三方模块,由于第三方模块通常是由多个文件组成并且被放置在一个文件夹中,所有又名包
第三方模块有两种存在形式:
- 以js文件的形式存在,提供实现项目具体功能的API接口
- 以命令行工具存在,辅助项目开发
3.2 获取第三方模块
npm(node package manager):node的第三方模块管理工具
- 下载:npm install
- 卸载:npm uninstall package 模块名称
全局安装与本地暗转
- 命令行工具:全局安装
- 库文件:本地安装
3.3 第三方模块 nodemon
nodemon是一个命令行工具,用以辅助项目开发。
在Node.js 中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐。
使用步骤
-
使用npm install nodemon -g 下载它
-
在命令行工具中用nodemon命令代替node命令执行文件
-
使用方法:nodemon app.js(开始监控)
-
停止监控: ctrl + c
-
使用帮助:nodemon -h
3.4 第三方模块 nrm
- npm install nrm -g 安装
- nrm ls 查看可以下载的网址(带*的是当前使用的网址)
- nrm use taobao(更换到国内的网站)
下载慢的问题:
切换下载源:npm config set registry https://registry.npm.taobao.org
再执行npm install -g nrm
3.5 第三方模块 Gulp
https://blog.csdn.net/weixin_45773503/article/details/107678139
4 package.json文件
4.1 关于node_modules文件夹的问题
- 文件夹以及文件过多过碎,当我们将整体项目拷贝给别人的时候,传输速度会很慢
- 复杂的模块依赖关系需要被记录,确保模块的版本和当前保持一致,否则会导致当前项目运行报错
4.2 package.json
项目的描述文件,记录了当前项目的信息。例如,项目的名称,版本,作者。GitHub地址,当前项目依赖了哪些第三方模块等。
使用npm init -y命令生成
{
"name": "Gulp", //名称
"version": "1.0.0", //版本
"description": "", //描述
"main": "gulpfile.js", //主入口
"dependencies": {
// 项目依赖
"gulp": "^4.0.2",
"gulp-babel": "^8.0.0",
"gulp-csso": "^4.0.1",
"gulp-cli": "^2.3.0",
"gulp-uglify": "^3.0.2",
"gulp-file-include": "^2.2.2",
"gulp-less": "^4.0.1",
"gulp-htmlmin": "^5.0.1"
},
"devDependencies": {
}, // 开发依赖
"scripts": {
// 别名
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [], //用关键字描述
"author": "", //作者
"license": "ISC" //遵循的协议
}
项目依赖
在项目开发的阶段和线上运营阶段,都要依赖的第三方包,成为项目依赖
使用 npm install 包名命令下载的文件会被默认添加到 package.json 文件中的dependencies字段中
{
"dependencies": {
"jquery": "^3.5.1"
}
}
开发依赖
- 在项目的开发阶段需要依赖,线上运营阶段不需要依赖的第三方包,称为开发依赖
- 使用 npm install 包名–save-dev命令将包添加到package.json文件中的devDependencies字段中的包也下载下来
在安装时添加–save-dev
{
"devDependencies": {
"gulp": "^3.5.1"
}
}
npm install (安装开发依赖,和项目依赖,所有的(devDependencies,dependencies))
npm install --production(安装项目依赖,dependencies中的)
别名使用
{
"scripts": {
// 别名
"test": "echo \"Error: no test specified\" && exit 1"
"build": "nodemon app.js" //将后面的命令叫做 “build”
},
}
在执行的时候只需要用 npm run build就可以直接执行 nodemon app.js 这个命令
4.5 package-lock.json文件的作用
- 锁定包的版本,确保再次下载时不会因为包版本不同而产生问题
- 加快下载速度,因为该文件中已经记录了项目所依赖第三方包的树状结构和包的下载地址,重新安装时只需要下载即可,不需要做额外的工作
5. Node.js中模块的加载机制
5.1 模块路径查找
require('./find.js');
require('./find');
- 如果require方法根据模块路径查找模块,如果是完整路径,直接引入模块
- 如果模块后缀省略,先找同名 js文件 在找同名 js文件夹
- 如果找到了同名文件夹,找文件夹中的 index.js
- 如果文件夹中 没有index.js 就会去当前文件夹中的package.json文件中查找main选项中的入口文件
- 如果找指定的入口文件不存在或者没有指定入口文件就会报错,模块没有被找到
如上图所示执行 modulefindRules 下的 require.js 会找到 main.js 并执行
5.2 当模块没有路径且没有后缀时
require('find');
- node.js 会假设它是系统模块
- node.js 会去 node_modules 文件夹中
- 首先看是否有该名字的 JS 文件
- 再看是否有该名字的文件夹
- 如果是文件夹看里面是否有 index.js
- 如果没有 index.js 查看文件夹中的 package.json 中的 main 选项确定模块入口文件
- 否则找不到就报错
6. Gulp
https://blog.csdn.net/weixin_45773503/article/details/107678139
7. web服务器
https://blog.csdn.net/weixin_45773503/article/details/107743867
8. node.js 异步编程
https://blog.csdn.net/weixin_45773503/article/details/107877597
9. MongoDB
https://blog.csdn.net/weixin_45773503/article/details/107734303