一、包管理配置文件
1.package.json 包管理配置文件
npm 规定,在项目根目录中,必须提供一个叫做 package.json 的包管理配置文件。用来记录与项目有关的一些配置信息。例如:
- 项目的名称、版本号、描述等
- 项目中都用到了哪些包
- 哪些包只在开发期间会用到
- 那些包在开发和部署时都需要用到
2. 多人开发问题
由于包的体积过大,不方便上传到gitHub远程仓库。
今后在项目开发中,一定要把 node_modules 文件夹,添加到 .gitignore 忽略文件中。
3. 快速创建 package.json
npm init -y
① 上述命令只能在英文的目录下成功运行!所以,项目文件夹的名称一定要使用英文命名,不要使用中文,不能出现空格。
② 运行 npm install 命令安装包的时候,npm 包管理工具会自动把包的名称和版本号,记录到 package.json 中。不要手动修改。
4. 一次性安装所有依赖包
如果项目还没有node_modules文件夹,必须先下载项目中所有要用到的包。
系统会根据package.json文件中的dependencies节点下载所有包。
npm install
5. 删除包
npm uninstall 完整包名
6. dependencies 节点
① package.json文件中有一个dependencies节点属性,专门用来记录项目中使用npm install命令安装了哪些包。
② 安装的包的信息会默认记录到这个节点中。
③ 这个节点中记录的包在开发时和上线后都会用到。
7. devDependencies 节点
① 如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到 devDependencies 节点中。
② 下载包时用下面的命令,系统机会将包的信息记录到devDependencies 节点中。
npm install 完整包名 --save-dev
或者简写成:npm install 完整包名 -D
总结
①项目首次安装 包 时会自动添加node_module文件夹和package.json包管理配置文件。
②一个用来存放包,一个用来记录包。
③node_module文件夹太大,多人开发时不要上传到云端,而是添加到忽略文件中。
④项目根目录中必须有package.json文件,系统会根据这个文件下载所有依赖的包。
⑤多人开发时,拿到没有node_module的项目,首先将项目中所有依赖的包下载到项目中。
二、解决下包慢的问题
1. 切换npm的下包 镜像源(服务器地址)
查看当前的下包镜像源:
npm config get registry
设置为淘宝镜像:
npm config set registry https://registry.npm.taobao.org
2. 安装与使用nrm工具 切换镜像源
安装nrm工具:
npm install nrm -g
查看可用镜像列表:
nrm ls
设置需要的镜像源:
nrm use taobao
-
注意:如果出现下面的问题
找到cli.js文件,将第17行代码替换为:
const NRMRC = path.join(process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'], '.nrmrc');
3.nvm的安装与使用:
https://juejin.cn/post/7011398696999288839
如果有依赖版本与node不兼容,可以尝试:npm update , npm rebuild xxx依赖
三、 包的分类
1. 项目包
(1)那些被安装到项目的 node_modules 目录中的包,都是项目包。
(2)项目包又分为两类,分别是:
- 开发依赖包(被记录到 devDependencies 节点中的包,只在开发期间会用到)
- 核心依赖包(被记录到 dependencies 节点中的包,在开发期间和项目上线之后都会用到)
2. 全局包
(1)在执行 npm install 命令时,如果提供了-g 参数,则会把包安装为全局包。
(2)全局包会被安装到 C:\Users\用户目录\AppData\Roaming\npm\node_modules 目录下。
安装全局包:npm i 包名 -g
卸载全局包:npm uninstall 包名 -g
注意:
① 只有工具性质的包,才有全局安装的必要性。因为它们提供了好用的终端命令。
② 判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明。
四、 安装与使用 i5ting_toc工具
i5ting_toc 是一个可以把 md 文档转为 html 页面的小工具。
(1)全局安装i5ting_toc:
npm install i5ting_toc -g
(2)将md文件转换成html文件:
i5ting_toc -f 要转换的md文件路径 -o
注意:在终端里,从C盘目录切换到E盘目录,直接 " E:"。
五、开发自己的包
1. 规范的包结构
① 包必须以单独的目录而存在。
② 包的顶级目录下要必须包含 package.json 这个包管理配置文件。
③ package.json 中必须包含 name,version,main 这三个属性,分别代表包的名字、版本号、包的入口。
2. 初始化包的基本结构
① 新建 lisaifei-tools 文件夹,作为包的根目录。( 全英文,不能有空格 )
② 在lisaifei-tools 文件夹中,新建如下三个文件:
- package.json (包管理配置文件)
- index.js (包的入口文件)
- README.md (包的说明文档)
3. 初始化 package.json
{
"name": "lisaifei-tools",
"version": "1.0.0",
"main": "index.js",
"description": "提供了格式化时间、HTMLEscape等功能",
"keywords": ["lisaifei","dateFormate","escape"],
"license": "ISC"
}
注意:package.json文件里的name属性值才是包真正的名字,与文件夹的名字无关。
4. 各个功能代码的编写
①在根目录下新建src文件夹,在src文件夹内存放实现具体功能的js文件。
②在入口文件index.js中导入各个js文件,并将js文件里的各个方法对外共享。
5. 安装说明
六、发布包
(1)登录https://www.npmjs.com/网站,注册账号。
(2)在终端里登录账号。
首先,把下载包的服务器地址更改为npm官方地址。再登录:
npm login
(3)发布包。
首先,把终端目录切换到包的根目录。再发布:
npm publish
(4)删除包
npm unpublish 包名 --force
注意:
① npm unpublish 命令只能删除 72 小时以内发布的包
② npm unpublish 删除的包,在 24 小时内不允许重复发布
七、模块的加载机制
1. 优先从缓存中加载
模块在第一次加载后会被缓存。 这也意味着多次调用 require() 不会导致模块的代码被执行多次。
注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。
2. 内置模块的加载机制
内置模块是由 Node.js 官方提供的模块,内置模块的加载优先级最高。
例如,require('fs') 始终返回内置的 fs 模块,即使在 node_modules 目录下有名字相同的包也叫做 fs
3. 自定义模块的加载机制
使用 require() 加载自定义模块时,必须指定以 ./ 或 ../ 开头的相对路径。否则,node 会把它当作内置模块或第三方模块进行加载。
在使用 require() 导入自定义模块时,如果省略了文件的扩展名,则 Node.js 会按顺序分别尝试加载以下的文件:
① 按照确切的文件名进行加载
② 补全 .js 扩展名进行加载
③ 补全 .json 扩展名进行加载
④ 补全 .node 扩展名进行加载
⑤ 加载失败,终端报错
4. 第三方模块的加载机制
如果传递给 require() 的模块标识符不是一个内置模块,也没有以 ‘./’ 或 ‘../’ 开头,则 Node.js 会从当前文件的父目录开始,尝试从 /node_modules 文件夹中加载第三方模块。
如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。
例如,假设在 'C:\Users\itheima\project\foo.js' 文件里调用了 require('tools'),则 Node.js 会按以下顺序查找:
① C:\Users\itheima\project\node_modules\tools
② C:\Users\itheima\node_modules\tools
③ C:\Users\node_modules\tools
④ C:\node_modules\tools
5. 目录作为模块被导入加载
当把目录作为模块标识符,传递给 require() 进行加载的时候,有三种加载方式:
① 在被加载的目录下查找一个叫做 package.json 的文件,并寻找main 属性,作为 require() 加载的入口
② 如果目录里没有 package.json 文件,或者 main 入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js 文件。
③ 如果以上两步都失败了,则 Node.js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module 'xxx‘
八、express包
1. 什么是express包
(1)express就是npm 上的第三方包,作用和 Node.js 内置的 http 模块类似,是专门用来创建Web 服务器的。(或API接口服务器)
(2)http 内置模块与 Express 的关系类似于浏览器中 Web API 和 jQuery ,后者是基于前者进一步封装出来的。
Express 的中文官网: http://www.expressjs.com.cn/
2. express包的基本使用
(1)在项目目录的终端下载express包
npm i express@版本号
(2) 创建基本的 Web 服务器
const express = require(' express ' ) //导入express包
const app = express( ) //创建服务器,app是服务器名称
app.listen( 端口号,启动成功后的回调函数 ) //调用listen方法启动服务器
(3)监听客户端的get( )请求和post( )请求
app.get( ' 客户端输入的URL地址 ' ,(req,res)=>{ res.send( "请求成功" ) } )
①回调函数中req参数是请求对象,包含了与请求相关的属性和方法。
②回调函数中res参数是响应对象,包含了与响应相关的属性和方法。
③回调函数中res.send( )方法可以把JSON对象或是文本字符串响应给客户端。
(4)获取 URL 中携带的查询参数
res.send( req.query )
① req.query 对象默认是一个空对象。
②它可以保存客户端通过查询字符串的形式发送到服务器的参数。?name=吴磊&age=22
(5)获取 URL 中的动态参数
app.get('/user/:id/:name', (req, res) => {
res.send(req.params);
});
①req.params默认是一个空对象。
②它可以保存客户端动态拼接的参数。
// 1.导入express模块
const express = require('express');
// 2.创建web服务器
const app = express();
// 4.监听用户发起的get请求和post请求
app.get('/user', (req, res) => {
// 使用express的res.send方法向客户端响应JSON对象
res.send({ name: '吴磊', age: '21' });
});
app.post('/user', (req, res) => {
// 使用express的res.send方法向客户端响应文本
res.send('请求成功!');
});
// 3.调用app.listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80, () => {
console.log('express server running at http://127.0.0.1');
});
// 5.获取URL中携带的查询参数
app.get('/', (req, res) => {
// express中的req.query默认是一个空对象。可以访问到客户端发送的 ?name=吴磊&age=20 查询字符串
res.send(req.query);
});
// 6.获取URL中的动态参数
app.get('/user/:id/:name', (req, res) => {
// express中的req.params默认是一个空对象。可以存储客户端动态拼接的参数
res.send(req.params);
});
九、 托管静态资源
express.static()方法可以创建一个静态资源服务器。
app.use( ' 前缀名 ',express.static(' 文件夹名 '))
①上面代码可以将指定文件夹里的内容对外开放访问。
②前缀名一般定义为文件夹名,这样客户端输入URL地址时必须添加前缀名才能访问。
③如果不加自定义的前缀名,客户端输入URL地址时不能写被托管的这个文件夹名。
④如果要托管多个静态资源目录,就多次调用express.static() 函数。
⑤访问静态资源文件时,express.static() 函数会根据目录的添加顺序查找所需的文件。
十、安装nodemon插件
npm install -g nodemon
nodemon能够监听项目文件的变动,当代码被修改后,nodemon会自动帮我们重启项目,极大方便了开发和调试。
启动项目时,将node 命令替换为nodemon 命令。
nodemon 文件名