2021-05-16Node.js第三天

一、包管理配置文件

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

  • 注意:如果出现下面的问题
    捕获.PNG

找到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文件。


捕获.PNG

②在入口文件index.js中导入各个js文件,并将js文件里的各个方法对外共享。

捕获.PNG

5. 安装说明
捕获.PNG

六、发布包

(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默认是一个空对象。
②它可以保存客户端动态拼接的参数

捕获.PNG

// 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 文件名

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容

  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正 目录 简书好像不支持锚点、复制搜索(反正也是写给我自己看...
    kirito_song阅读 2,464评论 1 37
  • NODE.JS 什么是node.js? Node.js® is a JavaScript runtime(运行时、...
    渣一窝阅读 487评论 0 1
  • 写在前面 总是喜欢自己造轮子, 自己造的轮子又不如已有的轮子好, 然后就半途而废了. 现在想起来, 还是没有到自己...
    dinfer阅读 746评论 0 1
  • 1.什么是Node.js 1.1Node.js是一款基于“V8引擎”的javaScript运行环境 V8引擎:V8...
    秋风_ca42阅读 219评论 0 1
  • Node.js的介绍 什么是 Node.js(官方解释) Node.js 是一个基于 Chrome V8 引擎的 ...
    itzhangbao阅读 729评论 0 3