npm-介绍
- npm是什么
- npm(node package manager)node 包 管理器。管理node包的工具。
-
npm作用
-
可以, 下载, 删除, 发布 包的一个工具
以前需要axios, 需要去百度找对应js文件, 现在用npm工具, 知道名字即可直接下载到工程中
-
-
包是什么?
Node.js中的第三方模块又叫做包
npm-包管理配置文件(初始化环境)
理解包管理配置的概念
npm 规定,在项目根目录中,必须提供一个叫做 package.json 的包管理配置文件,用来记录与项目有关的一些配置信息,例如:
- 项目的名称、版本号、描述等
- 项目中都用到了哪些包
- 哪些包只会在开发期间会用到
- 哪些包在开发和部署时都需要用到
package.json 配置文件的作用
多人协作的问题
-
包的体积
- 整个项目的体积是
30.4M - 第三方包的体积是
28.8M - 项目源代码的体积
1.6M
- 整个项目的体积是
-
遇到的问题
- 第三方包的体积过大,不方便团队成员之间共享项目源代码
-
解决方案
- 共享时剔除node_modules
如何记录项目中安装了哪些包
- 在项目根目录中,创建一个叫做
package.json的配置文件,即可用来记录项目中安装了哪些包。从而方便剔除node_modules目录之后,在团队成员之间共享项目的源代码 - 在项目开发中,一定要把
node_modules文件夹,添加到.gitignore忽略文件中
快速创建 package.json
npm 包管理工具提供了一个快捷命令,可以在执行命令时所处的目录中,快速创建 package.json 这个包管理配置文件
npm init
npm init -y
npm-下载axios包
-
下载第三方模块的命令如下
# 正常的下载安装 npm install 模块包名 # 简写install为i npm i 模块包名 # 一次性安装多个模块 npm i 模块包名 模块包名 模块包名 # 下载包 可以指定包的版本号 npm i 包名@版本号 # 卸载包 npm uninstall 包名 # 一次下载项目里面所有的包 npm i -
我们需要的模块包名, 具体下载命令可以从这个npmjs网站查看
-
这里我们以
axios举例, 下载axios包, 输入如下命令npm i axios
npm-删除包
使用npm命令, 删除包
-
先在应用程序文件夹, 下载一个jquery包, 查看node_modules, 是否下载成功
-
使用
npm uninstall jquery命令, 来卸载指定的包
npm-镜像地址
-
输入命令
npm config list可以查看npm的配置列表npm是从指定的registry地址下载的包
-
淘宝镜像: 淘宝在国内架设的服务器(会按时从npm官方同步所有包和版本代码, 映射到淘宝在国内的服务器上)
-
好处: 淘宝在国内服务器, 比npm默认的下载地址国外的要快
-
把npm切换成淘宝镜像的地址, 永久方式切换命令如下 (因为修改npm, 终端的文件夹可以是任意位置)
npm config set registry https://registry.npmmirror.com/ -
切换后, 运行
npm config list查看registry选项的值是否切换成功如果是第一次安装, 可能没有registry选项, 也没关系, 那npm还是使用默认地址, 只要不影响我们下包即可
npm-全局包-nodemon
-
和本地包的差异
-
全局安装的模块,不能通过 import 加载使用。
-
全局安装的模块,一般都是命令或者工具。
这个全局包, 只有一些固定名字的才是全局的, 某些是本地的(例如: axios, moment)
-
-
和本地模块下载命令差异
- 本地安装的模块,
npm i 模块包名 - 全局安装的模块,
npm i 模块包名 -g(只需要多加一个-g参数, 意思是global全局安装)
- 本地安装的模块,
-
下载
nodemon全局模块包, 命令如下此包的作用, 启动js后, 可以实时检测js文件变化, 自动更新最新代码, 不必手动重新运行
npm i nodemon -g提示: mac系统提示权限不够, 请在前面加sudo 命令 sudo npm i 模块包名 -g
-
安装是否成功, 可以在终端输入以下命令查看
nodemon -v, 如果提示版本号, 则证明全局包安装成功, 带来了nodemon命令 -
通过命令
npm root -g可以查看全局安装路径 -
使用nodemon命令来代替node命令, 去执行js文件
npm-全局模块-nrm
-
使用npm下载nrm这个全局模块包名
npm i nrm -g -
得到nrm命令, 使用
nrm -V查看nrm版本(注意, 这里V必须大写) -
使用命令
nrm ls查看全部可用的镜像地址 -
相中了哪个, 可以使用
nrm use 左侧名字进行切换, 可以切换npm 下载地址nrm use npm -
输入完回车后, 可以运行
npm config list查看下载的地址
*跨域-概念讲解
-
新建
代码/跨域/index.html, 引入axios的js文件链接 -
编写代码, 请求获取接口
axios({ url: 'http://localhost:3000/api/getBooks' }).then(res => { console.log(res); }).catch(err => { console.error(err) }) -
使用vscode+liveServer运行新建的html文件, 查看控制台, 报错
-
报错讲解
- 讲解: 在'http://localhost:3000/api/head“, 从源”http://127.0.0.1:5500'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origin'头
- 场景: 网页打开时, 所在地址栏里的url中 协议, 域名, 端口号和内嵌ajax请求的url中的, 协议, 域名, 端口号有一个对应不上, 就出现了"跨域访问"
- 原理: 因为 -> 浏览器本身存在 <浏览器同源策略>
- 概念: 同源策略,它是由Netscape提出的一个著名的浏览器安全策略。同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是"客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收。"
-
总结
- 跨域概念: 是"浏览器"对"ajax"做出的限制, 遵守浏览器同源策略, 为了保护网页内容安全
- 跨域场景(重点-以后要用口诀来判断是否跨域): 网页打开时, 所在地址栏里的url中 协议, 域名, 端口号和内嵌ajax请求的url中的, 协议, 域名, 端口号有一个对应不上, 就出现了"跨域访问"
- 跨域报错过程: 浏览器请求发送了, 服务器也响应了, 但是浏览器发现了跨域访问, 判断是否有`响应头: Access Control Allow Origin' (后端是否允许跨域访问, 如果允许, 浏览器就把数据留下, 否则抛弃掉然后报错)
跨域-解决方案
-
现代浏览器默认是支持跨域资源共享的, 但是有个前提, ajax请求的服务器, 在响应头需要设置
Access-Control-Allow-Origin -
在中
server.js代码中, 设置响应头// 支持浏览器ajax跨域访问, * 代表任意人都可以来请求 res.setHeader('Access-Control-Allow-Origin', '*') -
前端正常发送ajax请求即可, 前端无需任何修改